From c77311c90aa045796b3adcd021e69901022f4649 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 16:51:56 +0200 Subject: Adding upstream version 8.2. Signed-off-by: Daniel Baumann --- CHANGELOG | 1450 ++++ CHANGES | 1941 +++++ COPYING | 674 ++ INSTALL | 310 + MANIFEST | 171 + Makefile.in | 610 ++ NEWS | 485 ++ README | 196 + USAGE | 37 + aclocal.m4 | 2267 +++++ ansi_stdlib.h | 54 + bind.c | 3082 +++++++ callback.c | 378 + chardefs.h | 165 + colors.c | 320 + colors.h | 126 + compat.c | 106 + complete.c | 2992 +++++++ config.h.in | 311 + configure | 9219 ++++++++++++++++++++ configure.ac | 345 + display.c | 3583 ++++++++ doc/Makefile.in | 272 + doc/fdl.texi | 506 ++ doc/history.0 | 505 ++ doc/history.3 | 687 ++ doc/history.dvi | Bin 0 -> 72280 bytes doc/history.html | 1751 ++++ doc/history.info | 1426 ++++ doc/history.pdf | Bin 0 -> 204504 bytes doc/history.ps | 6666 +++++++++++++++ doc/history.texi | 85 + doc/history_3.ps | 896 ++ doc/hstech.texi | 602 ++ doc/hsuser.texi | 533 ++ doc/readline.0 | 1175 +++ doc/readline.3 | 1597 ++++ doc/readline.dvi | Bin 0 -> 333112 bytes doc/readline.html | 6286 ++++++++++++++ doc/readline.info | 5320 ++++++++++++ doc/readline.pdf | Bin 0 -> 406480 bytes doc/readline.ps | 12656 ++++++++++++++++++++++++++++ doc/readline_3.ps | 1782 ++++ doc/rlman.texi | 84 + doc/rltech.texi | 2815 +++++++ doc/rluser.texi | 2488 ++++++ doc/rluserman.dvi | Bin 0 -> 118796 bytes doc/rluserman.html | 2529 ++++++ doc/rluserman.info | 2087 +++++ doc/rluserman.pdf | Bin 0 -> 237019 bytes doc/rluserman.ps | 7574 +++++++++++++++++ doc/rluserman.texi | 70 + doc/texi2dvi | 1996 +++++ doc/texi2html | 5428 ++++++++++++ doc/texinfo.tex | 11045 ++++++++++++++++++++++++ doc/version.texi | 11 + emacs_keymap.c | 872 ++ examples/Inputrc | 81 + examples/Makefile.in | 193 + examples/autoconf/BASH_CHECK_LIB_TERMCAP | 41 + examples/autoconf/RL_LIB_READLINE_VERSION | 119 + examples/autoconf/wi_LIB_READLINE | 76 + examples/excallback.c | 200 + examples/fileman.c | 506 ++ examples/hist_erasedups.c | 121 + examples/hist_purgecmd.c | 151 + examples/histexamp.c | 128 + examples/manexamp.c | 111 + examples/readlinebuf.h | 139 + examples/rl-callbacktest.c | 115 + examples/rl-fgets.c | 374 + examples/rl-test-timeout | 6 + examples/rl-timeout.c | 245 + examples/rl.c | 166 + examples/rlbasic.c | 37 + examples/rlcat.c | 187 + examples/rlevent.c | 181 + examples/rlfe/ChangeLog | 37 + examples/rlfe/Makefile.in | 184 + examples/rlfe/README | 78 + examples/rlfe/config.h.in | 383 + examples/rlfe/configure | 5637 +++++++++++++ examples/rlfe/configure.in | 442 + examples/rlfe/extern.h | 40 + examples/rlfe/os.h | 531 ++ examples/rlfe/pty.c | 388 + examples/rlfe/rlfe.c | 792 ++ examples/rlfe/screen.h | 2 + examples/rlkeymaps.c | 61 + examples/rlptytest.c | 354 + examples/rltest.c | 101 + examples/rlversion.c | 49 + examples/rlwrap-0.30.tar.gz | Bin 0 -> 184033 bytes funmap.c | 273 + histexpand.c | 1718 ++++ histfile.c | 833 ++ histlib.h | 92 + history.c | 614 ++ history.h | 291 + history.pc.in | 11 + histsearch.c | 287 + input.c | 1000 +++ isearch.c | 893 ++ keymaps.c | 174 + keymaps.h | 100 + kill.c | 900 ++ m4/codeset.m4 | 24 + macro.c | 334 + mbutil.c | 524 ++ misc.c | 781 ++ nls.c | 344 + parens.c | 184 + parse-colors.c | 440 + parse-colors.h | 46 + patchlevel | 3 + posixdir.h | 71 + posixjmp.h | 46 + posixselect.h | 47 + posixstat.h | 162 + posixtime.h | 84 + readline.c | 1575 ++++ readline.h | 986 +++ readline.pc.in | 12 + rlconf.h | 79 + rldefs.h | 166 + rlmbutil.h | 225 + rlprivate.h | 633 ++ rlshell.h | 33 + rlstdc.h | 57 + rltty.c | 995 +++ rltty.h | 80 + rltypedefs.h | 100 + rlwinsize.h | 58 + savestring.c | 40 + search.c | 707 ++ shell.c | 214 + shlib/Makefile.in | 501 ++ signals.c | 754 ++ support/config.guess | 1754 ++++ support/config.rpath | 684 ++ support/config.sub | 1890 +++++ support/install.sh | 247 + support/mkdirs | 47 + support/mkdist | 140 + support/mkinstalldirs | 111 + support/shlib-install | 174 + support/shobj-conf | 553 ++ support/wcwidth.c | 313 + tcap.h | 60 + terminal.c | 939 +++ text.c | 1888 +++++ tilde.c | 493 ++ tilde.h | 68 + undo.c | 365 + util.c | 577 ++ vi_keymap.c | 875 ++ vi_mode.c | 2415 ++++++ xfree.c | 49 + xmalloc.c | 75 + xmalloc.h | 45 + 160 files changed, 152075 insertions(+) create mode 100644 CHANGELOG create mode 100644 CHANGES create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 MANIFEST create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 USAGE create mode 100644 aclocal.m4 create mode 100644 ansi_stdlib.h create mode 100644 bind.c create mode 100644 callback.c create mode 100644 chardefs.h create mode 100644 colors.c create mode 100644 colors.h create mode 100644 compat.c create mode 100644 complete.c create mode 100644 config.h.in create mode 100755 configure create mode 100644 configure.ac create mode 100644 display.c create mode 100644 doc/Makefile.in create mode 100644 doc/fdl.texi create mode 100644 doc/history.0 create mode 100644 doc/history.3 create mode 100644 doc/history.dvi create mode 100644 doc/history.html create mode 100644 doc/history.info create mode 100644 doc/history.pdf create mode 100644 doc/history.ps create mode 100644 doc/history.texi create mode 100644 doc/history_3.ps create mode 100644 doc/hstech.texi create mode 100644 doc/hsuser.texi create mode 100644 doc/readline.0 create mode 100644 doc/readline.3 create mode 100644 doc/readline.dvi create mode 100644 doc/readline.html create mode 100644 doc/readline.info create mode 100644 doc/readline.pdf create mode 100644 doc/readline.ps create mode 100644 doc/readline_3.ps create mode 100644 doc/rlman.texi create mode 100644 doc/rltech.texi create mode 100644 doc/rluser.texi create mode 100644 doc/rluserman.dvi create mode 100644 doc/rluserman.html create mode 100644 doc/rluserman.info create mode 100644 doc/rluserman.pdf create mode 100644 doc/rluserman.ps create mode 100644 doc/rluserman.texi create mode 100644 doc/texi2dvi create mode 100644 doc/texi2html create mode 100644 doc/texinfo.tex create mode 100644 doc/version.texi create mode 100644 emacs_keymap.c create mode 100644 examples/Inputrc create mode 100644 examples/Makefile.in create mode 100644 examples/autoconf/BASH_CHECK_LIB_TERMCAP create mode 100644 examples/autoconf/RL_LIB_READLINE_VERSION create mode 100644 examples/autoconf/wi_LIB_READLINE create mode 100644 examples/excallback.c create mode 100644 examples/fileman.c create mode 100644 examples/hist_erasedups.c create mode 100644 examples/hist_purgecmd.c create mode 100644 examples/histexamp.c create mode 100644 examples/manexamp.c create mode 100644 examples/readlinebuf.h create mode 100644 examples/rl-callbacktest.c create mode 100644 examples/rl-fgets.c create mode 100644 examples/rl-test-timeout create mode 100644 examples/rl-timeout.c create mode 100644 examples/rl.c create mode 100644 examples/rlbasic.c create mode 100644 examples/rlcat.c create mode 100644 examples/rlevent.c create mode 100644 examples/rlfe/ChangeLog create mode 100644 examples/rlfe/Makefile.in create mode 100644 examples/rlfe/README create mode 100644 examples/rlfe/config.h.in create mode 100755 examples/rlfe/configure create mode 100644 examples/rlfe/configure.in create mode 100644 examples/rlfe/extern.h create mode 100644 examples/rlfe/os.h create mode 100644 examples/rlfe/pty.c create mode 100644 examples/rlfe/rlfe.c create mode 100644 examples/rlfe/screen.h create mode 100644 examples/rlkeymaps.c create mode 100644 examples/rlptytest.c create mode 100644 examples/rltest.c create mode 100644 examples/rlversion.c create mode 100644 examples/rlwrap-0.30.tar.gz create mode 100644 funmap.c create mode 100644 histexpand.c create mode 100644 histfile.c create mode 100644 histlib.h create mode 100644 history.c create mode 100644 history.h create mode 100644 history.pc.in create mode 100644 histsearch.c create mode 100644 input.c create mode 100644 isearch.c create mode 100644 keymaps.c create mode 100644 keymaps.h create mode 100644 kill.c create mode 100644 m4/codeset.m4 create mode 100644 macro.c create mode 100644 mbutil.c create mode 100644 misc.c create mode 100644 nls.c create mode 100644 parens.c create mode 100644 parse-colors.c create mode 100644 parse-colors.h create mode 100644 patchlevel create mode 100644 posixdir.h create mode 100644 posixjmp.h create mode 100644 posixselect.h create mode 100644 posixstat.h create mode 100644 posixtime.h create mode 100644 readline.c create mode 100644 readline.h create mode 100644 readline.pc.in create mode 100644 rlconf.h create mode 100644 rldefs.h create mode 100644 rlmbutil.h create mode 100644 rlprivate.h create mode 100644 rlshell.h create mode 100644 rlstdc.h create mode 100644 rltty.c create mode 100644 rltty.h create mode 100644 rltypedefs.h create mode 100644 rlwinsize.h create mode 100644 savestring.c create mode 100644 search.c create mode 100644 shell.c create mode 100644 shlib/Makefile.in create mode 100644 signals.c create mode 100644 support/config.guess create mode 100644 support/config.rpath create mode 100644 support/config.sub create mode 100644 support/install.sh create mode 100644 support/mkdirs create mode 100644 support/mkdist create mode 100644 support/mkinstalldirs create mode 100644 support/shlib-install create mode 100644 support/shobj-conf create mode 100644 support/wcwidth.c create mode 100644 tcap.h create mode 100644 terminal.c create mode 100644 text.c create mode 100644 tilde.c create mode 100644 tilde.h create mode 100644 undo.c create mode 100644 util.c create mode 100644 vi_keymap.c create mode 100644 vi_mode.c create mode 100644 xfree.c create mode 100644 xmalloc.c create mode 100644 xmalloc.h diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..b2fcb53 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,1450 @@ +[Readline-specific changelog. Descriptions of changes to the source are + found in the bash changelog.] + + 6/9 + --- +Makefile.in + - quote value of ${INSTALL_DATA} when passing it to makes in + subdirectories + + 7/1 + --- +Makefile.in + - don't pass INSTALL_DATA to a make in the `doc' subdirectory; let + autoconf set the value itself in the Makefile + - removed a stray `-' before $(RANLIB) in the `install' recipe + +doc/Makefile.in + - add a VPATH assignment so the documentation is not remade if it's + already up-to-date in the distribution + +configure.in + - call AC_SUBST(LOCAL_LDFLAGS), since Makefile.in contains + @LOCAL_LDFLAGS@ + + 7/9 + --- + +config.h.in + - add define lines for STRUCT_WINSIZE_IN_SYS_IOCTL and + STRUCT_WINSIZE_IN_TERMIOS + +configure.in + - call BASH_STRUCT_WINSIZE to look for the definition of + `struct winsize' + + 7/17 + ---- +configure.in + - call AC_MINIX + +config.h.in + - add define line for AC_MINIX + + 7/18 + ---- +Makefile.in + - add `install-shared' and `uninstall-shared' targets + + 8/4 + --- +Makefile.in + - install and uninstall libhistory.a in the `install' and + `uninstall' targets + + 9/4 + --- +configure.in + - bumped LIBVERSION up to 2.1.1, indicating that this is patch + level 1 to release 2.1 + + + 9/16 + ---- +Makefile.in + - `make distclean' now descends into the `examples' subdir + +doc/Makefile.in + - the `distclean' and `maintainer-clean' targets should remove + Makefile + +examples/Makefile.in + - added the various clean targets + + 4/2 + --- +configure.in + - bumped LIBVERSION up to 2.2 + + 4/18 + ---- +[readline-2.2 released] + + 4/20 + ---- +Makefile.in + - make `libhistory.a' a dependency of `install' + - fixed a typo in the recipe for `install' that copied libreadline.a + to libhistory.old right after installing it + + 4/27 + ---- +doc/Makefile.in + - install {readline,history}.info out of the source directory if + they are not found in the current (build) directory -- only an + issue if the libraries are built in a different directory than + the source directory + + 5/1 + --- +support/shobj-conf + - script from the bash distribution to do shared object and library + configuration + +shlib/Makefile.in + - new directory and makefile to handle building shared versions of + libreadline and libhistory, controlled by support/shobj-conf + + 5/7 + --- +doc/Makefile.in + - set SHELL to /bin/sh, rather than relying on make to be correct + + 5/14 + ---- +savestring.c + - new file, moved from shell.c, for backwards compatibility + +Makefile.in, shlib/Makefile.in + - make sure savestring.c is compiled and added to libreadline and + libhistory + +[THERE ARE NO MORE #ifdef SHELL LINES IN THE C SOURCE FILES.] + + 5/15 + ---- +README + - updated description of shared library creation for the new scheme + +[THERE ARE NO MORE #ifdef SHELL LINES IN ANY OF THE SOURCE FILES.] + +Makefile.in + - bumped SHLIB_MAJOR up to 4 since we've augmented the library + API + - rlconf.h is now one of the installed headers, so applications can + find out whether things like vi-mode are available in the installed + libreadline + + 5/20 + ---- +configure.in + - changed RL_LIBRARY_VERSION to 4.0 to match the version of the + installed shared libraries + + 6/5 + --- +rlstdc.h + - new file + +Makefile.in + - rlstdc.h is now one of the installed headers + + 8/3 + --- +shlib/Makefile.in + - made the suffix rule that creates xx.so from xx.c write the + compiler output to `a.o', which is then mv'd to xx.so, because + some compilers (Sun WSpro 4.2, for example) don't allow any + suffixes other than `.o' for `cc -c' (not even `a.out') + + 9/15 + ---- + +Makefile.in + - AR and ARFLAGS are now substituted by configure, used in recipes + that build the libraries + +configure.in + - use AC_CHECK_PROG to check for ar + - set ARFLAGS if it has not already been set in the environment + + 10/5 + ---- +Makefile.in + - removed savestring.o from object file list + + 10/28 + ----- +shlib/Makefile.in + - don't use a fixed filename in the .c.so suffix rule to avoid + problems with parallel makes + + 12/21 + ----- +support/shlib-install + - new script to install shared readline and history libraries + +shlib/Makefile.in + - changed to call shlib-install for install and uninstall targets + +[readline-4.0-beta1 frozen] + + 12/22 + ----- +configure.in + - call AC_SUBST for SHOBJ_XLDFLAGS and SHLIB_LIBS + +shlib/Makefile.in + - SHOBJ_XLDFLAGS and SHLIB_LIBS are now substituted by configure + - add $(SHLIB_LIBS) at end of command line that builds the shared + libraries (currently needed only by AIX 4.2) + + 12/31 + ----- +MANIFEST, MANIFEST.doc + - the TOC html files are no longer generated and no longer part of + the distribution + + 2/18/1999 + --------- +configure.in + - set MAKE_SHELL to /bin/sh and substitute into the Makefiles + +Makefile.in,{doc,examples,shlib}/Makefile.in + - set SHELL from @MAKE_SHELL@ + +[readline-4.0 released] + + 3/11 + ---- +doc/Makefile.in + - removed references to HTMLTOC, since separate HTML table-of-contents + files are no longer created + +examples/Makefile.in + - remove `*.exe' in clean target for MS-DOS + +Makefile.in + - make `readline' target depend on ./libreadline.a + - configure now substitutes TERMCAP_LIB into Makefile.in + - use ${TERMCAP_LIB} instead of -ltermcap in recipe for `readline' + - clean target now removes readline and readline.exe in case they + get built + +configure.in + - use `pwd.exe' to set BUILD_DIR on MS-DOS DJGPP + + 3/15 + ---- +support/shlib-install + - Irix 5.x and Irix 6.x should install shared libraries like Solaris 2 + - changes for installing on hp-ux 1[01].x + + 3/23 + ---- +configure.in + - make sure that the $CC argument to shobj-conf is quoted + + 4/8 + --- + +xmalloc.h, rlprivate.h, rlshell.h + - new files + +Makefile.in,shlib/Makefile.in + - add dependencies on xmalloc.h, rlshell.h + - add xmalloc.h, rlprivate.h, rlshell.h to list of header files + +MANIFEST + - add xmalloc.h, rlprivate.h, rlshell.h + + 4/9 + --- +Makefile.in,shlib/Makefile.in + - add dependencies on rlprivate.h + + 4/13 + ---- +doc/Makefile.in + - add variable, PSDVI, which is the desired resolution of the + generated postscript files. Set to 300 because I don't have + any 600-dpi printers + - set LANGUAGE= before calling makeinfo, so messages are in English + - add rluserman.{info,dvi,ps,html} to appropriate variables + - add rules to create rluserman.{info,dvi,ps,html} + - install and uninstall rluserman.info, but don't update the directory + file in $(infodir) yet + +MANIFEST + - add doc/rluserman.{texinfo,info,dvi,ps,html} + + 4/30 + ---- +configure.in + - updated library version to 4.1 + + 5/3 + --- +configure.in + - SHLIB_MAJOR and SHLIB_MINOR shared library version numbers are + constructed from $LIBRARY_VERSION and substituted into Makefiles + + 5/5 + --- +support/shlib-install + - OSF/1 installs shared libraries like Solaris + +Makefile.in + - broke the header file install and uninstall into two new targets: + install-headers and uninstall-headers + - install and uninstall depend on install-headers and uninstall-headers + respectively + - changed install-shared and uninstall-shared targets to depend on + install-headers and uninstall-headers, respectively, so users may + choose to install only the shared libraries. I'm not sure about + the uninstall one yet -- maybe it should check whether or not + the static libraries are installed and not remove the header files + if they are + + 9/3 + --- +configure.in, config.h.in + - added test for memmove (for later use) + - changed version to 4.1-beta1 + + 9/13 + ---- +examples/rlfe.c + - Per Bothner's `rlfe' readline front-end program + +examples/Makefile.in + - added rules to build rlfe + + 9/21 + ---- +support/shlib-install + - changes to handle FreeBSD-3.x elf or a.out shared libraries, which + have different semantics and need different naming conventions + + 1/24/2000 + --------- +doc/Makefile.in + - remove *.bt and *.bts on `make clean' + + 2/4 + --- + + +configure.in + - changed LIBVERSION to 4.1-beta5 + + 3/17/2000 + --------- +[readline-4.1 released] + + 3/23 + ---- +Makefile.in + - remove the `-t' argument to ranlib in the install recipe; some + ranlibs don't have it and attempt to create a file named `-t' + + 3/27 + ---- +support/shlib-install + - install shared libraries unwritable by anyone on HP-UX + - changed symlinks to relative pathnames on all platforms + +shlib/Makefile.in + - added missing `includedir' assignment, substituted by configure + +Makefile.in + - added missing @SET_MAKE@ so configure can set $MAKE appropriately + +configure.in + - add call to AC_PROG_MAKE_SET + + 8/30 + ---- +shlib/Makefile.in + - change the soname bound into the shared libraries, so it includes + only the major version number. If it includes the minor version, + programs depending on it must be rebuilt (which may or may not be + a bad thing) + + 9/6 + --- +examples/rlfe.c + - add -l option to log input and output (-a option appends to logfile) + - add -n option to set readline application name + - add -v, -h options for version and help information + - change a few things because getopt() is now used to parse arguments + + 9/12 + ---- +support/shlib-install + - fix up the libname on HPUX 11 + + 10/18 + ----- +configure.in + - changed library version to 4.2-alpha + + 10/30 + ----- +configure.in + - add -fsigned-char to LOCAL_CFLAGS for Linux running on the IBM + S/390 + +Makefile.in + - added new file, rltypedefs.h, installed by default with `make install' + + 11/2 + ---- +compat.c + - new file, with backwards-compatibility function definitions + +Makefile.in,shlib/Makefile.in + - make sure that compat.o/compat.so are built and linked apppropriately + +support/shobj-conf + - picked up bash version, which means that shared libs built on + linux and BSD/OS 4.x will have an soname that does not include + the minor version number + + 11/13 + ----- +examples/rlfe.c + - rlfe can perform filename completion for relative pathnames in the + inferior process's context if the OS supports /proc/PID/cwd (linux + does it OK, Solaris is slightly warped, none of the BSDs have it) + + 11/17/2000 + ---------- +[readline-4.2-alpha released] + + 11/27 + ----- +Makefile.in,shlib/Makefile.in + - added dependencies for rltypedefs.h + +shlib/Makefile.in + - changed dependencies on histlib.h to $(topdir)/histlib.h + + 1/22 + ---- +configure.in + - changed release version to 4.2-beta + + 2/2 + --- +examples/Makefile.in + - build histexamp as part of the examples + + 2/5 + --- +doc/Makefile.in + - don't remove the dvi, postscript, html, info, and text `objects' + on a `make distclean', only on a `make maintainer-clean' + + 3/6 + --- +doc/history.{0,3}, doc/history_3.ps + - new manual page for history library + +doc/Makefile.in + - rules to install and uninstall history.3 in ${man3dir} + - rules to build history.0 and history_3.ps + + 4/2 + --- +configure.in + - changed LIBVERSION to `4.2' + + 4/5 + --- +[readline-4.2 frozen] + + 4/9 + --- +[readline-4.2 released] + + 5/2 + --- +Makefile.in,{doc,examples,shlib}/Makefile.in + - added support for DESTDIR installation root prefix, to support + building packages + +doc/Makefile.in + - add an info `dir' file entry for rluserman.info on `make install' + - change man1ext to `.1' and man3ext to `.3' + - install man pages with a $(man3ext) extension in the target directory + - add support for installing html documentation if `htmldir' has a + value + +Makefile.in + - on `make install', install from the `shlib' directory, too + - on `make uninstall', uninstall in the `doc' and `shlib' + subdirectories, too + +support/shlib-install + - add `freebsdelf*', `freebsdaout*', Hurd, `sysv4*', `sysv5*', `dgux*' + targets for symlink creation + + 5/7 + --- +configure.in, config.h.in + - check for , define HAVE_LIMITS_H if found + + 5/8 + --- +aclocal.m4 + - pick up change to BASH_CHECK_LIB_TERMCAP that adds check for + libtinfo (termcap-specific portion of ncurses-5.2) + + 5/9 + --- +configure.in + - call AC_C_CONST to find out whether or not the compiler supports + `const' + +config.h.in + - placeholder for `const' define, if any + + 5/10 + ---- +configure.in + - fix AC_CHECK_PROG(ar, ...) test to specify right value for the + case where ar is not found; should produce a better error message + + 5/14 + ---- +configure.in,config.h.in + - check for vsnprintf, define HAVE_VSNPRINTF if found + + 5/21 + ---- +configure.in, config.h.in + - add checks for size_t, ssize_t + + 5/30 + ---- +configure.in + - update autoconf to version 2.50, use in AC_PREREQ + - changed AC_INIT to new flavor + - added AC_CONFIG_SRCDIR + - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS + - call AC_C_PROTOTYPES + - AC_RETSIGTYPE -> AC_TYPE_SIGNAL + + 8/22 + ---- +configure.in + - updated the version number to 4.2a + +Makefile.in,shlib/Makefile.in + - make sure tilde.o is built -DREADLINE_LIBRARY when being built as + part of the standalone library, so it picks up the right include + files + + 8/23 + ---- +support/shlib-install + - support for Darwin/MacOS X shared library installation + + 9/24 + ---- +examples/readlinebuf.h + - a new file, a C++ streambuf interface that uses readline for I/O. + Donated by Dimitris Vyzovitis + + 10/9 + ---- +configure.in + - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ + +[readline-4.2a-beta1 frozen] + + 10/15 + ----- +configure.in, config.h.in + - check for , define HAVE_MEMORY_H if found + - check for , define HAVE_STRINGS_H if found + + 10/18 + ----- +configure.in, config.h.in + - check for isascii, define HAVE_ISASCII if found + +configure.in + - changed the macro names from bash as appropriate: + BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE + BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS + BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T + + 10/22 + ----- +configure.in + - check for isxdigit with AC_CHECK_FUNCS + +config.h.in + - new define for HAVE_ISXDIGIT + + 10/29 + ----- +configure.in, config.h.in + - check for strpbrk with AC_CHECK_FUNCS, define HAVE_STRPBRK if found + + 11/1 + ---- +Makefile.in + - make sure DESTDIR is passed to install and uninstall makes in + subdirectories + - when saving old copies of installed libraries, make sure we use + DESTDIR for the old installation tree + +[readline-4.2a-rc1 frozen] + + 11/2 + ---- +Makefile.in, shlib/Makefile.in + - don't put -I$(includedir) into CFLAGS + + 11/15 + ----- +[readline-4.2a released] + + 11/20 + ----- +examples/rlcat.c + - new file + +examples/Makefile.in + - changes for rlcat + + 11/28 + ----- +configure.in + - default TERMCAP_LIB to -lcurses if $prefer_curses == yes (as when + --with-curses is supplied) + +examples/Makefile.in + - substitute @LDFLAGS@ in LDFLAGS assignment + + 11/29 + ----- +config.h.in + - add necessary defines for multibyte include files and functions + - add code to define HANDLE_MULTIBYTE if prerequisites are met + +configure.in + - call BASH_CHECK_MULTIBYTE + + 12/14 + ----- +config.h.in + - add #undef PROTOTYPES, filled in by AC_C_PROTOTYPES + + 12/17 + ----- +config.h.in + - moved HANDLE_MULTIBYTE code to rlmbutil.h + +rlmbutil.h, mbutil.c + - new files + +Makefile.in, shlib/Makefile.in + - added rules for mbutil.c + + 12/20 + ----- +configure.in + - added --enable-shared, --enable-static options to configure to + say which libraries are built by default (both default to yes) + - if SHLIB_STATUS == 'unsupported', turn off default shared library + building + - substitute new STATIC_TARGET, SHARED_TARGET, STATIC_INSTALL_TARGET, + and SHARED_INSTALL_TARGET + +Makefile.in + - `all' target now depends on (substituted) @STATIC_TARGET@ and + @SHARED_TARGET@ + - `install' target now depends on (substituted) @STATIC_INSTALL_TARGET@ + and @SHARED_INSTALL_TARGET@ + +INSTALL, README + - updated with new info about --enable-shared and --enable-static + + 1/10/2002 + --------- +configure.in + - bumped the library version number to 4.3 + + 1/24 + ---- +Makefile.in,shlib/Makefile.in + - changes for new file, text.c, with character and text handling + functions from readline.c + + 2/20 + ---- +{configure.config.h}.in + - call AC_C_CHAR_UNSIGNED, define __CHAR_UNSIGNED__ if chars are + unsigned by default + + 5/20 + ---- +doc/Makefile.in + - new maybe-clean target that removes the generated documentation if + the build directory differs from the source directory + - distclean target now depends on maybe-clean + + 7/17 + ---- +[readline-4.3 released] + + 7/18 + ---- +shlib/Makefile.in + - fix bad dependency: text.so: terminal.c, make it depend on text.c + + 8/7 + --- +support/shlib-install + - break `linux' out into its own stanza: it seems that linux + distributions are all moving to the following scheme: + + libreadline.so.4.3 installed version + libreadline.so.4 -> libreadline.so.4.3 symlink + libreadline.so -> libreadline.so.4 symlink + + 10/29 + ----- +support/shlib-install + - change INSTALL_LINK[12] to use `&&' instead of `;' so it only + tries the link if the cd succeeds; put ${echo} in there, too + - use $LN instead of `ln -s' so it works on machines without symlinks + - change special linux stanza to use cd before ln also + - change to use $INSTALL_LINK1 and $INSTALL_LINK2 appropriately + instead of explicit commands in various stanzas + + 2/1 + --- +config.h.in + - add HAVE_MBRTOWC and HAVE_MBRLEN + - add NO_MULTIBYTE_SUPPORT for new configure argument + - add STDC_HEADERS + +configure.in + - new argument --enable-multibyte (enabled by default), allows + multibyte support to be turned off even on systems that support it + - add check for ansi stdc headers with call to AC_HEADER_STDC + + 2/3 + --- +configure.in + - add call to BASH_FUNC_CTYPE_NONASCII + +config.h.in + - add CTYPE_NON_ASCII + + 2/20 + ---- + +doc/manvers.texinfo + - renamed to version.texi to match other GNU software + - UPDATE-MONTH variable is now `UPDATED-MONTH' + +doc/{hist,rlman,rluserman}.texinfo + - include version.texi + +doc/{rltech,rluser,hstech,hsuser}.texi + - changed the suffix from `texinfo' to `texi' + +doc/Makefile.in + - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi + +doc/{rlman,rluserman}.texinfo + - changed the suffix from `texinfo' to `texi' + +doc/hist.texinfo + - renamed to history.texi to be more consistent + + 6/11 + ---- +shlib/Makefile.in + - have configure substitute value of `@LDFLAGS@' into the assignment + to SHLIB_XLDFLAGS + + 6/16 + ---- +configure.in + - readline and history libraries are now at version 5.0 + + 8/18 + ---- +support/shlib-install + - support for FreeBSD-gnu (from Robert Millan) + + 12/4 + ---- +Makefile.in + - add variables for localedir and the PACKAGE_* variables, auto-set + by configure + + 12/9 + ---- +Makefile.in + - use mkinstalldirs instead of mkdirs + + 4/22 + ---- +Makefile.in + - separate doc install/uninstall out into two new targets: + install-doc and uninstall-doc + - make install-doc and uninstall-doc prerequisites of appropriate + install and uninstall targets + +examples/rl-fgets.c + - new example from Harold Levy that wraps fgets replacement functions + that call readline in a shared library that can be interposed with + LD_PRELOAD + + 7/27 + ---- +[readline-5.0 released] + + 11/15 + ----- +examples/rlfe/{ChangeLog,Makefile.in,README,config.h.in,configure,configure.in,extern.h,os.h,pty.c,rlfe.c,screen.h} + - new version of rlfe, rlfe-0.4, from Per Bothner; now a standalone + application + + 11/16 + ----- +shlib/Makefile.in + - substitute TERMCAP_LIB in from configure + +configure.in + - if SHLIB_LIBS doesn't include a termcap library (curses, ncurses, + termcap, termlib), append the value of $TERMCAP_LIB to it + + 11/30 + ----- +configure.in + - take out change from 11/16; it doesn't work for some systems (e.g., + SunOS 4.x and Solaris 2.6) + - add support for --enable-purify configure argument + - pass TERMCAP_LIB in environment when calling shobj-conf + +examples/Makefile.in + - add support for building examples with purify + + 1/23/2005 + --------- +configure.in + - set BUILD_DIR to contain backslashes to escape any spaces in the + directory name -- this is what make will accept in targets and + prerequisites, so it's better than trying to use double quotes + + 2/25 + ---- +configure.in + - change check for sys/ptem.h to include sys/stream.h if present, to + avoid the `present but cannot be compiled' messages on Solaris and + SVR4.2 (does anyone still use SVR4.2?) + + 5/7 + --- +configure.in + - add cross-compiling support from the bash configure.in, which cygwin + and mingw have apparently adopted + - add check for pwd.h, fcntl.h + - add checks for fcntl, kill system calls + - add checks for getpw{ent,nam,uid} C library functions + - pass a compile-time option through to Makefiles if cross-compiling + +config.h.in + - add HAVE_PWD_H for , HAVE_FCNTL_H for + - add HAVE_FCNTL, HAVE_KILL for respective system calls + - add HAVE_GETPW{ENT,NAM,UID} for passwd functions + +Makefile.in,shlib/Makefile.in + - @CROSS_COMPILE@ is substituted into DEFS (equal to -DCROSS_COMPILING + if bash is being cross-compiled) + + 8/2 + --- +examples/Makefile.in + - use $(READLINE_LIB) instead of -lreadline to get around MacOS X 10.4's + preference for (incompatible) shared libraries over static libraries + in the load path + + 8/11 + ---- +support/shobj-conf + - new variable: SHLIB_LIBPREF, prefix for shared library name (defaults + to `lib' + - new variable: SHLIB_DLLVERSION, used on Cygwin to set the library + version number + - new variable: SHLIB_DOT, separator character between library name and + suffix and version information (defaults to `.') + - new stanza for cygwin to generate windows-compatible dll + +support/shlib-install + - add new option `-b bindir' for systems like cygwin/windows that + require it + - new stanza for cygwin that installs a dll into $bindir and an implied + link library into $libdir + +configure.in + - substitute new variables from shobj-conf + +shlib/Makefile.in + - substitute bindir, SHLIB_DOT, SHLIB_LIBPREF, SHLIB_DLLVERSION from + configure + - pass `-b $(bindir)' to shlib-install for install and uninstall targets + - library names now use $SHLIB_LIBPREF and $SHLIB_DOT + +INSTALL,README + - document new SHLIB_DOT, SHLIB_LIBPREF, and SHLIB_DLLVERSION variables + + 10/4 + ---- +[readline-5.1-beta1 frozen] + + 12/1 + ---- +configure.in + - changed release status to `release' + +[readline-5.1 frozen] + + 12/9 + ---- +[readline-5.1 released] + + 12/14 + ----- +examples/rlfe/Makefile.in + - add @LIBS@ to LIBS assignment to pick up extra libraries from + configure + + 1/3/2006 + -------- +support/shlib-install + - Install shared libraries with execute bit set on Linux + + 6/9 + --- +[readline-5.2-alpha frozen] + + 6/26 + ---- +configure.in + - set CROSS_COMPILE to the empty string by default, so we don't inherit + a random value from the environment + + 7/8 + --- +[readline-5.2-alpha released] + + +[readline-5.2-beta released] + + 9/12 + ---- +config.h.in + - add defines for wcscoll, iswctype, iswupper, iswlower, towupper, + towlower functions + - replace define for wctomb with one for wcrtomb + - add defines for wchar_t, wint_t, wctype_t types + + 10/11 + ----- +[readline-5.2 released] + + 11/9 + ---- +examples/rlfe/{configure.in,Makefile.in,config.h.in,rlfe.c,pty.c} + - portability fixes from Mike Frysinger + + 11/21 + ----- +Makefile.in + - add `install-examples' and `uninstall-examples' targets + +examples/Makefile.in + - add correct variables to build examples on Windows + - add appropriate rules to install and uninstall example sources in + $(datadir)/readline + + 11/27 + ----- +config.h.in + - move #undef of HAVE_STRCOLL out of config.h.in, since autoconf tries + to substitute it based on configure tests + + 4/27/2007 + --------- +examples/autoconf + - new directory with example autoconf macros to detect readline and + return information about the installed version + + 6/13 + ---- +support/shlib-install + - changes to support AIX 5.x shared library installation + + 3/20/2008 + --------- +support/shlib-install + - add support for NetBSD and Interix shared library installation + + 4/22 + ---- +support/wcwidth.c + - updated implementation from 2007-05 + + 7/18 + ---- +support/shlib-install + - support for mingw32, contributed by Carlo Bramix + + 8/4 + --- +configure.in + - changed to readline-6.0 + + 8/18 + ---- +support/config.{guess,sub} + - updated to newer versions from autoconf-2.62 distribution + + 3/5/2009 + -------- +support/shlib-install + - take a new -V host_vendor argument + - add ${host_vendor} to string tested in case statement for symlink + creation section + - add support for FreeBSD/gentoo, which uses Linux library naming + scheme + - change FreeBSD symlink rules, since FreeBSD 7+ has only ELF shared + libraries. DragonflyBSD rules are the same. Fix from Timothy + Redaelli + +shlib/Makefile.in + - add definition of host_vendor, substituted by configure + - add -V host_vendor argument to all invocations of shlib-install. + Fix from Timothy Redaelli + + 3/10 + ---- +configure.in + - add call to AC_SYS_LARGEFILE for readdir and largefile support on + Linux + +config.h.in + - add _FILE_OFFSET_BITS define + + 4/19 + ---- +Makefile.in + - add targets for making and installing documentation required by GNU + coding standards. Fix from Joseph Myers + +posixselect.h + - pick up from bash. Inspired by Mike Frysinger + + 10/28 + ----- +support/shlib-install + - decrease the default version of FreeBSD that installs shared libraries + to 4.x. Advice from Peter Jeremy + + 12/18 + ----- +[readline-6.1-rc1 released] + + 12/23 + ----- +doc/Makefile.in + - make sure $(topdir) is not ".." before removing all of the formatted + documentation in `make distclean'. $(topdir) is set to `..' if + readline is being built in the source directory. Fixes problem + noticed by THOUMIN Damien + + 12/29 + ----- +[readline-6.1 frozen] + + 2/5/2010 + -------- +examples/Makefile.in + - make sure to install example C files using $(srcdir)/$$f in case + we're building outside the source directory. Bug report and fix + from Peter Breitenlohner + + 7/25 + ---- +xfree.c + - new file with xfree() implementation, moved from xmalloc.c + + 12/28 + ----- +{examples,shlib}/Makefile.in + - Cygwin-based changes from Eric Blake + + 3/26/2011 + --------- +Makefile.in + - don't ignore failures when building, installing, or cleaning in + the shlib subdirectory. Sample patch from Mike Frysinger + + +shlib/Makefile.in + - split the install and uninstall targets into install-supported and + install-unsupported targets that depend on the value of + SHLIB_STATUS + + 4/2 + --- +{,shlib}/Makefile.in + - add dependency for callback.o/callback.so on xmalloc.h. From + Jan Kratochvil + +{,doc,examples,shlib}/Makefile.in + - fix typo: htm target should be html. From Jan Kratochvil + + - remove `.' from VPATH. From Jan Kratochvil + + +examples/rlfe/configure.in + - quote AC_PROGRAM_SOURCE. From Jan Kratochvil + + + 5/17 + ---- +config.h.in + - WCWIDTH_BROKEN: new define, picked up from bash, defined on systems + where wcwidth returns 1 for Unicode combining characters + + 11/28 + ----- +support/shlib-install + - make sure solaris2 systems make the installed shared library + executable. ldd warns about it otherwise. Bug and fix from + Tim Mooney + +examples/hist_erasedups.c + - new example program, shows how to erase duplicates from the history + list + +examples/hist_purgecmd.c + - new example program, shows how to remove all entries matching a + string or pattern from the history list + + 1/12/2012 + --------- +colors.[ch],parse-colors.[ch]} + - new files, part of color infrastructure support + +Makefile.in,shlib/Makefile.in + - arrange to have colors.o and parse-colors.o added to library + (static and shared versions) + +{configure,config.h}.in + - check for stdbool.h, define HAVE_STDBOOL_H if found + +rldefs.h + - COLOR_SUPPORT: if defined, compile in colors.c and parse-colors.c + for color support + + 1/18 + ---- + +{configure,config.h}.in + - new check: check for AUDIT_USER_TTY defined in , + define HAVE_DECL_AUDIT_USER_TTY if both are found + + 8/7 + --- +configure.in + - AC_CANONICAL_BUILD: call to set the build_xxx variables + - use $build_os instead of $host_os to decide when DJGPP should run + `pwd.exe' to figure out the build directory. Report and fix from + Yao Qi + + 8/29 + ---- +configure.ac + - new name for configure.in + +MANIFEST,Makefile.in + - configure.in -> configure.ac + + 1/5/2013 + -------- +configure.ac + - move version number up to 6.3 + + 1/31 + ---- +configure.ac + - use AC_CHECK_TOOL instead of AC_CHECK_PROG to check for ar, since it + will find $host-prefixed versions of utilities. Report and fix from + Mike Frysinger + + 3/4 + --- +Makefile.in + - PACKAGE_TARNAME, docdir: new variables substituted by autoconf + - OTHER_DOCS,OTHER_INSTALLED_DOCS: new variables with auxiliary + documentation files to be installed into $(docdir) + - install: add new rule to install $(OTHER_DOCS) + - uninstall: add new rule to uninstall $(docdir)/$(OTHER_INSTALLED_DOCS) + + 4/29 + ---- +Makefile.in + - installdirs: make sure to create $(DESTDIR)$(docdir). Report from + + + 1/27/2014 + --------- +Makefile.in + - install-examples: should not depend on `shared', since the examples + themselves are not built using shared libraries. Report from + + +support/shobj-conf + - [from bash] darwin: changed the install_name embedded into the + shared library to contain only the major version number, not the + minor one. The idea is that the minor versions should all be API/ABI + compatible, and it is better to link automatically with the latest + one. Idea from Max Horn + + 2/26/2014 + --------- +[readline-6.3 released] + + 3/14 + ---- +shlib/Makefile.in + - fix typo in dependency list for vi_mode.so: it should not depend on + just $(topdir). Report and fix from Natanael Copa + + + 4/15 + ---- +{.,shlib,examples}/Makefile.in + - make sure $(INCLUDES) appears before $(CPPFLAGS) in the various + CFLAGS assignments so readline looks in its own source and build + directories (INCLUDES) before some directories specified by the + user or builder (CPPFLAGS). Report and fix from Max Horn + + + 6/2 + --- +config.h.in + - use correct symbols: HAVE_STRUCT_DIRENT_D_INO, HAVE_STRUCT_DIRENT_D_FILENO + HAVE_STRUCT_DIRENT_D_NAMLEN. They don't really matter, but they are + what posixdir.h looks for. Report from Ross Burton + + 6/11 + ---- +readline.pc.in + - new file, config file for pkgconfig. Patch to add from Jirka Klimes + + +{MANIFEST,configure.ac,Makefile.in} + - readline.pc: changes to create file for pkgconfig + + 10/13 + ----- +doc/Makefile.in + - readline.pdf, history.pdf, rluserman.pdf: use texi2dvi --pdf to generate + these. Suggestion from Siep Kroonenberg + + 11/29 + ----- +config.h.in + - HAVE_PSELECT: define if pselect(2) available + +configure.ac + - check for pselect(2), define HAVE_PSELECT if found + + 12/29 + ----- +configure.ac + - bump version number up to 6.4 + + 1/6/2015 + -------- +configure.ac,config.h.in + - look for ncurses/termcap.h, define HAVE_NCURSES_TERMCAP_H + + 4/20 + ---- +configure.ac + - add template definitions set by AC_USE_SYSTEM_EXTENSIONS from a report + from Andreas Schwab + + 4/24 + ---- +configure.ac,config.h.in + - add check for sys/ioctl.h to AC_CHECK_HEADERS, define HAVE_SYS_IOCTL_H + if found + + 5/29 + ---- +configure.ac + - bump library version to 7.0 because of addition of rl_callback_sigcleanup + + 8/26 + ---- +configure.ac,Makefile.in,examples/Makefile.in + - remove references to purify + + 11/21 + ----- +configure.ac,config.h.in + - fnmatch: check for libc function, define HAVE_FNMATCH if found. Now + used by vi-mode history search functions + + 7/12 + ---- +Makefile.in,examples/Makefile.in + - add support for building with address sanitizer, using new target + `asan' + + 4/23/2018 + --------- +configure.ac + - TERMCAP_PKG_CONFIG_LIB: new variable, defined from TERMCAP_LIB, + defaults to termcap + +readline.pc.in + - change Requires.private to use TERMCAP_PKG_CONFIG_LIB instead of + hardcoded `tinfo'. Report and fix from Thomas Petazzoni + + + 5/4 + --- +Makefile.in + - new targets to install and uninstall the `readline.pc' pkgconfig + file + - install-{static,shared}: add install-pc to the list of prereqs + - uninstall{,-shared}: add uninstall-pc to list of prereqs. Change + from Thomas Petazzoni + +configure.ac,Makefile.in + - add new configure option to optionally disable installing the + source code examples. From Thomas Petazzoni + + 5/23 + ---- +Makefile.in + - install-pc: make sure we install readline.pc into an existing + pkgconfig directory. Report from ilove zfs + + 5/24 + ---- +Makefile.in + - installdirs: create $(pkgconfigdir) if it doesn't exist + + + 4/8/2019 + -------- +readline.pc.in + - change CFLAGS to include ${includedir} instead of ${includedir}/readline, + to support the recommended `#include '. Report + and fix from Andrea Bolognani + + 5/13 + ---- +configure.ac + - hpux: add -DTGETENT_BROKEN to LOCAL_CFLAGS + + 8/28 + ---- +configure.ac + - hpux: add -DTGETFLAG_BROKEN to LOCAL_CFLAGS + + 9/6 + --- +examples/autoconf/RL_LIB_READLINE_VERSION + - include in the AC_TRY_RUN block to accommodate compilers + that treat functions without an existing prototype as fatal errors. + Report and fix from Florian Weimer + + 12/13 + ----- +support/shlib-install + - remove old code for FreeBSD and Dragonfly; they are ELF-only now and + can use the same code as Linux. Fix from + Baptiste Daroussin + + 5/20/2020 + --------- +configure.ac + - bumped version number up to 8.1 + + 6/15 + ---- +configure.ac + - add -Wno-parentheses -Wno-format-security to CFLAGS if gcc (or clang) + is the compiler + + 10/29 + ----- +configure.ac + - --enable-bracketed-paste-default: new invocation option, toggles the + default value of enable-bracketed-paste (on by default) + +INSTALL + - document new --enable-bracketed-paste-default configure option + + 12/4 + ---- +[readline-8.1 frozen] + + 8/17/2021 + --------- +configure.ac + - use `:+' when testing the value of $GCC, since autoconf seems to + set it to the empty string if gcc isn't the compiler. Reported by + Osipov, Michael (LDA IT PLM) + + 9/2 + --- +configure.ac + - AC_HELP_STRING -> AS_HELP_STRING + - AC_OUTPUT: split into AC_CONFIG_FILES and AC_CONFIG_COMMANDS, call + AC_OUTPUT without any parameters + + 9/3 + --- +configure.ac, config.h.in + - AC_TYPE_SIGNAL,BASH_TYPE_SIGHANDLER: remove calls, remove mention of + RETSIGTYPE and VOID_SIGHANDLER + - AC_HEADER_TIME: removed + - AC_USE_SYSTEM_EXTENSIONS: use instead of AC_AIX and AC_MINIX + - AC_HEADER_STDC: removed + - BASH_FUNC_CTYPE_NONASCII: removed + + 11/25 + ----- +history.pc.in + - pkgconfig file for history library. From Siteshwar Vashisht + + +configure.ac,MANIFEST,Makefile.in + - support for creating history.pc + + 3/29/2022 + --------- +configure.ac + - new option: --with-shared-termcap-library: use to force the shared + readline library to be linked against a shared termcap/curses library + that configure finds. If the argument begins with `-l', use that + library instead; updated INSTALL accordingly diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..eb54caa --- /dev/null +++ b/CHANGES @@ -0,0 +1,1941 @@ +This document details the changes between this version, readline-8.2, and +the previous version, readline-8.1. + +1. Changes to Readline + +a. Fixed a problem with cleaning up active marks when using callback mode. + +b. Fixed a problem with arithmetic comparison operators checking the version. + +c. Fixed a problem that could cause readline not to build on systems without + POSIX signal functions. + +d. Fixed a bug that could cause readline to crash if the application removed + the callback line handler before readline read all typeahead. + +e. Added additional checks for read errors in the middle of readline commands. + +f. Fixed a redisplay problem that occurred when switching from the digit- + argument prompt `(arg: N)' back to the regular prompt and the regular + prompt contained invisible characters. + +g. Fixed a problem with restoring the prompt when aborting an incremental + search. + +h. Fix a problem with characters > 128 not being displayed correctly in certain + single-byte encodings. + +i. Fixed a problem with unix-filename-rubout that caused it to delete too much + when applied to a pathname consisting only of one or more slashes. + +j. Fixed a display problem that caused the prompt to be wrapped incorrectly if + the screen changed dimensions during a call to readline() and the prompt + became longer than the screen width. + +k. Fixed a problem that caused the \r output by turning off bracketed paste + to overwrite the line if terminal echo was disabled. + +l. Fixed a bug that could cause colored-completion-prefix to not display if + completion-prefix-display-length was set. + +m. Fixed a problem with line wrapping prompts when a group of invisible + characters runs to the right edge of the screen and the prompt extends + longer then the screen width. + +n. Fixed a couple problems that could cause rl_end to be set incorrectly by + transpose-words. + +o. Prevent some display problems when running a command as the result of a + trap or one bound using `bind -x' and the command generates output. + +p. Fixed an issue with multi-line prompt strings that have one or more + invisible characters at the end of a physical line. + +q. Fixed an issue that caused a history line's undo list to be cleared when + it should not have been. + +r. When replacing a history entry, make sure the existing entry has a non-NULL + timestamp before copying it; it may have been added by the application, not + the history library. + +2. New Features in Readline + +a. There is now an HS_HISTORY_VERSION containing the version number of the + history library for applications to use. + +b. History expansion better understands multiple history expansions that may + contain strings that would ordinarily inhibit history expansion (e.g., + `abc!$!$'). + +c. There is a new framework for readline timeouts, including new public + functions to set timeouts and query how much time is remaining before a + timeout hits, and a hook function that can trigger when readline times + out. There is a new state value to indicate a timeout. + +d. Automatically bind termcap key sequences for page-up and page-down to + history-search-backward and history-search-forward, respectively. + +e. There is a new `fetch-history' bindable command that retrieves the history + entry corresponding to its numeric argument. Negative arguments count back + from the end of the history. + +f. `vi-undo' is now a bindable command. + +g. There is a new option: `enable-active-region'. This separates control of + the active region and bracketed-paste. It has the same default value as + bracketed-paste, and enabling bracketed paste enables the active region. + Users can now turn off the active region while leaving bracketed paste + enabled. + +h. rl_completer_word_break_characters is now `const char *' like + rl_basic_word_break_characters. + +i. Readline looks in $LS_COLORS for a custom filename extension + (*.readline-colored-completion-prefix) and uses that as the default color + for the common prefix displayed when `colored-completion-prefix' is set. + +j. Two new bindable string variables: active-region-start-color and + active-region-end-color. The first sets the color used to display the + active region; the second turns it off. If set, these are used in place + of terminal standout mode. + +k. New readline state (RL_STATE_EOF) and application-visible variable + (rl_eof_found) to allow applications to detect when readline reads EOF + before calling the deprep-terminal hook. + +l. There is a new configuration option: --with-shared-termcap-library, which + forces linking the shared readline library with the shared termcap (or + curses/ncurses/termlib) library so applications don't have to do it. + +m. Readline now checks for changes to locale settings (LC_ALL/LC_CTYPE/LANG) + each time it is called, and modifies the appropriate locale-specific display + and key binding variables when the locale changes. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-8.1, and +the previous version, readline-8.0. + +1. Changes to Readline + +a. There are a number of fixes that were found as the result of fuzzing with + random input. + +b. Changed the revert-all-at-newline behavior to make sure to start at the end + of the history list when doing it, instead of the line where the user hit + return. + +c. When parsing `set' commands from the inputrc file or an application, readline + now allows trailing whitespace. + +d. Fixed a bug that left a file descriptor open to the history file if the + file size was 0. + +e. Fixed a problem with binding key sequences containing meta characters. + +f. Fixed a bug that caused the wrong line to be displayed if the user tried to + move back beyond the beginning of the history list, or forward past the end + of the history list. + +g. If readline catches SIGTSTP, it now sets a hook that allows the calling + application to handle it if it desires. + +h. Fixed a redisplay problem with a prompt string containing embedded newlines. + +i. Fixed a problem with completing filenames containing invalid multibyte + sequences when case-insensitive comparisons are enabled. + +j. Fixed a redisplay problem with prompt strings containing invisible multibyte + characters. + +k. Fixed a problem with multibyte characters mapped to editing commands that + modify the search string in incremental search. + +l. Fixed a bug with maintaining the key sequence while resolving a bound + command in the presence of ambiguous sequences (sequences with a common + prefix), in most cases while attempting to unbind it. + +m. Fixed several buffer overflows found as the result of fuzzing. + +n. Reworked backslash handling when translating key sequences for key binding + to be more uniform and consistent, which introduces a slight backwards + incompatibility. + +o. Fixed a bug with saving the history that resulted in errors not being + propagated to the calling application when the history file is not writable. + +p. Readline only calls chown(2) on a newly-written history file if it really + needs to, instead of having it be a no-op. + +q. Readline now behaves better when operate-and-get-next is used when the + history list is `full': when there are already $HISTSIZE entries. + +r. Fixed a bug that could cause vi redo (`.') of a replace command not to work + correctly in the C or POSIX locale. + +s. Fixed a bug with vi-mode digit arguments that caused the last command to be + set incorrectly. This prevents yank-last-arg from working as intended, for + example. + +t. Make sure that all undo groups are closed when leaving vi insertion mode. + +u. Make sure that the vi-mode `C' and `c' commands enter insert mode even if + the motion command doesn't have any effect. + +v. Fixed several potential memory leaks in the callback mode context handling. + +w. If readline is handling a SIGTTOU, make sure SIGTTOU is blocked while + executing the terminal cleanup code, since it's no longer run in a signal + handling context. + +x. Fixed a bug that could cause an application with an application-specific + redisplay function to crash if the line data structures had not been + initialized. + +y. Terminals that are named "dumb" or unknown do not enable bracketed paste + by default. + +z. Ensure that disabling bracketed paste turns off highlighting the incremental + search string when the search is successful. + +2. New Features in Readline + +a. If a second consecutive completion attempt produces matches where the first + did not, treat it as a new completion attempt and insert a match as + appropriate. + +b. Bracketed paste mode works in more places: incremental search strings, vi + overstrike mode, character search, and reading numeric arguments. + +c. Readline automatically switches to horizontal scrolling if the terminal has + only one line. + +d. Unbinding all key sequences bound to a particular readline function now + descends into keymaps for multi-key sequences. + +e. rl-clear-display: new bindable command that clears the screen and, if + possible, the scrollback buffer (bound to emacs mode M-C-l by default). + +f. New active mark and face feature: when enabled, it will highlight the text + inserted by a bracketed paste (the `active region') and the text found by + incremental and non-incremental history searches. This is tied to bracketed + paste and can be disabled by turning off bracketed paste. + +g. Readline sets the mark in several additional commands. + +h. Bracketed paste mode is enabled by default. There is a configure-time + option (--enable-bracketed-paste-default) to set the default to on or off. + +i. Readline tries to take advantage of the more regular structure of UTF-8 + characters to identify the beginning and end of characters when moving + through the line buffer. + +j. The bindable operate-and-get-next command (and its default bindings) are + now part of readline instead of a bash-specific addition. + +k. The signal cleanup code now blocks SIGINT while processing after a SIGINT. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-8.0, and the +previous version, readline-7.0. + +1. Changes to Readline + +a. Added a guard to prevent nested macros from causing an infinite expansion + loop. + +b. Instead of allocating enough history list entries to hold the maximum list + size, cap the number allocated initially. + +c. Added a strategy to avoid allocating huge amounts of memory if a block of + history entries without timestamps occurs after a block with timestamps. + +d. Added support for keyboard timeouts when an ESC character is the last + character in a macro. + +e. There are several performance improvements when in a UTF-8 locale. + +f. Readline does a better job of preserving the original set of blocked + signals when using pselect() to wait for input. + +g. Fixed a bug that caused multibyte characters in macros to be mishandled. + +h. Fixed several bugs in the code that calculates line breaks when expanding + prompts that span several lines, contain multibyte characters, and contain + invisible character seqeuences. + +i. Fixed several bugs in cursor positioning when displaying lines with prompts + containing invisible characters and multibyte characters. + +j. When performing case-insensitive completion, Readline no longer sorts the + list of matches unless directed to do so. + +k. Fixed a problem with key sequences ending with a backslash. + +l. Fixed out-of-bounds and free memory read errors found via fuzzing. + +m. Fixed several cases where the mark was set to an invalid value. + +n. Fixed a problem with the case-changing operators in the case where the + lower and upper case versions of a character do not have the same number + of bytes. + +o. Handle incremental and non-incremental search character reads returning EOF. + +p. Handle the case where a failing readline command at the end of a multi-key + sequence could be misinterpreted. + +q. The history library now prints a meaningful error message if the history + file isn't a regular file. + +r. Fixed a problem with vi-mode redo (`.') on a command when trying to replace + a multibyte character. + +s. The key binding code now attempts to remove a keymap if a key unbinding + leaves it empty. + +t. Fixed a line-wrapping issue that caused problems for some terminal + emulators. + +u. If there is a key bound to the tty's VDISCARD special character, readline + disables VDISCARD while it is active. + +v. Fixed a problem with exiting bracketed paste mode on terminals that assume + the bracketed paste mode character sequence contains visible characters. + +w. Fixed a bug that could cause a key binding command to refer to an + uninitialized variable. + +x. Added more UTF-8-specific versions of multibyte functions, and optimized + existing functions if the current locale uses UTF-8 encoding. + +y. Fixed a problem with bracketed-paste inserting more than one character and + interacting with other readline functions. + +z. Fixed a bug that caused the history library to attempt to append a history + line to a non-existent history entry. + +aa. If using bracketed paste mode, output a newline after the \r that is the + last character of the mode disable string to avoid overwriting output. + +bb. Fixes to the vi-mode `b', `B', `w', `W', `e', and `E' commands to better + handle multibyte characters. + +cc. Fixed a redisplay problem that caused an extra newline to be generated on + accept-line when the line length is exactly the screenwidth. + +dd. Fixed a bug with adding multibyte characters to an incremental search + string. + +ee. Fixed a bug with redoing text insertions in vi mode. + +ff. Fixed a bug with pasting text into an incremental search string if bracketed + paste mode is enabled. ESC cannot be one of the incremental search + terminator characters for this to work. + +gg. Fixed a bug with anchored search patterns when performing searches in vi + mode. + +2. New Features in Readline + +a. Non-incremental vi-mode search (`N', `n') can search for a shell pattern, as + Posix specifies (uses fnmatch(3) if available). + +b. There are new `next-screen-line' and `previous-screen-line' bindable + commands, which move the cursor to the same column in the next, or previous, + physical line, respectively. + +c. There are default key bindings for control-arrow-key key combinations. + +d. A negative argument (-N) to `quoted-insert' means to insert the next N + characters using quoted-insert. + +e. New public function: rl_check_signals(), which allows applications to + respond to signals that readline catches while waiting for input using + a custom read function. + +f. There is new support for conditionally testing the readline version in an + inputrc file, with a full set of arithmetic comparison operators available. + +g. There is a simple variable comparison facility available for use within an + inputrc file. Allowable operators are equality and inequality; string + variables may be compared to a value; boolean variables must be compared to + either `on' or `off'; variable names are separated from the operator by + whitespace. + +h. The history expansion library now understands command and process + substitution and extended globbing and allows them to appear anywhere in a + word. + +i. The history library has a new variable that allows applications to set the + initial quoting state, so quoting state can be inherited from a previous + line. + +j. Readline now allows application-defined keymap names; there is a new public + function, rl_set_keymap_name(), to do that. + +k. The "Insert" keypad key, if available, now puts readline into overwrite + mode. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-7.0, and the +previous version, readline-6.3. + +1. Changes to Readline + +a. A bug that caused vi-mode `.' to be unable to redo `c', `d', and `y' + commands with modifiers was fixed. + +b. Fixed a bug that caused callback mode to dump core when reading a + multiple-key sequence (e.g., arrow keys). + +c. Fixed a bug that caused the redisplay code to erase some of the line when + using horizontal scrolling with incremental search. + +d. Readline's input handler now performs signal processing if read(2) is + interrupted by SIGALRM or SIGVTALRM. + +e. Fixed a problem with revert-all-at-newline freeing freed memory. + +f. Clarified the documentation for the history_quotes_inhibit_expansion + variable to note that it inhibits scanning for the history comment + character and that it only affects double-quoted strings. + +g. Fixed an off-by-one error in the prompt printed when performing searches. + +h. Use pselect(2), if available, to wait for input before calling read(2), so + a SIGWINCH can interrupt it, since it doesn't interrupt read(2). + +i. Some memory leaks caused by signals interrupting filename completion have + been fixed. + +j. Reading EOF twice on a non-empty line causes EOF to be returned, rather + than the partial line. This can cause partial lines to be executed on + SIGHUP, for example. + +k. Fixed a bug concerning deleting multibyte characters from the search + string while performing an incremental search. + +l. Fixed a bug with tilde expanding directory names in filename completion. + +m. Fixed a bug that did not allow binding sequences beginning with a `\'. + +n. Fixed a redisplay bug involving incorrect line wrapping when the prompt + contains a multibyte character in the last screen column. + +o. Fixed a bug that caused history expansion to disregard characters that are + documented to delimit a history event specifier without requiring `:'. + +p. Fixed a bug that could cause reading past the end of a string when reading + the value when binding the set of isearch terminators. + +q. Fixed a bug that caused readline commands that depend on knowing which + key invoked them to misbehave when dispatching key sequences that are + prefixes of other key bindings. + +r. Paren matching now works in vi insert mode. + +s. Colored completion prefixes are now displayed using a different color, less + likely to collide with files. + +t. Fixed a bug that caused vi-mode character search to misbehave when + running in callback mode. + +u. Fixed a bug that caused output to be delayed when input is coming from a + macro in vi-mode. + +v. Fixed a bug that caused the vi-mode `.' command to misbehave when redoing + a multi-key key sequence via a macro. + +w. Fixed a bug that caused problems with applications that supply their own + input function when performing completion. + +x. When read returns -1/EIO when attempting to read a key, return an error + instead of line termination back to the caller. + +y. Updated tty auditing feature based on patch from Red Hat. + +z. Fixed a bug that could cause the history library to crash on overflows + introduced by malicious editing of timestamps in the history file. + +aa. The history file writing functions only attempt to create and use a backup + history file if the history file exists and is a regular file. + +bb. Fixed an out-of-bounds read in readline's internal tilde expansion interface. + +cc. Fixed several redisplay bugs with prompt strings containing multibyte + and non-visible characters whose physical length is longer than the screen + width. + +dd. Fixed a redisplay bug with prompt strings containing invisible characters + whose physical length exceeds the screen width and using incremental search. + +ee. Readline prints more descriptive error messages when it encounters errors + while reading an inputrc file. + +ff. Fixed a bug in the character insertion code that attempts to optimize + typeahead when it reads a character that is not bound to self-insert and + resets the key sequence state. + +gg. When refreshing the line as the result of a key sequence, Readline attempts + to redraw only the last line of a multiline prompt. + +hh. Fixed an issue that caused completion of git commands to display + incorrectly when using colored-completion-prefix. + +ii. Fixed several redisplay bugs having to do with multibyte characters and + invisible characters in prompt strings. + +jj. Fixed a bug that caused mode strings to be displayed incorrectly if the + prompt was shorter than the mode string. + +2. New Features in Readline + +a. The history truncation code now uses the same error recovery mechanism as + the history writing code, and restores the old version of the history file + on error. The error recovery mechanism handles symlinked history files. + +b. There is a new bindable variable, `enable-bracketed-paste', which enables + support for a terminal's bracketed paste mode. + +c. The editing mode indicators can now be strings and are user-settable + (new `emacs-mode-string', `vi-cmd-mode-string' and `vi-ins-mode-string' + variables). Mode strings can contain invisible character sequences. + Setting mode strings to null strings restores the defaults. + +d. Prompt expansion adds the mode string to the last line of a multi-line + prompt (one with embedded newlines). + +e. There is a new bindable variable, `colored-completion-prefix', which, if + set, causes the common prefix of a set of possible completions to be + displayed in color. + +f. There is a new bindable command `vi-yank-pop', a vi-mode version of emacs- + mode yank-pop. + +g. The redisplay code underwent several efficiency improvements for multibyte + locales. + +h. The insert-char function attempts to batch-insert all pending typeahead + that maps to self-insert, as long as it is coming from the terminal. + +i. rl_callback_sigcleanup: a new application function that can clean up and + unset any state set by readline's callback mode. Intended to be used + after a signal. + +j. If an incremental search string has its last character removed with DEL, the + resulting empty search string no longer matches the previous line. + +k. If readline reads a history file that begins with `#' (or the value of + the history comment character) and has enabled history timestamps, the history + entries are assumed to be delimited by timestamps. This allows multi-line + history entries. + +l. Readline now throws an error if it parses a key binding without a terminating + `:' or whitespace. + +m. The default binding for ^W in vi mode now uses word boundaries specified + by Posix (vi-unix-word-rubout is bindable command name). + +n. rl_clear_visible_line: new application-callable function; clears all + screen lines occupied by the current visible readline line. + +o. rl_tty_set_echoing: application-callable function that controls whether + or not readline thinks it is echoing terminal output. + +p. Handle >| and strings of digits preceding and following redirection + specifications as single tokens when tokenizing the line for history + expansion. + +q. Fixed a bug with displaying completions when the prefix display length + is greater than the length of the completions to be displayed. + +r. The :p history modifier now applies to the entire line, so any expansion + specifying :p causes the line to be printed instead of expanded. + +s. New application-callable function: rl_pending_signal(): returns the signal + number of any signal readline has caught but not yet handled. + +t. New application-settable variable: rl_persistent_signal_handlers: if set + to a non-zero value, readline will enable the readline-6.2 signal handler + behavior in callback mode: handlers are installed when + rl_callback_handler_install is called and removed removed when a complete + line has been read. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-6.3, and the +previous version, readline-6.2. + +1. Changes to Readline + +a. Fixed a bug that did not allow the `dd', `cc', or `yy' vi editing mode + commands to work on the entire line. + +b. Fixed a bug that caused redisplay problems with prompts longer than 128 + characters and history searches. + +c. Fixed a bug that caused readline to try and run code to modify its idea + of the screen size in a signal handler context upon receiving a SIGWINCH. + +d. Fixed a bug that caused the `meta' key to be enabled beyond the duration + of an individual call top readline(). + +e. Added a workaround for a wcwidth bug in Mac OS X that caused readline's + redisplay to mishandle zero-width combining characters. + +f. Fixed a bug that caused readline to `forget' part of a key sequence when + a multiple-key sequence caused it to break out of an incremental search. + +g. Fixed bugs that caused readline to execute code in a signal handler + context if interrupted while reading from the file system during completion. + +h. Fixed a bug that caused readline to `forget' part of a key sequence when + reading an unbound multi-character key sequence. + +i. Fixed a bug that caused Readline's signal handlers to be installed beyond + the bounds of a single call to readline(). + +j. Fixed a bug that caused the `.' command to not redo the most recent `R' + command in vi mode. + +k. Fixed a bug that caused ignoring case in completion matches to result in + readline using the wrong match. + +l. Paren matching now works in vi insert mode. + +m. Fix menu-completion to make show-all-if-ambiguous and menu-complete-display-prefix + work together. + +n. Fixed a bug that didn't allow the `cc', `dd', or `yy' commands to be redone + in vi editing mode. + +o. Fixed a bug that caused the filename comparison code to not compare + multibyte characters correctly when using case-sensitive or case-mapping + comparisons. + +p. Fixed the input reading loop to call the input hook function only when there + is no terminal input available. + +q. Fixed a bug that caused binding a macro to a multi-character key sequence + where the sequence and macro value share a common prefix to not perform + the macro replacement. + +r. Fixed several redisplay errors with multibyte characters and prompts + containing invisible characters when using horizontal scrolling. + +s. Fixed a bug that caused redisplay errors when trying to overwrite + existing characters using multibyte characters. + +t. Fixed a bug in vi mode that caused the arrow keys to set the saved last + vi-mode command to the wrong value. + +u. Fixed a bug that caused double-quoted strings to be scanned incorrectly + when being used as the value of a readline variable assignment. + +v. Fixed a bug with vi mode that prevented `.' from repeating a command + entered on a previous line (command). + +w. Fixed a bug that could cause completion to core dump if it was interrupted + by a signal. + +x. Fixed a bug that could cause readline to crash and seg fault attempting to + expand an empty history entry. + +y. Fixed a bug that caused display problems with multi-line prompts containing + invisible characters on multiple lines. + +z. Fixed a bug that caused effects made by undoing changes to a history line to + be discarded. + +2. New Features in Readline + +a. Readline is now more responsive to SIGHUP and other fatal signals when + reading input from the terminal or performing word completion but no + longer attempts to run any not-allowable functions from a signal handler + context. + +b. There are new bindable commands to search the history for the string of + characters between the beginning of the line and the point + (history-substring-search-forward, history-substring-search-backward) + +c. Readline allows quoted strings as the values of variables when setting + them with `set'. As a side effect, trailing spaces and tabs are ignored + when setting a string variable's value. + +d. The history library creates a backup of the history file when writing it + and restores the backup on a write error. + +e. New application-settable variable: rl_filename_stat_hook: a function called + with a filename before using it in a call to stat(2). Bash uses it to + expand shell variables so things like $HOME/Downloads have a slash + appended. + +f. New bindable function `print-last-kbd-macro', prints the most-recently- + defined keyboard macro in a reusable format. + +g. New user-settable variable `colored-stats', enables use of colored text + to denote file types when displaying possible completions (colored analog + of visible-stats). + +h. New user-settable variable `keyseq-timout', acts as an inter-character + timeout when reading input or incremental search strings. + +i. New application-callable function: rl_clear_history. Clears the history list + and frees all readline-associated private data. + +j. New user-settable variable, show-mode-in-prompt, adds a characters to the + beginning of the prompt indicating the current editing mode. + +k. New application-settable variable: rl_input_available_hook; function to be + called when readline needs to check whether there is data available on its + input source. The default hook checks rl_instream. + +l. Readline calls an application-set event hook (rl_signal_event_hook) after + it gets a signal while reading input (read returns -1/EINTR but readline + does not handle the signal immediately) to allow the application to handle + or otherwise note it. Not currently called for SIGHUP or SIGTERM. + +m. If the user-settable variable `history-size' is set to a value less than + 0, the history list size is unlimited. + +n. When creating shared libraries on Mac OS X, the pathname written into the + library (install_name) no longer includes the minor version number. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-6.2, +and the previous version, readline-6.1. + +1. Changes to Readline + +a. Fixed a bug that caused the unconverted filename to be added to the list of + completions when the application specified filename conversion functions. + +b. Fixed a bug that caused the wrong filename to be passed to opendir when the + application has specified a filename dequoting function. + +c. Fixed a bug when repeating a character search in vi mode in the case where + there was no search to repeat. + +d. When show-all-if-ambiguous is set, the completion routines no longer insert + a common match prefix that is shorter than the text being completed. + +e. The full set of vi editing commands may now be used in callback mode. + +f. Fixed a bug that caused readline to not update its idea of the terminal + dimensions while running in `no-echo' mode. + +h. Fixed a bug that caused readline to dump core if an application called + rl_prep_terminal without setting rl_instream. + +i. Fixed a bug that caused meta-prefixed characters bound to incremental + search forward or backward to not be recognized if they were typed + subsequently. + +j. The incremental search code treats key sequences that map to the same + functions as (default) ^G, ^W, and ^Y as equivalent to those characters. + +k. Fixed a bug in menu-complete that caused it to misbehave with large + negative argument. + +l. Fixed a bug that caused vi-mode yank-last-arg to ring the bell when invoked + at the end of the line. + +m. Fixed a bug that made an explicit argument of 0 to yank-last-arg behave + as if it were a negative argument. + +n. Fixed a bug that caused directory names in words to be completed to not + be dequoted correctly. + +2. New Features in Readline + +a. The history library does not try to write the history filename in the + current directory if $HOME is unset. This closes a potential security + problem if the application does not specify a history filename. + +b. New bindable variable `completion-display-width' to set the number of + columns used when displaying completions. + +c. New bindable variable `completion-case-map' to cause case-insensitive + completion to treat `-' and `_' as identical. + +d. There are new bindable vi-mode command names to avoid readline's case- + insensitive matching not allowing them to be bound separately. + +e. New bindable variable `menu-complete-display-prefix' causes the menu + completion code to display the common prefix of the possible completions + before cycling through the list, instead of after. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-6.1, +and the previous version, readline-6.0. + +1. Changes to Readline + +a. The SIGWINCH signal handler now avoids calling the redisplay code if + one arrives while in the middle of redisplay. + +b. Changes to the timeout code to make sure that timeout values greater + than one second are handled better. + +c. Fixed a bug in the redisplay code that was triggered by a prompt + containing invisible characters exactly the width of the screen. + +d. Fixed a bug in the redisplay code encountered when running in horizontal + scroll mode. + +e. Fixed a bug that prevented menu completion from properly completing + filenames. + +f. Fixed a redisplay bug caused by a multibyte character causing a line to + wrap. + +g. Fixed a bug that caused key sequences of two characters to not be + recognized when a longer sequence identical in the first two characters + was bound. + +h. Fixed a bug that caused history expansion to be attempted on $'...' + single-quoted strings. + +i. Fixed a bug that caused incorrect redisplay when the prompt contained + multibyte characters in an `invisible' sequence bracketed by \[ and + \]. + +j. Fixed a bug that caused history expansion to short-circuit after + encountering a multibyte character. + +k. Fixed a bug that caused applications using the callback interface to not + react to SIGINT (or other signals) until another character arrived. + +2. New Features in Readline + +a. New bindable function: menu-complete-backward. + +b. In the vi insertion keymap, C-n is now bound to menu-complete by default, + and C-p to menu-complete-backward. + +c. When in vi command mode, repeatedly hitting ESC now does nothing, even + when ESC introduces a bound key sequence. This is closer to how + historical vi behaves. + +d. New bindable function: skip-csi-sequence. Can be used as a default to + consume key sequences generated by keys like Home and End without having + to bind all keys. + +e. New application-settable function: rl_filename_rewrite_hook. Can be used + to rewrite or modify filenames read from the file system before they are + compared to the word to be completed. + +f. New bindable variable: skip-completed-text, active when completing in the + middle of a word. If enabled, it means that characters in the completion + that match characters in the remainder of the word are "skipped" rather + than inserted into the line. + +g. The pre-readline-6.0 version of menu completion is available as + "old-menu-complete" for users who do not like the readline-6.0 version. + +h. New bindable variable: echo-control-characters. If enabled, and the + tty ECHOCTL bit is set, controls the echoing of characters corresponding + to keyboard-generated signals. + +i. New bindable variable: enable-meta-key. Controls whether or not readline + sends the smm/rmm sequences if the terminal indicates it has a meta key + that enables eight-bit characters. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-6.0, +and the previous version, readline-5.2. + +1. Changes to Readline + +a. Fixed a number of redisplay errors in environments supporting multibyte + characters. + +b. Fixed bugs in vi command mode that caused motion commands to inappropriately + set the mark. + +c. When using the arrow keys in vi insertion mode, readline allows movement + beyond the current end of the line (unlike command mode). + +d. Fixed bugs that caused readline to loop when the terminal has been taken + away and reads return -1/EIO. + +e. Fixed bugs in redisplay occurring when displaying prompts containing + invisible characters. + +f. Fixed a bug that caused the completion append character to not be reset to + the default after an application-specified completion function changed it. + +g. Fixed a problem that caused incorrect positioning of the cursor while in + emacs editing mode when moving forward at the end of a line while using + a locale supporting multibyte characters. + +h. Fixed an off-by-one error that caused readline to drop every 511th + character of buffered input. + +i. Fixed a bug that resulted in SIGTERM not being caught or cleaned up. + +j. Fixed redisplay bugs caused by multiline prompts with invisible characters + or no characters following the final newline. + +k. Fixed redisplay bug caused by prompts consisting solely of invisible + characters. + +l. Fixed a bug in the code that buffers characters received very quickly in + succession which caused characters to be dropped. + +m. Fixed a bug that caused readline to reference uninitialized data structures + if it received a SIGWINCH before completing initialization. + +n. Fixed a bug that caused the vi-mode `last command' to be set incorrectly + and therefore unrepeatable. + +o. Fixed a bug that caused readline to disable echoing when it was being used + with an output file descriptor that was not a terminal. + +p. Readline now blocks SIGINT while manipulating internal data structures + during redisplay. + +q. Fixed a bug in redisplay that caused readline to segfault when pasting a + very long line (over 130,000 characters). + +r. Fixed bugs in redisplay when using prompts with no visible printing + characters. + +s. Fixed a bug that caused redisplay errors when using prompts with invisible + characters and numeric arguments to a command in a multibyte locale. + +t. Fixed a bug that caused redisplay errors when using prompts with invisible + characters spanning more than two physical screen lines. + +2. New Features in Readline + +a. A new variable, rl_sort_completion_matches; allows applications to inhibit + match list sorting (but beware: some things don't work right if + applications do this). + +b. A new variable, rl_completion_invoking_key; allows applications to discover + the key that invoked rl_complete or rl_menu_complete. + +c. The functions rl_block_sigint and rl_release_sigint are now public and + available to calling applications who want to protect critical sections + (like redisplay). + +d. The functions rl_save_state and rl_restore_state are now public and + available to calling applications; documented rest of readline's state + flag values. + +e. A new user-settable variable, `history-size', allows setting the maximum + number of entries in the history list. + +f. There is a new implementation of menu completion, with several improvements + over the old; the most notable improvement is a better `completions + browsing' mode. + +g. The menu completion code now uses the rl_menu_completion_entry_function + variable, allowing applications to provide their own menu completion + generators. + +h. There is support for replacing a prefix of a pathname with a `...' when + displaying possible completions. This is controllable by setting the + `completion-prefix-display-length' variable. Matches with a common prefix + longer than this value have the common prefix replaced with `...'. + +i. There is a new `revert-all-at-newline' variable. If enabled, readline will + undo all outstanding changes to all history lines when `accept-line' is + executed. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-5.2, +and the previous version, readline-5.1. + +1. Changes to Readline + +a. Fixed a problem that caused segmentation faults when using readline in + callback mode and typing consecutive DEL characters on an empty line. + +b. Fixed several redisplay problems with multibyte characters, all having to + do with the different code paths and variable meanings between single-byte + and multibyte character redisplay. + +c. Fixed a problem with key sequence translation when presented with the + sequence \M-\C-x. + +d. Fixed a problem that prevented the `a' command in vi mode from being + undone and redone properly. + +e. Fixed a problem that prevented empty inserts in vi mode from being undone + properly. + +f. Fixed a problem that caused readline to initialize with an incorrect idea + of whether or not the terminal can autowrap. + +g. Fixed output of key bindings (like bash `bind -p') to honor the setting of + convert-meta and use \e where appropriate. + +h. Changed the default filename completion function to call the filename + dequoting function if the directory completion hook isn't set. This means + that any directory completion hooks need to dequote the directory name, + since application-specific hooks need to know how the word was quoted, + even if no other changes are made. + +i. Fixed a bug with creating the prompt for a non-interactive search string + when there are non-printing characters in the primary prompt. + +j. Fixed a bug that caused prompts with invisible characters to be redrawn + multiple times in a multibyte locale. + +k. Fixed a bug that could cause the key sequence scanning code to return the + wrong function. + +l. Fixed a problem with the callback interface that caused it to fail when + using multi-character keyboard macros. + +m. Fixed a bug that could cause a core dump when an edited history entry was + re-executed under certain conditions. + +n. Fixed a bug that caused readline to reference freed memory when attmpting + to display a portion of the prompt. + +o. Fixed a bug with prompt redisplay in a multi-byte locale to avoid redrawing + the prompt and input line multiple times. + +p. Fixed history expansion to not be confused by here-string redirection. + +q. Readline no longer treats read errors by converting them to newlines, as + it does with EOF. This caused partial lines to be returned from readline(). + +r. Fixed a redisplay bug that occurred in multibyte-capable locales when the + prompt was one character longer than the screen width. + +2. New Features in Readline + +a. Calling applications can now set the keyboard timeout to 0, allowing + poll-like behavior. + +b. The value of SYS_INPUTRC (configurable at compilation time) is now used as + the default last-ditch startup file. + +c. The history file reading functions now allow windows-like \r\n line + terminators. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-5.1, +and the previous version, readline-5.0. + +1. Changes to Readline + +a. Fixed a bug that caused multiliine prompts to be wrapped and displayed + incorrectly. + +b. Fixed a bug that caused ^P/^N in emacs mode to fail to display the current + line correctly. + +c. Fixed a problem in computing the number of invisible characters on the first + line of a prompt whose length exceeds the screen width. + +d. Fixed vi-mode searching so that failure preserves the current line rather + than the last line in the history list. + +e. Fixed the vi-mode `~' command (change-case) to have the correct behavior at + end-of-line when manipulating multibyte characters. + +f. Fixed the vi-mode `r' command (change-char) to have the correct behavior at + end-of-line when manipulating multibyte characters. + +g. Fixed multiple bugs in the redisplay of multibyte characters: displaying + prompts longer than the screen width containing multibyte characters, + +h. Fix the calculation of the number of physical characters in the prompt + string when it contains multibyte characters. + +i. A non-zero value for the `rl_complete_suppress_append' variable now causes + no `/' to be appended to a directory name. + +j. Fixed forward-word and backward-word to work when words contained + multibyte characters. + +k. Fixed a bug in finding the delimiter of a `?' substring when performing + history expansion in a locale that supports multibyte characters. + +l. Fixed a memory leak caused by not freeing the timestamp in a history entry. + +m. Fixed a bug that caused "\M-x" style key bindings to not obey the setting + of the `convert-meta' variable. + +n. Fixed saving and restoring primary prompt when prompting for incremental + and non-incremental searches; search prompts now display multibyte + characters correctly. + +o. Fixed a bug that caused keys originally bound to self-insert but shadowed + by a multi-character key sequence to not be inserted. + +p. Fixed code so rl_prep_term_function and rl_deprep_term_function aren't + dereferenced if NULL (matching the documentation). + +q. Extensive changes to readline to add enough state so that commands + requiring additional characters (searches, multi-key sequences, numeric + arguments, commands requiring an additional specifier character like + vi-mode change-char, etc.) work without synchronously waiting for + additional input. + +r. Lots of changes so readline builds and runs on MinGW. + +s. Readline no longer tries to modify the terminal settings when running in + callback mode. + +t. The Readline display code no longer sets the location of the last invisible + character in the prompt if the \[\] sequence is empty. + +u. The `change-case' command now correctly changes the case of multibyte + characters. + +v. Changes to the shared library construction scripts to deal with Windows + DLL naming conventions for Cygwin. + +w. Fixed the redisplay code to avoid core dumps resulting from a poorly-timed + SIGWINCH. + +x. Fixed the non-incremental search code in vi mode to dispose of any current + undo list when copying a line from the history into the current editing + buffer. + +y. Fixed a bug that caused reversing the incremental search direction to + not work correctly. + +z. Fixed the vi-mode `U' command to only undo up to the first time insert mode + was entered, as Posix specifies. + +aa. Fixed a bug in the vi-mode `r' command that left the cursor in the wrong + place. + +bb. Fixed a redisplay bug caused by moving the cursor vertically to a line + with invisible characters in the prompt in a multibyte locale. + +cc. Fixed a bug that could cause the terminal special chars to be bound in the + wrong keymap in vi mode. + +2. New Features in Readline + +a. The key sequence sent by the keypad `delete' key is now automatically + bound to delete-char. + +b. A negative argument to menu-complete now cycles backward through the + completion list. + +c. A new bindable readline variable: bind-tty-special-chars. If non-zero, + readline will bind the terminal special characters to their readline + equivalents when it's called (on by default). + +d. New bindable command: vi-rubout. Saves deleted text for possible + reinsertion, as with any vi-mode `text modification' command; `X' is bound + to this in vi command mode. + +e. If the rl_completion_query_items is set to a value < 0, readline never + asks the user whether or not to view the possible completions. + +f. The `C-w' binding in incremental search now understands multibyte + characters. + +g. New application-callable auxiliary function, rl_variable_value, returns + a string corresponding to a readline variable's value. + +h. When parsing inputrc files and variable binding commands, the parser + strips trailing whitespace from values assigned to boolean variables + before checking them. + +i. A new external application-controllable variable that allows the LINES + and COLUMNS environment variables to set the window size regardless of + what the kernel returns. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-5.0, +and the previous version, readline-4.3. + +1. Changes to Readline + +a. Fixes to avoid core dumps because of null pointer references in the + multibyte character code. + +b. Fix to avoid infinite recursion caused by certain key combinations. + +c. Fixed a bug that caused the vi-mode `last command' to be set incorrectly. + +d. Readline no longer tries to read ahead more than one line of input, even + when more is available. + +e. Fixed the code that adjusts the point to not mishandle null wide + characters. + +f. Fixed a bug in the history expansion `g' modifier that caused it to skip + every other match. + +g. Fixed a bug that caused the prompt to overwrite previous output when the + output doesn't contain a newline and the locale supports multibyte + characters. This same change fixes the problem of readline redisplay + slowing down dramatically as the line gets longer in multibyte locales. + +h. History traversal with arrow keys in vi insertion mode causes the cursor + to be placed at the end of the new line, like in emacs mode. + +i. The locale initialization code does a better job of using the right + precedence and defaulting when checking the appropriate environment + variables. + +j. Fixed the history word tokenizer to handle <( and >( better when used as + part of bash. + +k. The overwrite mode code received several bug fixes to improve undo. + +l. Many speedups to the multibyte character redisplay code. + +m. The callback character reading interface should not hang waiting to read + keyboard input. + +n. Fixed a bug with redoing vi-mode `s' command. + +o. The code that initializes the terminal tracks changes made to the terminal + special characters with stty(1) (or equivalent), so that these changes + are reflected in the readline bindings. New application-callable function + to make it work: rl_tty_unset_default_bindings(). + +p. Fixed a bug that could cause garbage to be inserted in the buffer when + changing character case in vi mode when using a multibyte locale. + +q. Fixed a bug in the redisplay code that caused problems on systems + supporting multibyte characters when moving between history lines when the + new line has more glyphs but fewer bytes. + +r. Undo and redo now work better after exiting vi insertion mode. + +s. Make sure system calls are restarted after a SIGWINCH is received using + SA_RESTART. + +t. Improvements to the code that displays possible completions when using + multibyte characters. + +u. Fixed a problem when parsing nested if statements in inputrc files. + +v. The completer now takes multibyte characters into account when looking for + quoted substrings on which to perform completion. + +w. The history search functions now perform better bounds checking on the + history list. + +x. Change to history expansion functions to treat `^' as equivalent to word + one, as the documentation states. + +y. Some changes to the display code to improve display and redisplay of + multibyte characters. + +z. Changes to speed up the multibyte character redisplay code. + +aa. Fixed a bug in the vi-mode `E' command that caused it to skip over the + last character of a word if invoked while point was on the word's + next-to-last character. + +bb. Fixed a bug that could cause incorrect filename quoting when + case-insensitive completion was enabled and the word being completed + contained backslashes quoting word break characters. + +cc. Fixed a bug in redisplay triggered when the prompt string contains + invisible characters. + +dd. Fixed some display (and other) bugs encountered in multibyte locales + when a non-ascii character was the last character on a line. + +ee. Fixed some display bugs caused by multibyte characters in prompt strings. + +ff. Fixed a problem with history expansion caused by non-whitespace characters + used as history word delimiters. + +gg. Fixed a problem that could cause readline to refer to freed memory when + moving between history lines while doing searches. + +hh. Improvements to the code that expands and displays prompt strings + containing multibyte characters. + +ii. Fixed a problem with vi-mode not correctly remembering the numeric argument + to the last `c'hange command for later use with `.'. + +jj. Fixed a bug in vi-mode that caused multi-digit count arguments to work + incorrectly. + +kk. Fixed a problem in vi-mode that caused the last text modification command + to not be remembered across different command lines. + +ll. Fixed problems with changing characters and changing case at the end of + the line. + +mm. Fixed a problem with readline saving the contents of the current line + before beginning a non-interactive search. + +nn. Fixed a problem with EOF detection when using rl_event_hook. + +oo. Fixed a problem with the vi mode `p' and `P' commands ignoring numeric + arguments. + +2. New Features in Readline + +a. History expansion has a new `a' modifier equivalent to the `g' modifier + for compatibility with the BSD csh. + +b. History expansion has a new `G' modifier equivalent to the BSD csh `g' + modifier, which performs a substitution once per word. + +c. All non-incremental search operations may now undo the operation of + replacing the current line with the history line. + +d. The text inserted by an `a' command in vi mode can be reinserted with + `.'. + +e. New bindable variable, `show-all-if-unmodified'. If set, the readline + completer will list possible completions immediately if there is more + than one completion and partial completion cannot be performed. + +f. There is a new application-callable `free_history_entry()' function. + +g. History list entries now contain timestamp information; the history file + functions know how to read and write timestamp information associated + with each entry. + +h. Four new key binding functions have been added: + + rl_bind_key_if_unbound() + rl_bind_key_if_unbound_in_map() + rl_bind_keyseq_if_unbound() + rl_bind_keyseq_if_unbound_in_map() + +i. New application variable, rl_completion_quote_character, set to any + quote character readline finds before it calls the application completion + function. + +j. New application variable, rl_completion_suppress_quote, settable by an + application completion function. If set to non-zero, readline does not + attempt to append a closing quote to a completed word. + +k. New application variable, rl_completion_found_quote, set to a non-zero + value if readline determines that the word to be completed is quoted. + Set before readline calls any application completion function. + +l. New function hook, rl_completion_word_break_hook, called when readline + needs to break a line into words when completion is attempted. Allows + the word break characters to vary based on position in the line. + +m. New bindable command: unix-filename-rubout. Does the same thing as + unix-word-rubout, but adds `/' to the set of word delimiters. + +n. When listing completions, directories have a `/' appended if the + `mark-directories' option has been enabled. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-4.3, +and the previous version, readline-4.2a. + +1. Changes to Readline + +a. Fixed output of comment-begin character when listing variable values. + +b. Added some default key bindings for common escape sequences produced by + HOME and END keys. + +c. Fixed the mark handling code to be more emacs-compatible. + +d. A bug was fixed in the code that prints possible completions to keep it + from printing empty strings in certain circumstances. + +e. Change the key sequence printing code to print ESC as M\- if ESC is a + meta-prefix character -- it's easier for users to understand than \e. + +f. Fixed unstifle_history() to return values that match the documentation. + +g. Fixed the event loop (rl_event_hook) to handle the case where the input + file descriptor is invalidated. + +h. Fixed the prompt display code to work better when the application has a + custom redisplay function. + +i. Changes to make reading and writing the history file a little faster, and + to cope with huge history files without calling abort(3) from xmalloc. + +j. The vi-mode `S' and `s' commands are now undone correctly. + +k. Fixed a problem which caused the display to be messed up when the last + line of a multi-line prompt (possibly containing invisible characters) + was longer than the screen width. + +2. New Features in Readline + +a. Support for key `subsequences': allows, e.g., ESC and ESC-a to both + be bound to readline functions. Now the arrow keys may be used in vi + insert mode. + +b. When listing completions, and the number of lines displayed is more than + the screen length, readline uses an internal pager to display the results. + This is controlled by the `page-completions' variable (default on). + +c. New code to handle editing and displaying multibyte characters. + +d. The behavior introduced in bash-2.05a of deciding whether or not to + append a slash to a completed name that is a symlink to a directory has + been made optional, controlled by the `mark-symlinked-directories' + variable (default is the 2.05a behavior). + +e. The `insert-comment' command now acts as a toggle if given a numeric + argument: if the first characters on the line don't specify a + comment, insert one; if they do, delete the comment text + +f. New application-settable completion variable: + rl_completion_mark_symlink_dirs, allows an application's completion + function to temporarily override the user's preference for appending + slashes to names which are symlinks to directories. + +g. New function available to application completion functions: + rl_completion_mode, to tell how the completion function was invoked + and decide which argument to supply to rl_complete_internal (to list + completions, etc.). + +h. Readline now has an overwrite mode, toggled by the `overwrite-mode' + bindable command, which could be bound to `Insert'. + +i. New application-settable completion variable: + rl_completion_suppress_append, inhibits appending of + rl_completion_append_character to completed words. + +j. New key bindings when reading an incremental search string: ^W yanks + the currently-matched word out of the current line into the search + string; ^Y yanks the rest of the current line into the search string, + DEL or ^H deletes characters from the search string. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-4.2a, +and the previous version, readline-4.2. + +1. Changes to Readline + +a. More `const' and type casting fixes. + +b. Changed rl_message() to use vsnprintf(3) (if available) to fix buffer + overflow problems. + +c. The completion code no longer appends a `/' or ` ' to a match when + completing a symbolic link that resolves to a directory name, unless + the match does not add anything to the word being completed. This + means that a tab will complete the word up to the full name, but not + add anything, and a subsequent tab will add a slash. + +d. Fixed a trivial typo that made the vi-mode `dT' command not work. + +e. Fixed the tty code so that ^S and ^Q can be inserted with rl_quoted_insert. + +f. Fixed the tty code so that ^V works more than once. + +g. Changed the use of __P((...)) for function prototypes to PARAMS((...)) + because the use of __P in typedefs conflicted g++ and glibc. + +h. The completion code now attempts to do a better job of preserving the + case of the word the user typed if ignoring case in completions. + +i. Readline defaults to not echoing the input and lets the terminal + initialization code enable echoing if there is a controlling terminal. + +j. The key binding code now processes only two hex digits after a `\x' + escape sequence, and the documentation was changed to note that the + octal and hex escape sequences result in an eight-bit value rather + than strict ASCII. + +k. Fixed a few places where negative array subscripts could have occurred. + +l. Fixed the vi-mode code to use a better method to determine the bounds of + the array used to hold the marks, and to avoid out-of-bounds references. + +m. Fixed the defines in chardefs.h to work better when chars are signed. + +n. Fixed configure.in to use the new names for bash autoconf macros. + +o. Readline no longer attempts to define its own versions of some ctype + macros if they are implemented as functions in libc but not as macros in + . + +p. Fixed a problem where rl_backward could possibly set point to before + the beginning of the line. + +q. Fixed Makefile to not put -I/usr/include into CFLAGS, since it can cause + include file problems. + +2. New Features in Readline + +a. Added extern declaration for rl_get_termcap to readline.h, making it a + public function (it was always there, just not in readline.h). + +b. New #defines in readline.h: RL_READLINE_VERSION, currently 0x0402, + RL_VERSION_MAJOR, currently 4, and RL_VERSION_MINOR, currently 2. + +c. New readline variable: rl_readline_version, mirrors RL_READLINE_VERSION. + +d. New bindable boolean readline variable: match-hidden-files. Controls + completion of files beginning with a `.' (on Unix). Enabled by default. + +e. The history expansion code now allows any character to terminate a + `:first-' modifier, like csh. + +f. The incremental search code remembers the last search string and uses + it if ^R^R is typed without a search string. + +h. New bindable variable `history-preserve-point'. If set, the history + code attempts to place the user at the same location on each history + line retrieved with previous-history or next-history. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-4.2, +and the previous version, readline-4.1. + +1. Changes to Readline + +a. When setting the terminal attributes on systems using `struct termio', + readline waits for output to drain before changing the attributes. + +b. A fix was made to the history word tokenization code to avoid attempts to + dereference a null pointer. + +c. Readline now defaults rl_terminal_name to $TERM if the calling application + has left it unset, and tries to initialize with the resultant value. + +d. Instead of calling (*rl_getc_function)() directly to get input in certain + places, readline now calls rl_read_key() consistently. + +e. Fixed a bug in the completion code that allowed a backslash to quote a + single quote inside a single-quoted string. + +f. rl_prompt is no longer assigned directly from the argument to readline(), + but uses memory allocated by readline. This allows constant strings to + be passed to readline without problems arising when the prompt processing + code wants to modify the string. + +g. Fixed a bug that caused non-interactive history searches to return the + wrong line when performing multiple searches backward for the same string. + +h. Many variables, function arguments, and function return values are now + declared `const' where appropriate, to improve behavior when linking with + C++ code. + +i. The control character detection code now works better on systems where + `char' is unsigned by default. + +j. The vi-mode numeric argument is now capped at 999999, just like emacs mode. + +k. The Function, CPFunction, CPPFunction, and VFunction typedefs have been + replaced with a set of specific prototyped typedefs, though they are + still in the readline header files for backwards compatibility. + +m. Nearly all of the (undocumented) internal global variables in the library + now have an _rl_ prefix -- there were a number that did not, like + screenheight, screenwidth, alphabetic, etc. + +n. The ding() convenience function has been renamed to rl_ding(), though the + old function is still defined for backwards compatibility. + +o. The completion convenience functions filename_completion_function, + username_completion_function, and completion_matches now have an rl_ + prefix, though the old names are still defined for backwards compatibility. + +p. The functions shared by readline and bash (linkage is satisfied from bash + when compiling with bash, and internally otherwise) now have an sh_ prefix. + +q. Changed the shared library creation procedure on Linux and BSD/OS 4.x so + that the `soname' contains only the major version number rather than the + major and minor numbers. + +r. Fixed a redisplay bug that occurred when the prompt spanned more than one + physical line and contained invisible characters. + +s. Added a missing `includedir' variable to the Makefile. + +t. When installing the shared libraries, make sure symbolic links are relative. + +u. Added configure test so that it can set `${MAKE}' appropriately. + +v. Fixed a bug in rl_forward that could cause the point to be set to before + the beginning of the line in vi mode. + +w. Fixed a bug in the callback read-char interface to make it work when a + readline function pushes some input onto the input stream with + rl_execute_next (like the incremental search functions). + +x. Fixed a file descriptor leak in the history file manipulation code that + was tripped when attempting to truncate a non-regular file (like + /dev/null). + +y. Changes to make all of the exported readline functions declared in + readline.h have an rl_ prefix (rltty_set_default_bindings is now + rl_tty_set_default_bindings, crlf is now rl_crlf, etc.) + +z. The formatted documentation included in the base readline distribution + is no longer removed on a `make distclean'. + +aa. Some changes were made to avoid gcc warnings with -Wall. + +bb. rl_get_keymap_by_name now finds keymaps case-insensitively, so + `set keymap EMACS' works. + +cc. The history file writing and truncation functions now return a useful + status on error. + +dd. Fixed a bug that could cause applications to dereference a NULL pointer + if a NULL second argument was passed to history_expand(). + +ee. If a hook function assigned to rl_event_hook sets rl_done to a non-zero + value, rl_read_key() now immediately returns '\n' (which is assumed to + be bound to accept-line). + +2. New Features in Readline + +a. The blink timeout for paren matching is now settable by applications, + via the rl_set_paren_blink_timeout() function. + +b. _rl_executing_macro has been renamed to rl_executing_macro, which means + it's now part of the public interface. + +c. Readline has a new variable, rl_readline_state, which is a bitmap that + encapsulates the current state of the library; intended for use by + callbacks and hook functions. + +d. rlfe has a new -l option to log input and output (-a appends to logfile), + a new -n option to set the readline application name, and -v and -h + options for version and help information. + +e. rlfe can now perform filename completion for the inferior process if the + OS has a /proc//cwd that can be read with readlink(2) to get the + inferior's current working directory. + +f. A new file, rltypedefs.h, contains the new typedefs for function pointers + and is installed by `make install'. + +g. New application-callable function rl_set_prompt(const char *prompt): + expands its prompt string argument and sets rl_prompt to the result. + +h. New application-callable function rl_set_screen_size(int rows, int cols): + public method for applications to set readline's idea of the screen + dimensions. + +i. The history example program (examples/histexamp.c) is now built as one + of the examples. + +j. The documentation has been updated to cover nearly all of the public + functions and variables declared in readline.h. + +k. New function, rl_get_screen_size (int *rows, int *columns), returns + readline's idea of the screen dimensions. + +l. The timeout in rl_gather_tyi (readline keyboard input polling function) + is now settable via a function (rl_set_keyboard_input_timeout()). + +m. Renamed the max_input_history variable to history_max_entries; the old + variable is maintained for backwards compatibility. + +n. The list of characters that separate words for the history tokenizer is + now settable with a variable: history_word_delimiters. The default + value is as before. + +o. There is a new history.3 manual page documenting the history library. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-4.1, +and the previous version, readline-4.0. + +1. Changes to Readline + +a. Changed the HTML documents so that the table-of-contents is no longer + a separate file. + +b. Changes to the shared object configuration for: Irix 5.x, Irix 6.x, + OSF/1. + +c. The shared library major and minor versions are now constructed + automatically by configure and substituted into the makefiles. + +d. It's now possible to install the shared libraries separately from the + static libraries. + +e. The history library tries to truncate the history file only if it is a + regular file. + +f. A bug that caused _rl_dispatch to address negative array indices on + systems with signed chars was fixed. + +g. rl-yank-nth-arg now leaves the history position the same as when it was + called. + +h. Changes to the completion code to handle MS-DOS drive-letter:pathname + filenames. + +i. Completion is now case-insensitive by default on MS-DOS. + +j. Fixes to the history file manipulation code for MS-DOS. + +k. Readline attempts to bind the arrow keys to appropriate defaults on MS-DOS. + +l. Some fixes were made to the redisplay code for better operation on MS-DOS. + +m. The quoted-insert code will now insert tty special chars like ^C. + +n. A bug was fixed that caused the display code to reference memory before + the start of the prompt string. + +o. More support for __EMX__ (OS/2). + +p. A bug was fixed in readline's signal handling that could cause infinite + recursion in signal handlers. + +q. A bug was fixed that caused the point to be less than zero when rl_forward + was given a very large numeric argument. + +r. The vi-mode code now gets characters via the application-settable value + of rl_getc_function rather than calling rl_getc directly. + +s. The history file code now uses O_BINARY mode when reading and writing + the history file on cygwin32. + +t. Fixed a bug in the redisplay code for lines with more than 256 line + breaks. + +u. A bug was fixed which caused invisible character markers to not be + stripped from the prompt string if the terminal was in no-echo mode. + +v. Readline no longer tries to get the variables it needs for redisplay + from the termcap entry if the calling application has specified its + own redisplay function. Readline treats the terminal as `dumb' in + this case. + +w. Fixes to the SIGWINCH code so that a multiple-line prompt with escape + sequences is redrawn correctly. + +x. Changes to the install and install-shared targets so that the libraries + and header files are installed separately. + +2. New Features in Readline + +a. A new Readline `user manual' is in doc/rluserman.texinfo. + +b. Parentheses matching is now always compiled into readline, and enabled + or disabled when the value of the `blink-matching-paren' variable is + changed. + +c. MS-DOS systems now use ~/_inputrc as the last-ditch inputrc filename. + +d. MS-DOS systems now use ~/_history as the default history file. + +e. history-search-{forward,backward} now leave the point at the end of the + line when the string to search for is empty, like + {reverse,forward}-search-history. + +f. history-search-{forward,backward} now leave the last history line found + in the readline buffer if the second or subsequent search fails. + +g. New function for use by applications: rl_on_new_line_with_prompt, used + when an application displays the prompt itself before calling readline(). + +h. New variable for use by applications: rl_already_prompted. An application + that displays the prompt itself before calling readline() must set this to + a non-zero value. + +i. A new variable, rl_gnu_readline_p, always 1. The intent is that an + application can verify whether or not it is linked with the `real' + readline library or some substitute. + +j. Per Bothner's `rlfe' (pronounced `Ralphie') readline front-end program + is included in the examples subdirectory, though it is not built + by default. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-4.0, +and the previous version, readline-2.2. + +1. Changes to Readline + +a. The version number is now 4.0, to match the major and minor version + numbers on the shared readline and history libraries. Future + releases will maintain the identical numbering. + +b. Fixed a typo in the `make install' recipe that copied libreadline.a + to libhistory.old right after installing it. + +c. The readline and history info files are now installed out of the source + directory if they are not found in the build directory. + +d. The library no longer exports a function named `savestring' -- backwards + compatibility be damned. + +e. There is no longer any #ifdef SHELL code in the source files. + +f. Some changes were made to the key binding code to fix memory leaks and + better support Win32 systems. + +g. Fixed a silly typo in the paren matching code -- it's microseconds, not + milliseconds. + +h. The readline library should be compilable by C++ compilers. + +i. The readline.h public header file now includes function prototypes for + all readline functions, and some changes were made to fix errors in the + source files uncovered by the use of prototypes. + +j. The maximum numeric argument is now clamped at 1000000. + +k. Fixes to rl_yank_last_arg to make it behave better. + +l. Fixed a bug in the display code that caused core dumps if the prompt + string length exceeded 1024 characters. + +m. The menu completion code was fixed to properly insert a single completion + if there is only one match. + +n. A bug was fixed that caused the display code to improperly display tabs + after newlines. + +o. A fix was made to the completion code in which a typo caused the wrong + value to be passed to the function that computed the longest common + prefix of the list of matches. + +p. The completion code now checks the value of rl_filename_completion_desired, + which is set by application-supplied completion functions to indicate + that filename completion is being performed, to decide whether or not to + call an application-supplied `ignore completions' function. + +q. Code was added to the history library to catch history substitutions + using `&' without a previous history substitution or search having been + performed. + + +2. New Features in Readline + +a. There is a new script, support/shobj-conf, to do system-specific shared + object and library configuration. It generates variables for configure + to substitute into makefiles. The README file provides a detailed + explanation of the shared library creation process. + +b. Shared libraries and objects are now built in the `shlib' subdirectory. + There is a shlib/Makefile.in to control the build process. `make shared' + from the top-level directory is still the right way to build shared + versions of the libraries. + +c. rlconf.h is now installed, so applications can find out which features + have been compiled into the installed readline and history libraries. + +d. rlstdc.h is now an installed header file. + +e. Many changes to the signal handling: + o Readline now catches SIGQUIT and cleans up the tty before returning; + o A new variable, rl_catch_signals, is available to application writers + to indicate to readline whether or not it should install its own + signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, + SIGTTIN, and SIGTTOU; + o A new variable, rl_catch_sigwinch, is available to application + writers to indicate to readline whether or not it should install its + own signal handler for SIGWINCH, which will chain to the calling + applications's SIGWINCH handler, if one is installed; + o There is a new function, rl_free_line_state, for application signal + handlers to call to free up the state associated with the current + line after receiving a signal; + o There is a new function, rl_cleanup_after_signal, to clean up the + display and terminal state after receiving a signal; + o There is a new function, rl_reset_after_signal, to reinitialize the + terminal and display state after an application signal handler + returns and readline continues + +f. There is a new function, rl_resize_terminal, to reset readline's idea of + the screen size after a SIGWINCH. + +g. New public functions: rl_save_prompt and rl_restore_prompt. These were + previously private functions with a `_' prefix. These functions are + used when an application wants to write a message to the `message area' + with rl_message and have the prompt restored correctly when the message + is erased. + +h. New function hook: rl_pre_input_hook, called just before readline starts + reading input, after initialization. + +i. New function hook: rl_display_matches_hook, called when readline would + display the list of completion matches. The new function + rl_display_match_list is what readline uses internally, and is available + for use by application functions called via this hook. + +j. New bindable function, delete-char-or-list, like tcsh. + +k. A new variable, rl_erase_empty_line, which, if set by an application using + readline, will cause readline to erase, prompt and all, lines on which the + only thing typed was a newline. + +l. There is a new script, support/shlib-install, to install and uninstall + the shared readline and history libraries. + +m. A new bindable variable, `isearch-terminators', which is a string + containing the set of characters that should terminate an incremental + search without being executed as a command. + +n. A new bindable function, forward-backward-delete-char. + +------------------------------------------------------------------------------- +This document details the changes between this version, readline-2.2, +and the previous version, readline-2.1. + +1. Changes to Readline + +a. Added a missing `extern' to a declaration in readline.h that kept + readline from compiling cleanly on some systems. + +b. The history file is now opened with mode 0600 when it is written for + better security. + +c. Changes were made to the SIGWINCH handling code so that prompt redisplay + is done better. + +d. ^G now interrupts incremental searches correctly. + +e. A bug that caused a core dump when the set of characters to be quoted + when completing words was empty was fixed. + +f. Fixed a problem in the readline test program rltest.c that caused a core + dump. + +g. The code that handles parser directives in inputrc files now displays + more error messages. + +h. The history expansion code was fixed so that the appearance of the + history comment character at the beginning of a word inhibits history + expansion for that word and the rest of the input line. + +i. The code that prints completion listings now behaves better if one or + more of the filenames contains non-printable characters. + +j. The time delay when showing matching parentheses is now 0.5 seconds. + + +2. New Features in Readline + +a. There is now an option for `iterative' yank-last-arg handline, so a user + can keep entering `M-.', yanking the last argument of successive history + lines. + +b. New variable, `print-completions-horizontally', which causes completion + matches to be displayed across the screen (like `ls -x') rather than up + and down the screen (like `ls'). + +c. New variable, `completion-ignore-case', which causes filename completion + and matching to be performed case-insensitively. + +d. There is a new bindable command, `magic-space', which causes history + expansion to be performed on the current readline buffer and a space to + be inserted into the result. + +e. There is a new bindable command, `menu-complete', which enables tcsh-like + menu completion (successive executions of menu-complete insert a single + completion match, cycling through the list of possible completions). + +f. There is a new bindable command, `paste-from-clipboard', for use on Win32 + systems, to insert the text from the Win32 clipboard into the editing + buffer. + +g. The key sequence translation code now understands printf-style backslash + escape sequences, including \NNN octal escapes. These escape sequences + may be used in key sequence definitions or macro values. + +h. An `$include' inputrc file parser directive has been added. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + 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 +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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 Lesser General +Public License instead of this License. But first, please read +. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..293ef70 --- /dev/null +++ b/INSTALL @@ -0,0 +1,310 @@ +Basic Installation +================== + +These are installation instructions for Readline-8.2. + +The simplest way to compile readline is: + + 1. `cd' to the directory containing the readline source code and type + `./configure' to configure readline for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes some time. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile readline and build the static readline + and history libraries. If supported, the shared readline and history + libraries will be built also. See below for instructions on compiling + the other parts of the distribution. Typing `make everything' will + cause the static and shared libraries (if supported) and the example + programs to be built. + + 3. Type `make install' to install the static readline and history + libraries, the readline include files, the documentation, and, if + supported, the shared readline and history libraries. + + 4. You can remove the created libraries and object files from the + build directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile readline for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the readline developers, and should be used with care. + +The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It +uses those values to create a `Makefile' in the build directory, +and Makefiles in the `doc', `shlib', and `examples' +subdirectories. It also creates a `config.h' file containing +system-dependent definitions. Finally, it creates a shell script +`config.status' that you can run in the future to recreate the +current configuration, a file `config.cache' that saves the +results of its tests to speed up reconfiguring, and a file +`config.log' containing compiler output (useful mainly for +debugging `configure'). + +If you need to do unusual things to compile readline, please try +to figure out how `configure' could check whether to do them, and +mail diffs or instructions to so they can +be considered for the next release. If at some point +`config.cache' contains results you don't want to keep, you may +remove or edit it. + +The file `configure.in' is used to create `configure' by a +program called `autoconf'. You only need `configure.in' if you +want to change it or regenerate `configure' using a newer version +of `autoconf'. The readline `configure.in' requires autoconf +version 2.69 or newer. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + +You can compile readline for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + +If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile readline for one architecture at a +time in the source code directory. After you have installed +readline for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' will install the readline libraries in +`/usr/local/lib', the include files in +`/usr/local/include/readline', the man pages in `/usr/local/man', +and the info files in `/usr/local/info'. You can specify an +installation prefix other than `/usr/local' by giving `configure' +the option `--prefix=PATH' or by supplying a value for the +DESTDIR variable when running `make install'. + +You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. +If you give `configure' the option `--exec-prefix=PATH', the +readline Makefiles will use PATH as the prefix for installing the +libraries. Documentation and other data files will still use the +regular prefix. + +Specifying the System Type +========================== + +There may be some features `configure' can not figure out +automatically, but need to determine by the type of host readline +will run on. Usually `configure' can figure that out, but if it +prints a message saying it can not guess the host type, give it +the `--host=TYPE' option. TYPE can either be a short name for +the system type, such as `sun4', or a canonical name with three +fields: CPU-COMPANY-SYSTEM (e.g., i386-unknown-freebsd4.2). + +See the file `config.sub' for the possible values of each field. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: the readline `configure' looks for a site script, but not +all `configure' scripts do. + +Operation Controls +================== + +`configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + +Optional Features +================= + +The readline `configure' recognizes two `--with-PACKAGE' options: + +`--with-curses' + This tells readline that it can find the termcap library functions + (tgetent, et al.) in the curses library, rather than a separate + termcap library. Readline uses the termcap functions, but does not + usually link with the termcap or curses library itself, allowing + applications which link with readline the to choose an appropriate + library. This option tells readline to link the example programs with + the curses library rather than libtermcap. + +`--with-shared-termcap-library' + This tells the readline build process to link the shared version of + libreadline against a shared version of the curses or termcap library + (see the description of SHLIB_LIBS below under `Shared Libraries'). + This relieves the application of having to link with curses or termcap + itself, but does not allow the application to choose which library to + use. This is only effective on systems that build shared libraries (see + below; the default for shared libraries is `yes'). + +`configure' also recognizes several `--enable-FEATURE' options: + +`--enable-bracketed-paste-default' + Enable bracketed paste by default, so the initial value of the + `enable-bracketed-paste' Readline variable is `on'. The default + is `yes'. + +`--enable-install-examples' + Install the readline example programs as part of `make install'. + +`--enable-multibyte' + Build with support for multibyte characters enabled on systems with the + necessary framework (locale definitions, C library functions, etc.). The + default is `yes'. + +`--enable-shared' + Build the shared libraries by default on supported platforms. The + default is `yes'. + +`--enable-static' + Build the static libraries by default. The default is `yes'. + +Shared Libraries +================ + +There is support for building shared versions of the readline and +history libraries. The configure script creates a Makefile in +the `shlib' subdirectory, and typing `make shared' will cause +shared versions of the readline and history libraries to be built +on supported platforms. + +If `configure' is given the `--enable-shared' option, it will attempt +to build the shared libraries by default on supported platforms. This +option is enabled by default. + +Configure calls the script support/shobj-conf to test whether or +not shared library creation is supported and to generate the values +of variables that are substituted into shlib/Makefile. If you +try to build shared libraries on an unsupported platform, `make' +will display a message asking you to update support/shobj-conf for +your platform. + +If you need to update support/shobj-conf, you will need to create +a `stanza' for your operating system and compiler. The script uses +the value of host_os and ${CC} as determined by configure. For +instance, FreeBSD 4.2 with any version of gcc is identified as +`freebsd4.2-gcc*'. + +In the stanza for your operating system-compiler pair, you will need to +define several variables. They are: + +SHOBJ_CC The C compiler used to compile source files into shareable + object files. This is normally set to the value of ${CC} + by configure, and should not need to be changed. + +SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create + position-independent code. If you are using gcc, this + should probably be set to `-fpic'. + +SHOBJ_LD The link editor to be used to create the shared library from + the object files created by $SHOBJ_CC. If you are using + gcc, a value of `gcc' will probably work. + +SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation. + If you are using gcc, `-shared' may be all that is necessary. + These should be the flags needed for generic shared object + creation. + +SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library + creation. Many systems use the -R option to the link + editor to embed a path within the library for run-time + library searches. A reasonable value for such systems would + be `-R$(libdir)'. + +SHLIB_LIBS Any additional libraries that shared libraries should be + linked against when they are created. + +SHLIB_LIBPREF The prefix to use when generating the filename of the shared + library. The default is `lib'; Cygwin uses `cyg'. + +SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when + generating the filename of the shared library. Many systems + use `so'; HP-UX uses `sl'. + +SHLIB_LIBVERSION The string to append to the filename to indicate the version + of the shared library. It should begin with $(SHLIB_LIBSUFF), + and possibly include version information that allows the + run-time loader to load the version of the shared library + appropriate for a particular program. Systems using shared + libraries similar to SunOS 4.x use major and minor library + version numbers; for those systems a value of + `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate. + Systems based on System V Release 4 don't use minor version + numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems. + Other Unix versions use different schemes. + +SHLIB_DLLVERSION The version number for shared libraries that determines API + compatibility between readline versions and the underlying + system. Used only on Cygwin. Defaults to $SHLIB_MAJOR, but + can be overridden at configuration time by defining DLLVERSION + in the environment. + +SHLIB_DOT The character used to separate the name of the shared library + from the suffix and version information. The default is `.'; + systems like Cygwin which don't separate version information + from the library name should set this to the empty string. + +SHLIB_STATUS Set this to `supported' when you have defined the other + necessary variables. Make uses this to determine whether + or not shared library creation should be attempted. If + shared libraries are not supported, this will be set to + `unsupported'. + +You should look at the existing stanzas in support/shobj-conf for ideas. + +Once you have updated support/shobj-conf, re-run configure and type +`make shared' or `make'. The shared libraries will be created in the +shlib subdirectory. + +If shared libraries are created, `make install' will install them. +You may install only the shared libraries by running `make +install-shared' from the top-level build directory. Running `make +install' in the shlib subdirectory will also work. If you don't want +to install any created shared libraries, run `make install-static'. diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..db689b3 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,171 @@ +# +# Master distribution manifest for the standalone readline distribution +# +doc d +examples d +examples/autoconf d +examples/rlfe d +support d +shlib d +m4 d +COPYING f +README f +MANIFEST f +INSTALL f +CHANGELOG f +CHANGES f +NEWS f +USAGE f +aclocal.m4 f +config.h.in f +configure f 755 +configure.ac f +m4/codeset.m4 f +Makefile.in f +readline.pc.in f +history.pc.in f +ansi_stdlib.h f +chardefs.h f +colors.h f +history.h f +histlib.h f +keymaps.h f +parse-colors.h f +posixdir.h f +posixjmp.h f +posixselect.h f +posixstat.h f +posixtime.h f +readline.h f +rlconf.h f +rldefs.h f +rlmbutil.h f +rlprivate.h f +rlshell.h f +rlstdc.h f +rltty.h f +rltypedefs.h f +rlwinsize.h f +tcap.h f +tilde.h f +xmalloc.h f +bind.c f +callback.c f +colors.c f +compat.c f +complete.c f +display.c f +emacs_keymap.c f +funmap.c f +input.c f +isearch.c f +keymaps.c f +kill.c f +macro.c f +mbutil.c f +misc.c f +nls.c f +parens.c f +parse-colors.c f +readline.c f +rltty.c f +savestring.c f +search.c f +shell.c f +signals.c f +terminal.c f +text.c f +tilde.c f +undo.c f +util.c f +vi_keymap.c f +vi_mode.c f +xfree.c f +xmalloc.c f +history.c f +histexpand.c f +histfile.c f +histsearch.c f +patchlevel f +shlib/Makefile.in f +support/config.guess f +support/config.rpath f +support/config.sub f +support/install.sh f +support/mkdirs f +support/mkdist f +support/mkinstalldirs f +support/shobj-conf f +support/shlib-install f +support/wcwidth.c f +doc/Makefile.in f +doc/texinfo.tex f +doc/version.texi f +doc/fdl.texi f +doc/rlman.texi f +doc/rltech.texi f +doc/rluser.texi f +doc/rluserman.texi f +doc/history.texi f +doc/hstech.texi f +doc/hsuser.texi f +doc/readline.3 f +doc/history.3 f +doc/texi2dvi f +doc/texi2html f +examples/Makefile.in f +examples/excallback.c f +examples/fileman.c f +examples/manexamp.c f +examples/readlinebuf.h f +examples/rl-fgets.c f +examples/rlbasic.c f +examples/rlcat.c f +examples/rlevent.c f +examples/rlkeymaps.c f +examples/rltest.c f +examples/rl-callbacktest.c f +examples/rl-timeout.c f +examples/rl-test-timeout f +examples/rl.c f +examples/rlptytest.c f +examples/rlversion.c f +examples/histexamp.c f +examples/hist_erasedups.c f +examples/hist_purgecmd.c f +examples/Inputrc f +examples/autoconf/BASH_CHECK_LIB_TERMCAP f +examples/autoconf/RL_LIB_READLINE_VERSION f +examples/autoconf/wi_LIB_READLINE f +examples/rlfe/ChangeLog f +examples/rlfe/Makefile.in f +examples/rlfe/README f +examples/rlfe/config.h.in f +examples/rlfe/configure f 755 +examples/rlfe/configure.in f +examples/rlfe/extern.h f +examples/rlfe/os.h f +examples/rlfe/pty.c f +examples/rlfe/rlfe.c f +examples/rlfe/screen.h f +examples/rlwrap-0.30.tar.gz f +# formatted documentation, from MANIFEST.doc +doc/readline.ps f +doc/history.ps f +doc/rluserman.ps f +doc/readline.dvi f +doc/history.dvi f +doc/rluserman.dvi f +doc/readline.info f +doc/history.info f +doc/rluserman.info f +doc/readline.html f +doc/history.html f +doc/rluserman.html f +doc/readline.0 f +doc/history.0 f +doc/readline_3.ps f +doc/history_3.ps f +doc/history.pdf f +doc/readline.pdf f +doc/rluserman.pdf f diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..2120daa --- /dev/null +++ b/Makefile.in @@ -0,0 +1,610 @@ +## -*- text -*- ## +# Master Makefile for the GNU readline library. +# Copyright (C) 1994-2018 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 3 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, see . + +RL_LIBRARY_VERSION = @LIBVERSION@ +RL_LIBRARY_NAME = readline + +PACKAGE = @PACKAGE_NAME@ +VERSION = @PACKAGE_VERSION@ + +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_VERSION = @PACKAGE_VERSION@ + +PACKAGE_TARNAME = @PACKAGE_TARNAME@ + +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 + +@SET_MAKE@ +SHELL = @MAKE_SHELL@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +datarootdir = @datarootdir@ + +bindir = @bindir@ +libdir = @libdir@ +mandir = @mandir@ +includedir = @includedir@ +datadir = @datadir@ +localedir = @localedir@ +pkgconfigdir = ${libdir}/pkgconfig + +infodir = @infodir@ + +docdir = @docdir@ + +man3dir = $(mandir)/man3 + +# Support an alternate destination root directory for package building +DESTDIR = + +# Programs to make tags files. +ETAGS = etags +CTAGS = ctags -w + +CFLAGS = @CFLAGS@ +LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' @BRACKETED_PASTE@ +CPPFLAGS = @CPPFLAGS@ + +DEFS = @DEFS@ @CROSS_COMPILE@ +LOCAL_DEFS = @LOCAL_DEFS@ + +TERMCAP_LIB = @TERMCAP_LIB@ + +# For libraries which include headers from other libraries. +INCLUDES = -I. -I$(srcdir) + +XCCFLAGS = $(ASAN_CFLAGS) $(DEFS) $(LOCAL_DEFS) $(INCLUDES) $(CPPFLAGS) +CCFLAGS = $(XCCFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) + +# could add -Werror here +GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \ + -Wwrite-strings -Wstrict-prototypes \ + -Wmissing-prototypes -Wno-implicit -pedantic +GCC_LINT_CFLAGS = $(XCCFLAGS) $(GCC_LINT_FLAGS) @CFLAGS@ @LOCAL_CFLAGS@ + +ASAN_XCFLAGS = -fsanitize=address -fno-omit-frame-pointer +ASAN_XLDFLAGS = -fsanitize=address + +install_examples = @EXAMPLES_INSTALL_TARGET@ + +.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)/xfree.c \ + $(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \ + $(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \ + $(srcdir)/shell.c $(srcdir)/savestring.c $(srcdir)/tilde.c \ + $(srcdir)/text.c $(srcdir)/misc.c $(srcdir)/compat.c \ + $(srcdir)/mbutil.c + +# The header files for this library. +HSOURCES = $(srcdir)/readline.h $(srcdir)/rldefs.h $(srcdir)/chardefs.h \ + $(srcdir)/keymaps.h $(srcdir)/history.h $(srcdir)/histlib.h \ + $(srcdir)/posixstat.h $(srcdir)/posixdir.h $(srcdir)/posixjmp.h \ + $(srcdir)/tilde.h $(srcdir)/rlconf.h $(srcdir)/rltty.h \ + $(srcdir)/ansi_stdlib.h $(srcdir)/tcap.h $(srcdir)/rlstdc.h \ + $(srcdir)/xmalloc.h $(srcdir)/rlprivate.h $(srcdir)/rlshell.h \ + $(srcdir)/rltypedefs.h $(srcdir)/rlmbutil.h \ + $(srcdir)/colors.h $(srcdir)/parse-colors.h + +HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o mbutil.o +TILDEOBJ = tilde.o +COLORSOBJ = colors.o parse-colors.o +OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \ + rltty.o complete.o bind.o isearch.o display.o signals.o \ + util.o kill.o undo.o macro.o input.o callback.o terminal.o \ + text.o nls.o misc.o $(HISTOBJ) $(TILDEOBJ) $(COLORSOBJ) \ + xmalloc.o xfree.o compat.o + +# 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 readline.pc history.pc +CREATED_TAGS = TAGS tags + +INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h \ + rlstdc.h rlconf.h rltypedefs.h + +OTHER_DOCS = $(srcdir)/CHANGES $(srcdir)/INSTALL $(srcdir)/README +OTHER_INSTALLED_DOCS = CHANGES INSTALL README + +########################################################################## +TARGETS = @STATIC_TARGET@ @SHARED_TARGET@ +INSTALL_TARGETS = @STATIC_INSTALL_TARGET@ @SHARED_INSTALL_TARGET@ + +all: $(TARGETS) + +everything: all examples + +asan: + ${MAKE} ${MFLAGS} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' everything + +static: $(STATIC_LIBS) + +libreadline.a: $(OBJECTS) + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(OBJECTS) + -test -n "$(RANLIB)" && $(RANLIB) $@ + +libhistory.a: $(HISTOBJ) xmalloc.o xfree.o + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(HISTOBJ) xmalloc.o xfree.o + -test -n "$(RANLIB)" && $(RANLIB) $@ + +# Since tilde.c is shared between readline and bash, make sure we compile +# it with the right flags when it's built as part of readline +tilde.o: tilde.c + rm -f $@ + $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -c $(srcdir)/tilde.c + +readline: $(OBJECTS) readline.h rldefs.h chardefs.h ./libreadline.a + $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -o $@ $(top_srcdir)/examples/rl.c ./libreadline.a ${TERMCAP_LIB} + +lint: force + $(MAKE) $(MFLAGS) CCFLAGS='$(GCC_LINT_CFLAGS)' static + +Makefile makefile: config.status $(srcdir)/Makefile.in + CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status + +Makefiles makefiles: config.status $(srcdir)/Makefile.in + @for mf in $(CREATED_MAKEFILES); do \ + CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \ + done + +config.status: configure + $(SHELL) ./config.status --recheck + +config.h: stamp-h + +stamp-h: config.status $(srcdir)/config.h.in + CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status + echo > $@ + +#$(srcdir)/configure: $(srcdir)/configure.ac ## 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: $(INSTALL_TARGETS) + +install-headers: installdirs ${INSTALLED_HEADERS} + for f in ${INSTALLED_HEADERS}; do \ + $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(includedir)/readline ; \ + done + +uninstall-headers: + -test -n "$(includedir)" && cd $(DESTDIR)$(includedir)/readline && \ + ${RM} ${INSTALLED_HEADERS} + +maybe-uninstall-headers: uninstall-headers + +install-pc: installdirs + -$(INSTALL_DATA) $(BUILD_DIR)/readline.pc $(DESTDIR)$(pkgconfigdir)/readline.pc + -$(INSTALL_DATA) $(BUILD_DIR)/history.pc $(DESTDIR)$(pkgconfigdir)/history.pc + +uninstall-pc: + -test -n "$(pkgconfigdir)" && cd $(DESTDIR)$(pkgconfigdir) && \ + ${RM} readline.pc history.pc + +maybe-uninstall-pc: uninstall-pc + +install-static: installdirs $(STATIC_LIBS) install-headers install-doc ${install_examples} install-pc + -$(MV) $(DESTDIR)$(libdir)/libreadline.a $(DESTDIR)$(libdir)/libreadline.old + $(INSTALL_DATA) libreadline.a $(DESTDIR)$(libdir)/libreadline.a + -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libreadline.a + -$(MV) $(DESTDIR)$(libdir)/libhistory.a $(DESTDIR)$(libdir)/libhistory.old + $(INSTALL_DATA) libhistory.a $(DESTDIR)$(libdir)/libhistory.a + -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libhistory.a + +installdirs: $(srcdir)/support/mkinstalldirs + -$(SHELL) $(srcdir)/support/mkinstalldirs $(DESTDIR)$(includedir) \ + $(DESTDIR)$(includedir)/readline $(DESTDIR)$(libdir) \ + $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir) $(DESTDIR)$(docdir) \ + $(DESTDIR)$(pkgconfigdir) + +uninstall: uninstall-headers uninstall-doc uninstall-examples uninstall-pc + -test -n "$(DESTDIR)$(libdir)" && cd $(DESTDIR)$(libdir) && \ + ${RM} libreadline.a libreadline.old libhistory.a libhistory.old $(SHARED_LIBS) + -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) + +install-shared: installdirs install-headers shared install-doc install-pc + ( cd shlib ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install ) + +uninstall-shared: maybe-uninstall-headers maybe-uninstall-pc + -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) + +install-examples: installdirs install-headers + -( cd examples ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install ) + +uninstall-examples: maybe-uninstall-headers + -( cd examples; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) + +install-doc: installdirs + $(INSTALL_DATA) $(OTHER_DOCS) $(DESTDIR)$(docdir) + -( if test -d doc ; then \ + cd doc && \ + ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} install; \ + fi ) + +uninstall-doc: + -( cd $(DESTDIR)$(docdir) && ${RM} ${OTHER_INSTALLED_DOCS} ) + -( if test -d doc ; then \ + cd doc && \ + ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} uninstall; \ + fi ) + +TAGS: force + -( cd $(srcdir) && $(ETAGS) $(CSOURCES) $(HSOURCES) ) + +tags: force + -( cd $(srcdir) && $(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) + +readline.pc: config.status $(srcdir)/readline.pc.in + $(SHELL) config.status + +history.pc: config.status $(srcdir)/history.pc.in + $(SHELL) config.status + +info dvi html pdf ps: + -( cd doc && $(MAKE) $(MFLAGS) $@ ) + +install-info: +install-dvi: +install-html: +install-pdf: +install-ps: +check: +installcheck: + +dist: force + @echo Readline distributions are created using $(srcdir)/support/mkdist. + @echo Here is a sample of the necessary commands: + @echo bash $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r $(RL_LIBRARY_NAME) $(RL_LIBRARY_VERSION) + @echo tar cf $(RL_LIBRARY_NAME)-${RL_LIBRARY_VERSION}.tar ${RL_LIBRARY_NAME}-$(RL_LIBRARY_VERSION) + @echo gzip $(RL_LIBRARY_NAME)-$(RL_LIBRARY_VERSION).tar + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Dependencies +bind.o: ansi_stdlib.h posixstat.h +bind.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +bind.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +bind.o: history.h +callback.o: rlconf.h +callback.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +callback.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +compat.o: ${BUILD_DIR}/config.h +compat.o: rlstdc.h rltypedefs.h +complete.o: ansi_stdlib.h posixdir.h posixstat.h +complete.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +complete.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +display.o: ansi_stdlib.h posixstat.h +display.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +display.o: tcap.h +display.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +display.o: history.h rlstdc.h +funmap.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +funmap.o: rlconf.h ansi_stdlib.h rlstdc.h +funmap.o: ${BUILD_DIR}/config.h +histexpand.o: ansi_stdlib.h +histexpand.o: history.h histlib.h rlstdc.h rltypedefs.h +histexpand.o: ${BUILD_DIR}/config.h +histfile.o: ansi_stdlib.h +histfile.o: history.h histlib.h rlstdc.h rltypedefs.h +histfile.o: ${BUILD_DIR}/config.h +history.o: ansi_stdlib.h +history.o: history.h histlib.h rlstdc.h rltypedefs.h +history.o: ${BUILD_DIR}/config.h +histsearch.o: ansi_stdlib.h +histsearch.o: history.h histlib.h rlstdc.h rltypedefs.h +histsearch.o: ${BUILD_DIR}/config.h +input.o: ansi_stdlib.h +input.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +input.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +isearch.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +isearch.o: ansi_stdlib.h history.h rlstdc.h +keymaps.o: emacs_keymap.c vi_keymap.c +keymaps.o: keymaps.h rltypedefs.h chardefs.h rlconf.h ansi_stdlib.h +keymaps.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +keymaps.o: ${BUILD_DIR}/config.h rlstdc.h +kill.o: ansi_stdlib.h +kill.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +kill.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +kill.o: history.h rlstdc.h +macro.o: ansi_stdlib.h +macro.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +macro.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +macro.o: history.h rlstdc.h +mbutil.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +mbutil.o: readline.h keymaps.h rltypedefs.h chardefs.h rlstdc.h +misc.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +misc.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +misc.o: history.h rlstdc.h ansi_stdlib.h +nls.o: ansi_stdlib.h +nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +nls.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +nls.o: history.h rlstdc.h +parens.o: rlconf.h +parens.o: ${BUILD_DIR}/config.h +parens.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +readline.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +readline.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +readline.o: history.h rlstdc.h +readline.o: posixstat.h ansi_stdlib.h posixjmp.h +rltty.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +rltty.o: rltty.h +rltty.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +savestring.o: ${BUILD_DIR}/config.h +search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +search.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +search.o: ansi_stdlib.h history.h rlstdc.h +shell.o: ${BUILD_DIR}/config.h +shell.o: ansi_stdlib.h +signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +signals.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +signals.o: history.h rlstdc.h +terminal.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +terminal.o: tcap.h +terminal.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +terminal.o: history.h rlstdc.h +text.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +text.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +text.o: history.h rlstdc.h ansi_stdlib.h +tilde.o: ansi_stdlib.h +tilde.o: ${BUILD_DIR}/config.h +tilde.o: tilde.h +undo.o: ansi_stdlib.h +undo.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +undo.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +undo.o: history.h rlstdc.h +util.o: posixjmp.h ansi_stdlib.h +util.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +util.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h +vi_mode.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h +vi_mode.o: history.h ansi_stdlib.h rlstdc.h +xfree.o: ${BUILD_DIR}/config.h +xfree.o: ansi_stdlib.h +xmalloc.o: ${BUILD_DIR}/config.h +xmalloc.o: ansi_stdlib.h + +colors.o: ${BUILD_DIR}/config.h colors.h +colors.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h +colors.o: rlconf.h +colors.o: ansi_stdlib.h posixstat.h +parse-colors.o: ${BUILD_DIR}/config.h colors.h parse-colors.h +parse-colors.o: rldefs.h rlconf.h +parse-colors.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h + +bind.o: rlshell.h +histfile.o: rlshell.h +nls.o: rlshell.h +readline.o: rlshell.h +shell.o: rlshell.h +terminal.o: rlshell.h +histexpand.o: rlshell.h + +bind.o: rlprivate.h +callback.o: rlprivate.h +complete.o: rlprivate.h +display.o: rlprivate.h +input.o: rlprivate.h +isearch.o: rlprivate.h +kill.o: rlprivate.h +macro.o: rlprivate.h +mbutil.o: rlprivate.h +misc.o: rlprivate.h +nls.o: rlprivate.h +parens.o: rlprivate.h +readline.o: rlprivate.h +rltty.o: rlprivate.h +search.o: rlprivate.h +signals.o: rlprivate.h +terminal.o: rlprivate.h +text.o: rlprivate.h +undo.o: rlprivate.h +util.o: rlprivate.h +vi_mode.o: rlprivate.h +colors.o: rlprivate.h +parse-colors.o: rlprivate.h + +bind.o: xmalloc.h +callback.o: xmalloc.h +complete.o: xmalloc.h +display.o: xmalloc.h +funmap.o: xmalloc.h +histexpand.o: xmalloc.h +histfile.o: xmalloc.h +history.o: xmalloc.h +input.o: xmalloc.h +isearch.o: xmalloc.h +keymaps.o: xmalloc.h +kill.o: xmalloc.h +macro.o: xmalloc.h +mbutil.o: xmalloc.h +misc.o: xmalloc.h +readline.o: xmalloc.h +savestring.o: xmalloc.h +search.o: xmalloc.h +shell.o: xmalloc.h +terminal.o: xmalloc.h +text.o: xmalloc.h +tilde.o: xmalloc.h +undo.o: xmalloc.h +util.o: xmalloc.h +vi_mode.o: xmalloc.h +xfree.o: xmalloc.h +xmalloc.o: xmalloc.h +colors.o: xmalloc.h +parse-colors.o: xmalloc.h + +complete.o: rlmbutil.h +display.o: rlmbutil.h +histexpand.o: rlmbutil.h +input.o: rlmbutil.h +isearch.o: rlmbutil.h +mbutil.o: rlmbutil.h +misc.o: rlmbutil.h +readline.o: rlmbutil.h +search.o: rlmbutil.h +text.o: rlmbutil.h +vi_mode.o: rlmbutil.h + +bind.o: $(srcdir)/bind.c +callback.o: $(srcdir)/callback.c +compat.o: $(srcdir)/compat.c +complete.o: $(srcdir)/complete.c +display.o: $(srcdir)/display.c +funmap.o: $(srcdir)/funmap.c +input.o: $(srcdir)/input.c +isearch.o: $(srcdir)/isearch.c +keymaps.o: $(srcdir)/keymaps.c $(srcdir)/emacs_keymap.c $(srcdir)/vi_keymap.c +kill.o: $(srcdir)/kill.c +macro.o: $(srcdir)/macro.c +mbutil.o: $(srcdir)/mbutil.c +misc.o: $(srcdir)/misc.c +nls.o: $(srcdir)/nls.c +parens.o: $(srcdir)/parens.c +readline.o: $(srcdir)/readline.c +rltty.o: $(srcdir)/rltty.c +savestring.o: $(srcdir)/savestring.c +search.o: $(srcdir)/search.c +shell.o: $(srcdir)/shell.c +signals.o: $(srcdir)/signals.c +terminal.o: $(srcdir)/terminal.c +text.o: $(srcdir)/text.c +tilde.o: $(srcdir)/tilde.c +undo.o: $(srcdir)/undo.c +util.o: $(srcdir)/util.c +vi_mode.o: $(srcdir)/vi_mode.c +xfree.o: $(srcdir)/xfree.c +xmalloc.o: $(srcdir)/xmalloc.c + +colors.o: $(srcdir)/parse-colors.c +parse-colors.o: $(srcdir)/parse-colors.c + +histexpand.o: $(srcdir)/histexpand.c +histfile.o: $(srcdir)/histfile.c +history.o: $(srcdir)/history.c +histsearch.o: $(srcdir)/histsearch.c + +bind.o: bind.c +callback.o: callback.c +compat.o: compat.c +complete.o: complete.c +display.o: display.c +funmap.o: funmap.c +input.o: input.c +isearch.o: isearch.c +keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c +kill.o: kill.c +macro.o: macro.c +mbutil.o: mbutil.c +misc.o: misc.c +nls.o: nls.c +parens.o: parens.c +readline.o: readline.c +rltty.o: rltty.c +savestring.o: savestring.c +search.o: search.c +shell.o: shell.c +signals.o: signals.c +terminal.o: terminal.c +text.o: text.c +tilde.o: tilde.c +undo.o: undo.c +util.o: util.c +vi_mode.o: vi_mode.c +xfree.o: xfree.c +xmalloc.o: xmalloc.c + +histexpand.o: histexpand.c +histfile.o: histfile.c +history.o: history.c +histsearch.o: histsearch.c diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..1d88606 --- /dev/null +++ b/NEWS @@ -0,0 +1,485 @@ +This is a terse description of the new features added to readline-8.2 since +the release of readline-8.1. + +New Features in Readline + +a. There is now an HS_HISTORY_VERSION containing the version number of the + history library for applications to use. + +b. History expansion better understands multiple history expansions that may + contain strings that would ordinarily inhibit history expansion (e.g., + `abc!$!$'). + +c. There is a new framework for readline timeouts, including new public + functions to set timeouts and query how much time is remaining before a + timeout hits, and a hook function that can trigger when readline times + out. There is a new state value to indicate a timeout. + +d. Automatically bind termcap key sequences for page-up and page-down to + history-search-backward and history-search-forward, respectively. + +e. There is a new `fetch-history' bindable command that retrieves the history + entry corresponding to its numeric argument. Negative arguments count back + from the end of the history. + +f. `vi-undo' is now a bindable command. + +g. There is a new option: `enable-active-region'. This separates control of + the active region and bracketed-paste. It has the same default value as + bracketed-paste, and enabling bracketed paste enables the active region. + Users can now turn off the active region while leaving bracketed paste + enabled. + +h. rl_completer_word_break_characters is now `const char *' like + rl_basic_word_break_characters. + +i. Readline looks in $LS_COLORS for a custom filename extension + (*.readline-colored-completion-prefix) and uses that as the default color + for the common prefix displayed when `colored-completion-prefix' is set. + +j. Two new bindable string variables: active-region-start-color and + active-region-end-color. The first sets the color used to display the + active region; the second turns it off. If set, these are used in place + of terminal standout mode. + +k. New readline state (RL_STATE_EOF) and application-visible variable + (rl_eof_found) to allow applications to detect when readline reads EOF + before calling the deprep-terminal hook. + +l. There is a new configuration option: --with-shared-termcap-library, which + forces linking the shared readline library with the shared termcap (or + curses/ncurses/termlib) library so applications don't have to do it. + +m. Readline now checks for changes to locale settings (LC_ALL/LC_CTYPE/LANG) + each time it is called, and modifies the appropriate locale-specific display + and key binding variables when the locale changes. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-8.1 since +the release of readline-8.0. + +New Features in Readline + +a. If a second consecutive completion attempt produces matches where the first + did not, treat it as a new completion attempt and insert a match as + appropriate. + +b. Bracketed paste mode works in more places: incremental search strings, vi + overstrike mode, character search, and reading numeric arguments. + +c. Readline automatically switches to horizontal scrolling if the terminal has + only one line. + +d. Unbinding all key sequences bound to a particular readline function now + descends into keymaps for multi-key sequences. + +e. rl-clear-display: new bindable command that clears the screen and, if + possible, the scrollback buffer (bound to emacs mode M-C-l by default). + +f. New active mark and face feature: when enabled, it will highlight the text + inserted by a bracketed paste (the `active region') and the text found by + incremental and non-incremental history searches. This is tied to bracketed + paste and can be disabled by turning off bracketed paste. + +g. Readline sets the mark in several additional commands. + +h. Bracketed paste mode is enabled by default. There is a configure-time + option (--enable-bracketed-paste-default) to set the default to on or off. + +i. Readline tries to take advantage of the more regular structure of UTF-8 + characters to identify the beginning and end of characters when moving + through the line buffer. + +j. The bindable operate-and-get-next command (and its default bindings) are + now part of readline instead of a bash-specific addition. + +k. The signal cleanup code now blocks SIGINT while processing after a SIGINT. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-8.0 since +the release of readline-7.0. + +New Features in Readline + +a. Non-incremental vi-mode search (`N', `n') can search for a shell pattern, as + Posix specifies (uses fnmatch(3) if available). + +b. There are new `next-screen-line' and `previous-screen-line' bindable + commands, which move the cursor to the same column in the next, or previous, + physical line, respectively. + +c. There are default key bindings for control-arrow-key key combinations. + +d. A negative argument (-N) to `quoted-insert' means to insert the next N + characters using quoted-insert. + +e. New public function: rl_check_signals(), which allows applications to + respond to signals that readline catches while waiting for input using + a custom read function. + +f. There is new support for conditionally testing the readline version in an + inputrc file, with a full set of arithmetic comparison operators available. + +g. There is a simple variable comparison facility available for use within an + inputrc file. Allowable operators are equality and inequality; string + variables may be compared to a value; boolean variables must be compared to + either `on' or `off'; variable names are separated from the operator by + whitespace. + +h. The history expansion library now understands command and process + substitution and extended globbing and allows them to appear anywhere in a + word. + +i. The history library has a new variable that allows applications to set the + initial quoting state, so quoting state can be inherited from a previous + line. + +j. Readline now allows application-defined keymap names; there is a new public + function, rl_set_keymap_name(), to do that. + +k. The "Insert" keypad key, if available, now puts readline into overwrite + mode. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-7.0 since +the release of readline-6.3. + +New Features in Readline + +a. The history truncation code now uses the same error recovery mechanism as + the history writing code, and restores the old version of the history file + on error. The error recovery mechanism handles symlinked history files. + +b. There is a new bindable variable, `enable-bracketed-paste', which enables + support for a terminal's bracketed paste mode. + +c. The editing mode indicators can now be strings and are user-settable + (new `emacs-mode-string', `vi-cmd-mode-string' and `vi-ins-mode-string' + variables). Mode strings can contain invisible character sequences. + Setting mode strings to null strings restores the defaults. + +d. Prompt expansion adds the mode string to the last line of a multi-line + prompt (one with embedded newlines). + +e. There is a new bindable variable, `colored-completion-prefix', which, if + set, causes the common prefix of a set of possible completions to be + displayed in color. + +f. There is a new bindable command `vi-yank-pop', a vi-mode version of emacs- + mode yank-pop. + +g. The redisplay code underwent several efficiency improvements for multibyte + locales. + +h. The insert-char function attempts to batch-insert all pending typeahead + that maps to self-insert, as long as it is coming from the terminal. + +i. rl_callback_sigcleanup: a new application function that can clean up and + unset any state set by readline's callback mode. Intended to be used + after a signal. + +j. If an incremental search string has its last character removed with DEL, the + resulting empty search string no longer matches the previous line. + +k. If readline reads a history file that begins with `#' (or the value of + the history comment character) and has enabled history timestamps, the history + entries are assumed to be delimited by timestamps. This allows multi-line + history entries. + +l. Readline now throws an error if it parses a key binding without a terminating + `:' or whitespace. + +m. The default binding for ^W in vi mode now uses word boundaries specified + by Posix (vi-unix-word-rubout is bindable command name). + +n. rl_clear_visible_line: new application-callable function; clears all + screen lines occupied by the current visible readline line. + +o. rl_tty_set_echoing: application-callable function that controls whether + or not readline thinks it is echoing terminal output. + +p. Handle >| and strings of digits preceding and following redirection + specifications as single tokens when tokenizing the line for history + expansion. + +q. Fixed a bug with displaying completions when the prefix display length + is greater than the length of the completions to be displayed. + +r. The :p history modifier now applies to the entire line, so any expansion + specifying :p causes the line to be printed instead of expanded. + +s. New application-callable function: rl_pending_signal(): returns the signal + number of any signal readline has caught but not yet handled. + +t. New application-settable variable: rl_persistent_signal_handlers: if set + to a non-zero value, readline will enable the readline-6.2 signal handler + behavior in callback mode: handlers are installed when + rl_callback_handler_install is called and removed removed when a complete + line has been read. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-6.3 since +the release of readline-6.2. + +New Features in Readline + +a. Readline is now more responsive to SIGHUP and other fatal signals when + reading input from the terminal or performing word completion but no + longer attempts to run any not-allowable functions from a signal handler + context. + +b. There are new bindable commands to search the history for the string of + characters between the beginning of the line and the point + (history-substring-search-forward, history-substring-search-backward) + +c. Readline allows quoted strings as the values of variables when setting + them with `set'. As a side effect, trailing spaces and tabs are ignored + when setting a string variable's value. + +d. The history library creates a backup of the history file when writing it + and restores the backup on a write error. + +e. New application-settable variable: rl_filename_stat_hook: a function called + with a filename before using it in a call to stat(2). Bash uses it to + expand shell variables so things like $HOME/Downloads have a slash + appended. + +f. New bindable function `print-last-kbd-macro', prints the most-recently- + defined keyboard macro in a reusable format. + +g. New user-settable variable `colored-stats', enables use of colored text + to denote file types when displaying possible completions (colored analog + of visible-stats). + +h. New user-settable variable `keyseq-timout', acts as an inter-character + timeout when reading input or incremental search strings. + +i. New application-callable function: rl_clear_history. Clears the history list + and frees all readline-associated private data. + +j. New user-settable variable, show-mode-in-prompt, adds a characters to the + beginning of the prompt indicating the current editing mode. + +k. New application-settable variable: rl_input_available_hook; function to be + called when readline detects there is data available on its input file + descriptor. + +l. Readline calls an application-set event hook (rl_event_hook) after it gets + a signal while reading input (read returns -1/EINTR but readline does not + handle the signal immediately) to allow the application to handle or + otherwise note it. + +m. If the user-settable variable `history-size' is set to a value less than + 0, the history list size is unlimited. + +n. New application-settable variable: rl_signal_event_hook; function that is + called when readline is reading terminal input and read(2) is interrupted + by a signal. Currently not called for SIGHUP or SIGTERM. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-6.2 since +the release of readline-6.1. + +a. The history library does not try to write the history filename in the + current directory if $HOME is unset. This closes a potential security + problem if the application does not specify a history filename. + +b. New bindable variable `completion-display-width' to set the number of + columns used when displaying completions. + +c. New bindable variable `completion-case-map' to cause case-insensitive + completion to treat `-' and `_' as identical. + +d. There are new bindable vi-mode command names to avoid readline's case- + insensitive matching not allowing them to be bound separately. + +e. New bindable variable `menu-complete-display-prefix' causes the menu + completion code to display the common prefix of the possible completions + before cycling through the list, instead of after. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-6.1 since +the release of readline-6.0. + +New Features in Readline + +a. New bindable function: menu-complete-backward. + +b. In the vi insertion keymap, C-n is now bound to menu-complete by default, + and C-p to menu-complete-backward. + +c. When in vi command mode, repeatedly hitting ESC now does nothing, even + when ESC introduces a bound key sequence. This is closer to how + historical vi behaves. + +d. New bindable function: skip-csi-sequence. Can be used as a default to + consume key sequences generated by keys like Home and End without having + to bind all keys. + +e. New application-settable function: rl_filename_rewrite_hook. Can be used + to rewrite or modify filenames read from the file system before they are + compared to the word to be completed. + +f. New bindable variable: skip-completed-text, active when completing in the + middle of a word. If enabled, it means that characters in the completion + that match characters in the remainder of the word are "skipped" rather + than inserted into the line. + +g. The pre-readline-6.0 version of menu completion is available as + "old-menu-complete" for users who do not like the readline-6.0 version. + +h. New bindable variable: echo-control-characters. If enabled, and the + tty ECHOCTL bit is set, controls the echoing of characters corresponding + to keyboard-generated signals. + +i. New bindable variable: enable-meta-key. Controls whether or not readline + sends the smm/rmm sequences if the terminal indicates it has a meta key + that enables eight-bit characters. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-6.0 since +the release of readline-5.2. + +New Features in Readline + +a. A new variable, rl_sort_completion_matches; allows applications to inhibit + match list sorting (but beware: some things don't work right if + applications do this). + +b. A new variable, rl_completion_invoking_key; allows applications to discover + the key that invoked rl_complete or rl_menu_complete. + +c. The functions rl_block_sigint and rl_release_sigint are now public and + available to calling applications who want to protect critical sections + (like redisplay). + +d. The functions rl_save_state and rl_restore_state are now public and + available to calling applications; documented rest of readline's state + flag values. + +e. A new user-settable variable, `history-size', allows setting the maximum + number of entries in the history list. + +f. There is a new implementation of menu completion, with several improvements + over the old; the most notable improvement is a better `completions + browsing' mode. + +g. The menu completion code now uses the rl_menu_completion_entry_function + variable, allowing applications to provide their own menu completion + generators. + +h. There is support for replacing a prefix of a pathname with a `...' when + displaying possible completions. This is controllable by setting the + `completion-prefix-display-length' variable. Matches with a common prefix + longer than this value have the common prefix replaced with `...'. + +i. There is a new `revert-all-at-newline' variable. If enabled, readline will + undo all outstanding changes to all history lines when `accept-line' is + executed. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-5.2 since +the release of readline-5.1. + +New Features in Readline + +a. Calling applications can now set the keyboard timeout to 0, allowing + poll-like behavior. + +b. The value of SYS_INPUTRC (configurable at compilation time) is now used as + the default last-ditch startup file. + +c. The history file reading functions now allow windows-like \r\n line + terminators. + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-5.1 since +the release of readline-5.0. + +New Features in Readline + +a. The key sequence sent by the keypad `delete' key is now automatically + bound to delete-char. + +b. A negative argument to menu-complete now cycles backward through the + completion list. + +c. A new bindable readline variable: bind-tty-special-chars. If non-zero, + readline will bind the terminal special characters to their readline + equivalents when it's called (on by default). + +d. New bindable command: vi-rubout. Saves deleted text for possible + reinsertion, as with any vi-mode `text modification' command; `X' is bound + to this in vi command mode. + +e. If the rl_completion_query_items is set to a value < 0, readline never + asks the user whether or not to view the possible completions. + +f. New application-callable auxiliary function, rl_variable_value, returns + a string corresponding to a readline variable's value. + +g. When parsing inputrc files and variable binding commands, the parser + strips trailing whitespace from values assigned to boolean variables + before checking them. + +h. A new external application-controllable variable that allows the LINES + and COLUMNS environment variables to set the window size regardless of + what the kernel returns. + + +------------------------------------------------------------------------------- +This is a terse description of the new features added to readline-5.0 since +the release of readline-4.3. + +New Features in Readline + +a. History expansion has a new `a' modifier equivalent to the `g' modifier + for compatibility with the BSD csh. + +b. History expansion has a new `G' modifier equivalent to the BSD csh `g' + modifier, which performs a substitution once per word. + +c. All non-incremental search operations may now undo the operation of + replacing the current line with the history line. + +d. The text inserted by an `a' command in vi mode can be reinserted with + `.'. + +e. New bindable variable, `show-all-if-unmodified'. If set, the readline + completer will list possible completions immediately if there is more + than one completion and partial completion cannot be performed. + +f. There is a new application-callable `free_history_entry()' function. + +g. History list entries now contain timestamp information; the history file + functions know how to read and write timestamp information associated + with each entry. + +h. Four new key binding functions have been added: + + rl_bind_key_if_unbound() + rl_bind_key_if_unbound_in_map() + rl_bind_keyseq_if_unbound() + rl_bind_keyseq_if_unbound_in_map() + +i. New application variable, rl_completion_quote_character, set to any + quote character readline finds before it calls the application completion + function. + +j. New application variable, rl_completion_suppress_quote, settable by an + application completion function. If set to non-zero, readline does not + attempt to append a closing quote to a completed word. + +k. New application variable, rl_completion_found_quote, set to a non-zero + value if readline determines that the word to be completed is quoted. + Set before readline calls any application completion function. + +l. New function hook, rl_completion_word_break_hook, called when readline + needs to break a line into words when completion is attempted. Allows + the word break characters to vary based on position in the line. + +m. New bindable command: unix-filename-rubout. Does the same thing as + unix-word-rubout, but adds `/' to the set of word delimiters. + +n. When listing completions, directories have a `/' appended if the + `mark-directories' option has been enabled. diff --git a/README b/README new file mode 100644 index 0000000..83cdb23 --- /dev/null +++ b/README @@ -0,0 +1,196 @@ +Introduction +============ + +This is the Gnu Readline library, version 8.2. + +The Readline library provides a set of functions for use by applications +that allow users to edit command lines as they are typed in. Both +Emacs and vi editing modes are available. The Readline library includes +additional functions to maintain a list of previously-entered command +lines, to recall and perhaps reedit those lines, and perform csh-like +history expansion on previous commands. + +The history facilities are also placed into a separate library, the +History library, as part of the build process. The History library +may be used without Readline in applications which desire its +capabilities. + +The Readline library is free software, distributed under the terms of +the [GNU] General Public License as published by the Free Software +Foundation, version 3 of the License. For more information, see the +file COPYING. + +To build the library, try typing `./configure', then `make'. The +configuration process is automated, so no further intervention should +be necessary. Readline builds with `gcc' by default if it is +available. If you want to use `cc' instead, type + + CC=cc ./configure + +if you are using a Bourne-style shell. If you are not, the following +may work: + + env CC=cc ./configure + +Read the file INSTALL in this directory for more information about how +to customize and control the build process. + +The file rlconf.h contains C preprocessor defines that enable and disable +certain Readline features. + +The special make target `everything' will build the static and shared +libraries (if the target platform supports them) and the examples. + +Examples +======== + +There are several example programs that use Readline features in the +examples directory. The `rl' program is of particular interest. It +is a command-line interface to Readline, suitable for use in shell +scripts in place of `read'. + +Shared Libraries +================ + +There is skeletal support for building shared versions of the +Readline and History libraries. The configure script creates +a Makefile in the `shlib' subdirectory, and typing `make shared' +will cause shared versions of the Readline and History libraries +to be built on supported platforms. + +If `configure' is given the `--enable-shared' option, it will attempt +to build the shared libraries by default on supported platforms. + +Configure calls the script support/shobj-conf to test whether or +not shared library creation is supported and to generate the values +of variables that are substituted into shlib/Makefile. If you +try to build shared libraries on an unsupported platform, `make' +will display a message asking you to update support/shobj-conf for +your platform. + +If you need to update support/shobj-conf, you will need to create +a `stanza' for your operating system and compiler. The script uses +the value of host_os and ${CC} as determined by configure. For +instance, FreeBSD 4.2 with any version of gcc is identified as +`freebsd4.2-gcc*'. + +In the stanza for your operating system-compiler pair, you will need to +define several variables. They are: + +SHOBJ_CC The C compiler used to compile source files into shareable + object files. This is normally set to the value of ${CC} + by configure, and should not need to be changed. + +SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create + position-independent code. If you are using gcc, this + should probably be set to `-fpic'. + +SHOBJ_LD The link editor to be used to create the shared library from + the object files created by $SHOBJ_CC. If you are using + gcc, a value of `gcc' will probably work. + +SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation. + If you are using gcc, `-shared' may be all that is necessary. + These should be the flags needed for generic shared object + creation. + +SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library + creation. Many systems use the -R option to the link + editor to embed a path within the library for run-time + library searches. A reasonable value for such systems would + be `-R$(libdir)'. + +SHLIB_LIBS Any additional libraries that shared libraries should be + linked against when they are created. + +SHLIB_LIBPREF The prefix to use when generating the filename of the shared + library. The default is `lib'; Cygwin uses `cyg'. + +SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when + generating the filename of the shared library. Many systems + use `so'; HP-UX uses `sl'. + +SHLIB_LIBVERSION The string to append to the filename to indicate the version + of the shared library. It should begin with $(SHLIB_LIBSUFF), + and possibly include version information that allows the + run-time loader to load the version of the shared library + appropriate for a particular program. Systems using shared + libraries similar to SunOS 4.x use major and minor library + version numbers; for those systems a value of + `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate. + Systems based on System V Release 4 don't use minor version + numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems. + Other Unix versions use different schemes. + +SHLIB_DLLVERSION The version number for shared libraries that determines API + compatibility between readline versions and the underlying + system. Used only on Cygwin. Defaults to $SHLIB_MAJOR, but + can be overridden at configuration time by defining DLLVERSION + in the environment. + +SHLIB_DOT The character used to separate the name of the shared library + from the suffix and version information. The default is `.'; + systems like Cygwin which don't separate version information + from the library name should set this to the empty string. + +SHLIB_STATUS Set this to `supported' when you have defined the other + necessary variables. Make uses this to determine whether + or not shared library creation should be attempted. + +You should look at the existing stanzas in support/shobj-conf for ideas. + +Once you have updated support/shobj-conf, re-run configure and type +`make shared'. The shared libraries will be created in the shlib +subdirectory. + +If shared libraries are created, `make install' will install them. +You may install only the shared libraries by running `make +install-shared' from the top-level build directory. Running `make +install' in the shlib subdirectory will also work. If you don't want +to install any created shared libraries, run `make install-static'. + +Documentation +============= + +The documentation for the Readline and History libraries appears in +the `doc' subdirectory. There are three texinfo files and a +Unix-style manual page describing the facilities available in the +Readline library. The texinfo files include both user and +programmer's manuals. HTML versions of the manuals appear in the +`doc' subdirectory as well. + +Usage +===== + +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. + +Reporting Bugs +============== + +Bug reports for Readline should be sent to: + + bug-readline@gnu.org + +When reporting a bug, please include the following information: + + * the version number and release status of Readline (e.g., 4.2-release) + * the machine and OS that it is running on + * a list of the compilation flags or the contents of `config.h', if + appropriate + * a description of the bug + * a recipe for recreating the bug reliably + * a fix for the bug if you have one! + +If you would like to contact the Readline maintainer directly, send mail +to bash-maintainers@gnu.org. + +Since Readline is developed along with bash, the bug-bash@gnu.org mailing +list (mirrored to the Usenet newsgroup gnu.bash.bug) often contains +Readline bug reports and fixes. + +Chet Ramey +chet.ramey@case.edu diff --git a/USAGE b/USAGE new file mode 100644 index 0000000..edc9f54 --- /dev/null +++ b/USAGE @@ -0,0 +1,37 @@ +From rms@gnu.org Thu Jul 22 20:37:55 1999 +Flags: 10 +Return-Path: rms@gnu.org +Received: from arthur.INS.CWRU.Edu (root@arthur.INS.CWRU.Edu [129.22.8.215]) by odin.INS.CWRU.Edu with ESMTP (8.8.6+cwru/CWRU-2.4-ins) + id UAA25349; Thu, 22 Jul 1999 20:37:54 -0400 (EDT) (from rms@gnu.org for ) +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 ) +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 ) +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 ; 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 +To: chet@nike.ins.cwru.edu +Subject: Use of Readline +Reply-to: rms@gnu.org + +I think Allbery's suggestion is a good one. So please add this text +in a suitable place. Please don't put it in the GPL itself; that +should be the same as the GPL everywhere else. Putting it in the +README and/or the documentation would be a good idea. + + +====================================================================== +Our position on the use of Readline through a shared-library linking +mechanism is that there is no legal difference between shared-library +linking and static linking--either kind of linking combines various +modules into a single larger work. The conditions for using Readline +in a larger work are stated in section 3 of the GNU GPL. + + diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..cc97bd4 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,2267 @@ +dnl +dnl Bash specific tests +dnl +dnl Some derived from PDKSH 5.1.3 autoconf tests +dnl +dnl Copyright (C) 1987-2021 Free Software Foundation, Inc. +dnl + +dnl +dnl Check for . This is separated out so that it can be +dnl AC_REQUIREd. +dnl +dnl BASH_HEADER_INTTYPES +AC_DEFUN(BASH_HEADER_INTTYPES, +[ + AC_CHECK_HEADERS(inttypes.h) +]) + +dnl +dnl check for typedef'd symbols in header files, but allow the caller to +dnl specify the include files to be checked in addition to the default +dnl +dnl This could be changed to use AC_COMPILE_IFELSE instead of AC_EGREP_CPP +dnl +dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND]) +AC_DEFUN(BASH_CHECK_TYPE, +[ +AC_REQUIRE([BASH_HEADER_INTTYPES]) +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(bash_cv_type_$1, +[AC_EGREP_CPP($1, [#include +#if HAVE_STDLIB_H +#include +#endif +#if HAVE_STDDEF_H +#include +#endif +#if HAVE_INTTYPES_H +#include +#endif +#if HAVE_STDINT_H +#include +#endif +$2 +], bash_cv_type_$1=yes, bash_cv_type_$1=no)]) +AC_MSG_RESULT($bash_cv_type_$1) +ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then + AC_DEFINE($4) + fi]) +if test $bash_cv_type_$1 = no; then + AC_DEFINE_UNQUOTED($1, $3) +fi +]) + +dnl +dnl BASH_CHECK_DECL(FUNC) +dnl +dnl Check for a declaration of FUNC in stdlib.h and inttypes.h like +dnl AC_CHECK_DECL +dnl +AC_DEFUN(BASH_CHECK_DECL, +[ +AC_REQUIRE([BASH_HEADER_INTTYPES]) +AC_CHECK_DECLS([$1]) +]) + +AC_DEFUN(BASH_DECL_PRINTF, +[AC_MSG_CHECKING(for declaration of printf in ) +AC_CACHE_VAL(bash_cv_printf_declared, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#ifdef __STDC__ +typedef int (*_bashfunc)(const char *, ...); +#else +typedef int (*_bashfunc)(); +#endif +#include +int +main() +{ +_bashfunc pf; +pf = (_bashfunc) printf; +exit(pf == 0); +} +]])], [bash_cv_printf_declared=yes], [bash_cv_printf_declared=no], + [AC_MSG_WARN(cannot check printf declaration if cross compiling -- defaulting to yes) + bash_cv_printf_declared=yes] +)]) +AC_MSG_RESULT($bash_cv_printf_declared) +if test $bash_cv_printf_declared = yes; then +AC_DEFINE(PRINTF_DECLARED) +fi +]) + +AC_DEFUN(BASH_DECL_SBRK, +[AC_MSG_CHECKING(for declaration of sbrk in ) +AC_CACHE_VAL(bash_cv_sbrk_declared, +[AC_EGREP_HEADER(sbrk, unistd.h, + bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)]) +AC_MSG_RESULT($bash_cv_sbrk_declared) +if test $bash_cv_sbrk_declared = yes; then +AC_DEFINE(SBRK_DECLARED) +fi +]) + +dnl +dnl Check for sys_siglist[] or _sys_siglist[] +dnl +AC_DEFUN(BASH_DECL_UNDER_SYS_SIGLIST, +[AC_MSG_CHECKING([for _sys_siglist in signal.h or unistd.h]) +AC_CACHE_VAL(bash_cv_decl_under_sys_siglist, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +#ifdef HAVE_UNISTD_H +#include +#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_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#ifndef UNDER_SYS_SIGLIST_DECLARED +extern char *_sys_siglist[]; +#endif +int +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 +]) + +dnl this defines HAVE_DECL_SYS_SIGLIST +AC_DEFUN([BASH_DECL_SYS_SIGLIST], +[AC_CHECK_DECLS([sys_siglist],,, +[#include +/* NetBSD declares sys_siglist in unistd.h. */ +#ifdef HAVE_UNISTD_H +# include +#endif +]) +]) + +AC_DEFUN(BASH_SYS_SIGLIST, +[AC_REQUIRE([BASH_DECL_SYS_SIGLIST]) +AC_MSG_CHECKING([for sys_siglist in system C library]) +AC_CACHE_VAL(bash_cv_sys_siglist, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#if !HAVE_DECL_SYS_SIGLIST +extern char *sys_siglist[]; +#endif +int +main() +{ +char *msg = sys_siglist[2]; +exit(msg == 0); +} +]])], [bash_cv_sys_siglist=yes], [bash_cv_sys_siglist=no], + [AC_MSG_WARN(cannot check for sys_siglist if cross compiling -- defaulting to no) + bash_cv_sys_siglist=no] +)]) +AC_MSG_RESULT($bash_cv_sys_siglist) +if test $bash_cv_sys_siglist = yes; then +AC_DEFINE(HAVE_SYS_SIGLIST) +fi +]) + +dnl Check for the various permutations of sys_siglist and make sure we +dnl compile in siglist.o if they're not defined +AC_DEFUN(BASH_CHECK_SYS_SIGLIST, [ +AC_REQUIRE([BASH_SYS_SIGLIST]) +AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST]) +AC_REQUIRE([BASH_FUNC_STRSIGNAL]) +if test "$bash_cv_sys_siglist" = no && test "$bash_cv_under_sys_siglist" = no && test "$bash_cv_have_strsignal" = no; then + SIGLIST_O=siglist.o +else + SIGLIST_O= +fi +AC_SUBST([SIGLIST_O]) +]) + +dnl Check for sys_errlist[] and sys_nerr, check for declaration +AC_DEFUN(BASH_SYS_ERRLIST, +[AC_MSG_CHECKING([for sys_errlist and sys_nerr]) +AC_CACHE_VAL(bash_cv_sys_errlist, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +]],[[ +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] +)]) +AC_MSG_RESULT($bash_cv_sys_errlist) +if test $bash_cv_sys_errlist = yes; then +AC_DEFINE(HAVE_SYS_ERRLIST) +fi +]) + +dnl +dnl Check if dup2() does not clear the close on exec flag +dnl +AC_DEFUN(BASH_FUNC_DUP2_CLOEXEC_CHECK, +[AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag) +AC_CACHE_VAL(bash_cv_dup2_broken, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +int +main() +{ + int fd1, fd2, fl; + fd1 = open("/dev/null", 2); + if (fcntl(fd1, 2, 1) < 0) + exit(1); + fd2 = dup2(fd1, 1); + if (fd2 < 0) + exit(2); + fl = fcntl(fd2, 1, 0); + /* fl will be 1 if dup2 did not reset the close-on-exec flag. */ + exit(fl != 1); +} +]])], [bash_cv_dup2_broken=yes], [bash_cv_dup2_broken=no], + [AC_MSG_WARN(cannot check dup2 if cross compiling -- defaulting to no) + bash_cv_dup2_broken=no] +)]) +AC_MSG_RESULT($bash_cv_dup2_broken) +if test $bash_cv_dup2_broken = yes; then +AC_DEFINE(DUP2_BROKEN) +fi +]) + +AC_DEFUN(BASH_FUNC_STRSIGNAL, +[AC_MSG_CHECKING([for the existence of strsignal]) +AC_CACHE_VAL(bash_cv_have_strsignal, +[AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[#include +#include +#include ]], +[[char *s = (char *)strsignal(2);]])], + [bash_cv_have_strsignal=yes], [bash_cv_have_strsignal=no])]) +AC_MSG_RESULT($bash_cv_have_strsignal) +if test $bash_cv_have_strsignal = yes; then +AC_DEFINE(HAVE_STRSIGNAL) +fi +]) + +dnl Check to see if opendir will open non-directories (not a nice thing) +AC_DEFUN(BASH_FUNC_OPENDIR_CHECK, +[AC_REQUIRE([AC_HEADER_DIRENT])dnl +AC_MSG_CHECKING(if opendir() opens non-directories) +AC_CACHE_VAL(bash_cv_opendir_not_robust, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ +#ifdef HAVE_SYS_STAT_H +#include +#endif +#if defined(HAVE_DIRENT_H) +# include +#else +# define dirent direct +# ifdef HAVE_SYS_NDIR_H +# include +# endif /* SYSNDIR */ +# ifdef HAVE_SYS_DIR_H +# include +# endif /* SYSDIR */ +# ifdef HAVE_NDIR_H +# include +# endif +#endif /* HAVE_DIRENT_H */ +#include +int +main() +{ +DIR *dir; +int fd, err; +err = mkdir("bash-aclocal", 0700); +if (err < 0) { + perror("mkdir"); + exit(1); +} +unlink("bash-aclocal/not_a_directory"); +fd = open("bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666); +write(fd, "\n", 1); +close(fd); +dir = opendir("bash-aclocal/not_a_directory"); +unlink("bash-aclocal/not_a_directory"); +rmdir("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 +dnl A signed 16-bit integer quantity +dnl +AC_DEFUN(BASH_TYPE_BITS16_T, +[ +if test "$ac_cv_sizeof_short" = 2; then + AC_CHECK_TYPE(bits16_t, short) +elif test "$ac_cv_sizeof_char" = 2; then + AC_CHECK_TYPE(bits16_t, char) +else + AC_CHECK_TYPE(bits16_t, short) +fi +]) + +dnl +dnl An unsigned 16-bit integer quantity +dnl +AC_DEFUN(BASH_TYPE_U_BITS16_T, +[ +if test "$ac_cv_sizeof_short" = 2; then + AC_CHECK_TYPE(u_bits16_t, unsigned short) +elif test "$ac_cv_sizeof_char" = 2; then + AC_CHECK_TYPE(u_bits16_t, unsigned char) +else + AC_CHECK_TYPE(u_bits16_t, unsigned short) +fi +]) + +dnl +dnl A signed 32-bit integer quantity +dnl +AC_DEFUN(BASH_TYPE_BITS32_T, +[ +if test "$ac_cv_sizeof_int" = 4; then + AC_CHECK_TYPE(bits32_t, int) +elif test "$ac_cv_sizeof_long" = 4; then + AC_CHECK_TYPE(bits32_t, long) +else + AC_CHECK_TYPE(bits32_t, int) +fi +]) + +dnl +dnl An unsigned 32-bit integer quantity +dnl +AC_DEFUN(BASH_TYPE_U_BITS32_T, +[ +if test "$ac_cv_sizeof_int" = 4; then + AC_CHECK_TYPE(u_bits32_t, unsigned int) +elif test "$ac_cv_sizeof_long" = 4; then + AC_CHECK_TYPE(u_bits32_t, unsigned long) +else + AC_CHECK_TYPE(u_bits32_t, unsigned int) +fi +]) + +AC_DEFUN(BASH_TYPE_PTRDIFF_T, +[ +if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then + AC_CHECK_TYPE(ptrdiff_t, int) +elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then + AC_CHECK_TYPE(ptrdiff_t, long) +elif test "$ac_cv_type_long_long" = yes && test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_char_p"; then + AC_CHECK_TYPE(ptrdiff_t, [long long]) +else + AC_CHECK_TYPE(ptrdiff_t, int) +fi +]) + +dnl +dnl A signed 64-bit quantity +dnl +AC_DEFUN(BASH_TYPE_BITS64_T, +[ +if test "$ac_cv_sizeof_char_p" = 8; then + AC_CHECK_TYPE(bits64_t, char *) +elif test "$ac_cv_sizeof_double" = 8; then + AC_CHECK_TYPE(bits64_t, double) +elif test -n "$ac_cv_type_long_long" && test "$ac_cv_sizeof_long_long" = 8; then + AC_CHECK_TYPE(bits64_t, [long long]) +elif test "$ac_cv_sizeof_long" = 8; then + AC_CHECK_TYPE(bits64_t, long) +else + AC_CHECK_TYPE(bits64_t, double) +fi +]) + +AC_DEFUN(BASH_SIZEOF_RLIMIT, +[AC_MSG_CHECKING(for size of struct rlimit fields) +AC_CACHE_VAL(bash_cv_sizeof_rlim_cur, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#include +main() +{ +struct rlimit r; +exit(sizeof (r.rlim_cur)); +} +]])], [bash_cv_sizeof_rlim_cur=$?], [bash_cv_sizeof_rlim_cur=$?], + [AC_MSG_WARN(cannot check size of rlimit fields if cross compiling -- defaulting to long) + bash_cv_sizeof_rlim_cur=$ac_cv_sizeof_long] +)]) +AC_MSG_RESULT($bash_cv_sizeof_rlim_cur) +]) + +AC_DEFUN(BASH_SIZEOF_QUAD_T, +[AC_MSG_CHECKING(for size of quad_t) +AC_CACHE_VAL(bash_cv_sizeof_quad_t, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#if HAVE_INTTYPES_H +#include +#endif +#if HAVE_STDINT_H +#include +#endif + +main() +{ +#if HAVE_QUAD_T +quad_t x; +exit(sizeof (x)); +#else +exit (0); +#endif +} +]])], [bash_cv_sizeof_quad_t=$?], [bash_cv_sizeof_quad_t=$?], + [AC_MSG_WARN(cannot check size of quad_t if cross compiling -- defaulting to 0) + bash_cv_sizeof_quad_t=0] +)]) +AC_MSG_RESULT($bash_cv_sizeof_quad_t) +]) + +dnl +dnl Type of struct rlimit fields: updated to check POSIX rlim_t and +dnl if it doesn't exist determine the best guess based on sizeof(r.rlim_cur) +dnl +AC_DEFUN(BASH_TYPE_RLIMIT, +[AC_MSG_CHECKING(for type of struct rlimit fields) +AC_CACHE_VAL(bash_cv_type_rlimit, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include ]], +[[rlim_t xxx;]] +)], + [bash_cv_type_rlimit=rlim_t], [ +BASH_SIZEOF_RLIMIT +BASH_SIZEOF_QUAD_T +if test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_long; then + bash_cv_type_rlimit='unsigned long' +elif test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_long_long; then + bash_cv_type_rlimit='unsigned long long' +elif test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_int; then + bash_cv_type_rlimit='unsigned int' +elif test $bash_cv_sizeof_rlim_cur = $bash_cv_sizeof_quad_t; then + bash_cv_type_rlimit='quad_t' +else + bash_cv_type_rlimit='unsigned long' +fi +] +)]) +AC_MSG_RESULT($bash_cv_type_rlimit) +AC_DEFINE_UNQUOTED([RLIMTYPE], [$bash_cv_type_rlimit]) +]) + +AC_DEFUN(BASH_TYPE_SIG_ATOMIC_T, +[AC_CACHE_CHECK([for sig_atomic_t in signal.h], ac_cv_have_sig_atomic_t, +[AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[ #include ]], + [[ sig_atomic_t x; ]])], + [ac_cv_have_sig_atomic_t=yes],[ac_cv_have_sig_atomic_t=no])]) +if test "$ac_cv_have_sig_atomic_t" = "no" +then + BASH_CHECK_TYPE(sig_atomic_t, [#include ], int) +fi +]) + +AC_DEFUN(BASH_FUNC_LSTAT, +[dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an +dnl inline function in . +AC_CACHE_CHECK([for lstat], bash_cv_func_lstat, +[AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[ + #include + #include + ]], + [[ 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_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +#include +struct in_addr ap;]], [[ inet_aton("127.0.0.1", &ap); ]])], +[bash_cv_func_inet_aton=yes], [bash_cv_func_inet_aton=no])]) +if test $bash_cv_func_inet_aton = yes; then + AC_DEFINE(HAVE_INET_ATON) +else + AC_LIBOBJ(inet_aton) +fi +]) + +AC_DEFUN(BASH_FUNC_GETENV, +[AC_MSG_CHECKING(to see if getenv can be redefined) +AC_CACHE_VAL(bash_cv_getenv_redef, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#ifdef HAVE_UNISTD_H +# include +#endif +#include +#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"; +} +int +main() +{ +char *s; +/* The next allows this program to run, but does not allow bash to link + when it redefines getenv. I'm not really interested in figuring out + why not. */ +#if defined (NeXT) +exit(1); +#endif +s = getenv("ABCDE"); +exit(s == 0); /* force optimizer to leave getenv in */ +} +]])], [bash_cv_getenv_redef=yes], [bash_cv_getenv_redef=no], + [AC_MSG_WARN(cannot check getenv redefinition if cross compiling -- defaulting to yes) + bash_cv_getenv_redef=yes] +)]) +AC_MSG_RESULT($bash_cv_getenv_redef) +if test $bash_cv_getenv_redef = yes; then +AC_DEFINE(CAN_REDEFINE_GETENV) +fi +]) + +# We should check for putenv before calling this +AC_DEFUN(BASH_FUNC_STD_PUTENV, +[ +AC_REQUIRE([AC_C_PROTOTYPES]) +AC_CACHE_CHECK([for standard-conformant putenv declaration], bash_cv_std_putenv, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#if HAVE_STDLIB_H +#include +#endif +#if HAVE_STDDEF_H +#include +#endif +#ifndef __STDC__ +# ifndef const +# define const +# endif +#endif +#ifdef PROTOTYPES +extern int putenv (char *); +#else +extern int putenv (); +#endif +]], [[return (putenv == 0);]] )], +[bash_cv_std_putenv=yes], [bash_cv_std_putenv=no] +)]) +if test $bash_cv_std_putenv = yes; then +AC_DEFINE(HAVE_STD_PUTENV) +fi +]) + +# We should check for unsetenv before calling this +AC_DEFUN(BASH_FUNC_STD_UNSETENV, +[ +AC_REQUIRE([AC_C_PROTOTYPES]) +AC_CACHE_CHECK([for standard-conformant unsetenv declaration], bash_cv_std_unsetenv, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#if HAVE_STDLIB_H +#include +#endif +#if HAVE_STDDEF_H +#include +#endif +#ifndef __STDC__ +# ifndef const +# define const +# endif +#endif +#ifdef PROTOTYPES +extern int unsetenv (const char *); +#else +extern int unsetenv (); +#endif +]], [[return (unsetenv == 0);]] )], +[bash_cv_std_unsetenv=yes], [bash_cv_std_unsetenv=no] +)]) +if test $bash_cv_std_unsetenv = yes; then +AC_DEFINE(HAVE_STD_UNSETENV) +fi +]) + +AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS, +[AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize) +AC_CACHE_VAL(bash_cv_ulimit_maxfds, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#ifdef HAVE_ULIMIT_H +#include +#endif +int +main() +{ +long maxfds = ulimit(4, 0L); +exit (maxfds == -1L); +} +]])], [bash_cv_ulimit_maxfds=yes], [bash_cv_ulimit_maxfds=no], + [AC_MSG_WARN(cannot check ulimit if cross compiling -- defaulting to no) + bash_cv_ulimit_maxfds=no] +)]) +AC_MSG_RESULT($bash_cv_ulimit_maxfds) +if test $bash_cv_ulimit_maxfds = yes; then +AC_DEFINE(ULIMIT_MAXFDS) +fi +]) + +AC_DEFUN(BASH_FUNC_GETCWD, +[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory with 0 size]) +AC_CACHE_VAL(bash_cv_getcwd_malloc, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +int +main() +{ + char *xpwd; + xpwd = getcwd(0, 0); + exit (xpwd == 0); +} +]])], [bash_cv_getcwd_malloc=yes], [bash_cv_getcwd_malloc=no], + [AC_MSG_WARN(cannot check whether getcwd allocates memory when cross-compiling -- defaulting to no) + bash_cv_getcwd_malloc=no] +)]) +AC_MSG_RESULT($bash_cv_getcwd_malloc) +if test $bash_cv_getcwd_malloc = no; then +AC_DEFINE(GETCWD_BROKEN) +AC_LIBOBJ(getcwd) +fi +]) + +dnl +dnl This needs BASH_CHECK_SOCKLIB, but since that's not called on every +dnl system, we can't use AC_PREREQ. Only called if we need the socket library +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_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +]], [[ +struct hostent *hp; +hp = gethostbyname("localhost"); +]] )], +[bash_cv_have_gethostbyname=yes], [bash_cv_have_gethostbyname=no] +)]) +if test "X$_bash_needmsg" = Xyes; then + AC_MSG_CHECKING(for gethostbyname in socket library) +fi +AC_MSG_RESULT($bash_cv_have_gethostbyname) +if test "$bash_cv_have_gethostbyname" = yes; then +AC_DEFINE(HAVE_GETHOSTBYNAME) +fi +]) + +AC_DEFUN(BASH_FUNC_FNMATCH_EXTMATCH, +[AC_MSG_CHECKING(if fnmatch does extended pattern matching with FNM_EXTMATCH) +AC_CACHE_VAL(bash_cv_fnm_extmatch, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include + +int +main() +{ +#ifdef FNM_EXTMATCH + return (0); +#else + return (1); +#endif +} +]])], [bash_cv_fnm_extmatch=yes], [bash_cv_fnm_extmatch=no], + [AC_MSG_WARN(cannot check FNM_EXTMATCH if cross compiling -- defaulting to no) + bash_cv_fnm_extmatch=no] +)]) +AC_MSG_RESULT($bash_cv_fnm_extmatch) +if test $bash_cv_fnm_extmatch = yes; then +AC_DEFINE(HAVE_LIBC_FNM_EXTMATCH) +fi +]) + +AC_DEFUN(BASH_FUNC_POSIX_SETJMP, +[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) +AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp) +AC_CACHE_VAL(bash_cv_func_sigsetjmp, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include + +int +main() +{ +#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS) +exit (1); +#else + +int code; +sigset_t set, oset, nset; +sigjmp_buf xx; + +/* get the mask */ +sigemptyset(&set); +sigemptyset(&oset); + +sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset); +/* paranoia -- make sure SIGINT is not blocked */ +sigdelset (&oset, SIGINT); +sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); + +/* save it */ +code = sigsetjmp(xx, 1); +if (code) +{ + sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &nset); + /* could compare nset to oset here, but we just look for SIGINT */ + if (sigismember (&nset, SIGINT)) + exit(1); + exit(0); +} + +/* change it so that SIGINT is blocked */ +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 $bash_cv_posix_signals) + if test "$bash_cv_posix_signals" = "yes" ; then + bash_cv_func_sigsetjmp=present + else + bash_cv_func_sigsetjmp=missing + fi] +)]) +AC_MSG_RESULT($bash_cv_func_sigsetjmp) +if test $bash_cv_func_sigsetjmp = present; then +AC_DEFINE(HAVE_POSIX_SIGSETJMP) +fi +]) + +AC_DEFUN(BASH_FUNC_STRCOLL, +[AC_MSG_CHECKING(whether or not strcoll and strcmp differ) +AC_CACHE_VAL(bash_cv_func_strcoll_broken, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#if defined (HAVE_LOCALE_H) +#include +#endif +#include +#include + +int +main(c, v) +int c; +char *v[]; +{ + int r1, r2; + char *deflocale, *defcoll; + +#ifdef HAVE_SETLOCALE + deflocale = setlocale(LC_ALL, ""); + defcoll = setlocale(LC_COLLATE, ""); +#endif + +#ifdef HAVE_STRCOLL + /* These two values are taken from tests/glob-test. */ + r1 = strcoll("abd", "aXd"); +#else + r1 = 0; +#endif + r2 = strcmp("abd", "aXd"); + + /* These two should both be greater than 0. It is permissible for + a system to return different values, as long as the sign is the + same. */ + + /* Exit with 1 (failure) if these two values are both > 0, since + this tests whether strcoll(3) is broken with respect to strcmp(3) + in the default locale. */ + exit (r1 > 0 && r2 > 0); +} +]])], [bash_cv_func_strcoll_broken=yes], [bash_cv_func_strcoll_broken=no], + [AC_MSG_WARN(cannot check strcoll if cross compiling -- defaulting to no) + bash_cv_func_strcoll_broken=no] +)]) +AC_MSG_RESULT($bash_cv_func_strcoll_broken) +if test $bash_cv_func_strcoll_broken = yes; then +AC_DEFINE(STRCOLL_BROKEN) +fi +]) + +AC_DEFUN(BASH_FUNC_PRINTF_A_FORMAT, +[AC_MSG_CHECKING([for printf floating point output in hex notation]) +AC_CACHE_VAL(bash_cv_printf_a_format, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include + +int +main() +{ + double y = 0.0; + char abuf[1024]; + + sprintf(abuf, "%A", y); + exit(strchr(abuf, 'P') == (char *)0); +} +]])], [bash_cv_printf_a_format=yes], [bash_cv_printf_a_format=no], + [AC_MSG_WARN(cannot check printf if cross compiling -- defaulting to no) + bash_cv_printf_a_format=no] +)]) +AC_MSG_RESULT($bash_cv_printf_a_format) +if test $bash_cv_printf_a_format = yes; then +AC_DEFINE(HAVE_PRINTF_A_FORMAT) +fi +]) + +AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC, +[ +AC_CHECK_MEMBER(struct termios.c_line, AC_DEFINE(TERMIOS_LDISC), ,[ +#include +#include +]) +]) + +AC_DEFUN(BASH_STRUCT_TERMIO_LDISC, +[ +AC_CHECK_MEMBER(struct termio.c_line, AC_DEFINE(TERMIO_LDISC), ,[ +#include +#include +]) +]) + +dnl +dnl Like AC_STRUCT_ST_BLOCKS, but doesn't muck with LIBOBJS +dnl +dnl sets bash_cv_struct_stat_st_blocks +dnl +dnl unused for now; we'll see how AC_CHECK_MEMBERS works +dnl +AC_DEFUN(BASH_STRUCT_ST_BLOCKS, +[ +AC_MSG_CHECKING([for struct stat.st_blocks]) +AC_CACHE_VAL(bash_cv_struct_stat_st_blocks, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +]], [[ +int +main() +{ +static struct stat a; +if (a.st_blocks) return 0; +return 0; +} +]])], [bash_cv_struct_stat_st_blocks=yes], [bash_cv_struct_stat_st_blocks=no]) +]) +AC_MSG_RESULT($bash_cv_struct_stat_st_blocks) +if test "$bash_cv_struct_stat_st_blocks" = "yes"; then +AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS) +fi +]) + +AC_DEFUN([BASH_CHECK_LIB_TERMCAP], +[ +if test "X$bash_cv_termcap_lib" = "X"; then +_bash_needmsg=yes +else +AC_MSG_CHECKING(which library has the termcap functions) +_bash_needmsg= +fi +AC_CACHE_VAL(bash_cv_termcap_lib, +[AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc, + [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap, + [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo, + [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses, + [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses, + [AC_CHECK_LIB(ncursesw, tgetent, bash_cv_termcap_lib=libncursesw, + bash_cv_termcap_lib=gnutermcap)])])])])])]) +if test "X$_bash_needmsg" = "Xyes"; then +AC_MSG_CHECKING(which library has the termcap functions) +fi +AC_MSG_RESULT(using $bash_cv_termcap_lib) +if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then +LDFLAGS="$LDFLAGS -L./lib/termcap" +TERMCAP_LIB="./lib/termcap/libtermcap.a" +TERMCAP_DEP="./lib/termcap/libtermcap.a" +elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then +TERMCAP_LIB=-ltermcap +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libtinfo; then +TERMCAP_LIB=-ltinfo +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libncurses; then +TERMCAP_LIB=-lncurses +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libc; then +TERMCAP_LIB= +TERMCAP_DEP= +else +# we assume ncurses is installed somewhere the linker can find it +TERMCAP_LIB=-lncurses +TERMCAP_DEP= +fi +]) + +dnl +dnl Check for the presence of getpeername in libsocket. +dnl If libsocket is present, check for libnsl and add it to LIBS if +dnl it's there, since most systems with libsocket require linking +dnl with libnsl as well. This should only be called if getpeername +dnl was not found in libc. +dnl +dnl NOTE: IF WE FIND GETPEERNAME, WE ASSUME THAT WE HAVE BIND/CONNECT +dnl AS WELL +dnl +AC_DEFUN(BASH_CHECK_LIB_SOCKET, +[ +if test "X$bash_cv_have_socklib" = "X"; then +_bash_needmsg= +else +AC_MSG_CHECKING(for socket library) +_bash_needmsg=yes +fi +AC_CACHE_VAL(bash_cv_have_socklib, +[AC_CHECK_LIB(socket, getpeername, + bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)]) +if test "X$_bash_needmsg" = Xyes; then + AC_MSG_RESULT($bash_cv_have_socklib) + _bash_needmsg= +fi +if test $bash_cv_have_socklib = yes; then + # check for libnsl, add it to LIBS if present + if test "X$bash_cv_have_libnsl" = "X"; then + _bash_needmsg= + else + AC_MSG_CHECKING(for libnsl) + _bash_needmsg=yes + fi + AC_CACHE_VAL(bash_cv_have_libnsl, + [AC_CHECK_LIB(nsl, t_open, + bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)]) + if test "X$_bash_needmsg" = Xyes; then + AC_MSG_RESULT($bash_cv_have_libnsl) + _bash_needmsg= + fi + if test $bash_cv_have_libnsl = yes; then + LIBS="-lsocket -lnsl $LIBS" + else + LIBS="-lsocket $LIBS" + fi + AC_DEFINE(HAVE_LIBSOCKET) + AC_DEFINE(HAVE_GETPEERNAME) +fi +]) + +dnl like _AC_STRUCT_DIRENT(MEMBER) but public +AC_DEFUN(BASH_STRUCT_DIRENT, +[ +AC_REQUIRE([AC_HEADER_DIRENT]) +AC_CHECK_MEMBERS(struct dirent.$1, bash_cv_dirent_has_$1=yes, bash_cv_dirent_has_$1=no, +[[ +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ +#if defined(HAVE_DIRENT_H) +# include +#else +# define dirent direct +# ifdef HAVE_SYS_NDIR_H +# include +# endif /* SYSNDIR */ +# ifdef HAVE_SYS_DIR_H +# include +# endif /* SYSDIR */ +# ifdef HAVE_NDIR_H +# include +# endif +#endif /* HAVE_DIRENT_H */ +]]) +]) + +AC_DEFUN(BASH_STRUCT_DIRENT_D_INO, +[AC_REQUIRE([AC_HEADER_DIRENT]) +AC_MSG_CHECKING(for struct dirent.d_ino) +AC_CACHE_VAL(bash_cv_dirent_has_d_ino, [BASH_STRUCT_DIRENT([d_ino])]) +AC_MSG_RESULT($bash_cv_dirent_has_d_ino) +if test $bash_cv_dirent_has_d_ino = yes; then +AC_DEFINE(HAVE_STRUCT_DIRENT_D_INO) +fi +]) + +AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO, +[AC_REQUIRE([AC_HEADER_DIRENT]) +AC_MSG_CHECKING(for struct dirent.d_fileno) +AC_CACHE_VAL(bash_cv_dirent_has_d_fileno, [BASH_STRUCT_DIRENT([d_fileno])]) +AC_MSG_RESULT($bash_cv_dirent_has_d_fileno) +if test $bash_cv_dirent_has_d_fileno = yes; then +AC_DEFINE(HAVE_STRUCT_DIRENT_D_FILENO) +fi +]) + +AC_DEFUN(BASH_STRUCT_DIRENT_D_NAMLEN, +[AC_REQUIRE([AC_HEADER_DIRENT]) +AC_MSG_CHECKING(for struct dirent.d_namlen) +AC_CACHE_VAL(bash_cv_dirent_has_d_namlen, [BASH_STRUCT_DIRENT([d_namlen])]) +AC_MSG_RESULT($bash_cv_dirent_has_d_namlen) +if test $bash_cv_dirent_has_d_namlen = yes; then +AC_DEFINE(HAVE_STRUCT_DIRENT_D_NAMLEN) +fi +]) + +AC_DEFUN(BASH_STRUCT_TIMEVAL, +[AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h) +AC_CACHE_VAL(bash_cv_struct_timeval, +[AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#if HAVE_SYS_TIME_H + #include + #endif + #include + ]], + [[static struct timeval x; x.tv_sec = x.tv_usec;]] + )], + bash_cv_struct_timeval=yes, + bash_cv_struct_timeval=no) +]) +AC_MSG_RESULT($bash_cv_struct_timeval) +if test $bash_cv_struct_timeval = yes; then + AC_DEFINE(HAVE_TIMEVAL) +fi +]) + +AC_DEFUN(BASH_STRUCT_TIMEZONE, +[AC_MSG_CHECKING(for struct timezone in sys/time.h and time.h) +AC_CACHE_VAL(bash_cv_struct_timezone, +[ +AC_EGREP_HEADER(struct timezone, sys/time.h, + bash_cv_struct_timezone=yes, + AC_EGREP_HEADER(struct timezone, time.h, + bash_cv_struct_timezone=yes, + bash_cv_struct_timezone=no)) +]) +AC_MSG_RESULT($bash_cv_struct_timezone) +if test $bash_cv_struct_timezone = yes; then + AC_DEFINE(HAVE_STRUCT_TIMEZONE) +fi +]) + +AC_DEFUN(BASH_CHECK_WINSIZE_IOCTL, +[AC_CACHE_VAL(bash_cv_struct_winsize_ioctl, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +]], +[[ +struct winsize x; +if (sizeof (x) > 0) return (0); +]] )], [bash_cv_struct_winsize_ioctl=yes], [bash_cv_struct_winsize_ioctl=no]) +]) +]) + +AC_DEFUN(BASH_CHECK_WINSIZE_TERMIOS, +[AC_CACHE_VAL(bash_cv_struct_winsize_termios, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +]], +[[ +struct winsize x; +if (sizeof (x) > 0) return (0); +]] )], [bash_cv_struct_winsize_termios=yes], [bash_cv_struct_winsize_termios=no]) +]) +]) + +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, +[ +BASH_CHECK_WINSIZE_IOCTL +BASH_CHECK_WINSIZE_TERMIOS + +if test $bash_cv_struct_winsize_ioctl = yes; then + bash_cv_struct_winsize_header=ioctl_h +elif test $bash_cv_struct_winsize_termios = yes; then + bash_cv_struct_winsize_header=termios_h +else + bash_cv_struct_winsize_header=other +fi +]) +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_POSIX_SIGNALS, +[AC_CACHE_VAL(bash_cv_posix_signals, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +]], [[ + 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_posix_signals=yes], [bash_cv_posix_signals=no] +)]) +]) + +AC_DEFUN(BASH_HAVE_BSD_SIGNALS, +[AC_CACHE_VAL(bash_cv_bsd_signals, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +]], [[ +int mask = sigmask(SIGINT); +sigsetmask(mask); sigblock(mask); sigpause(mask); +]] )], +[bash_cv_bsd_signals=yes], [bash_cv_bsd_signals=no] +)]) +]) + +AC_DEFUN(BASH_HAVE_SYSV_SIGNALS, +[AC_CACHE_VAL(bash_cv_sysv_signals, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +void foo() { } +]], [[ +int mask = sigmask(SIGINT); +sigset(SIGINT, foo); sigrelse(SIGINT); +sighold(SIGINT); sigpause(SIGINT); +]] )], +[bash_cv_sysv_signals=yes], [bash_cv_sysv_signals=no] +)]) +]) + +dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7) +AC_DEFUN(BASH_SYS_SIGNAL_VINTAGE, +[AC_MSG_CHECKING(for type of signal functions) +AC_CACHE_VAL(bash_cv_signal_vintage, +[ +BASH_HAVE_POSIX_SIGNALS +if test $bash_cv_posix_signals = yes; then + bash_cv_signal_vintage=posix +else + BASH_HAVE_BSD_SIGNALS + if test $bash_cv_bsd_signals = yes; then + bash_cv_signal_vintage=4.2bsd + else + BASH_HAVE_SYSV_SIGNALS + if test $bash_cv_sysv_signals = yes; then + bash_cv_signal_vintage=svr3 + else + bash_cv_signal_vintage=v7 + fi + fi +fi +]) +AC_MSG_RESULT($bash_cv_signal_vintage) +if test "$bash_cv_signal_vintage" = posix; then +AC_DEFINE(HAVE_POSIX_SIGNALS) +elif test "$bash_cv_signal_vintage" = "4.2bsd"; then +AC_DEFINE(HAVE_BSD_SIGNALS) +elif test "$bash_cv_signal_vintage" = svr3; then +AC_DEFINE(HAVE_USG_SIGHOLD) +fi +]) + +dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process. +AC_DEFUN(BASH_SYS_PGRP_SYNC, +[AC_REQUIRE([AC_FUNC_GETPGRP]) +AC_MSG_CHECKING(whether pgrps need synchronization) +AC_CACHE_VAL(bash_cv_pgrp_pipe, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_SYS_WAIT_H +# include +#endif +#include +int +main() +{ +# ifdef GETPGRP_VOID +# define getpgID() getpgrp() +# else +# define getpgID() getpgrp(0) +# define setpgid(x,y) setpgrp(x,y) +# endif + int pid1, pid2, fds[2]; + int status; + char ok; + + switch (pid1 = fork()) { + case -1: + exit(1); + case 0: + setpgid(0, getpid()); + exit(0); + } + setpgid(pid1, pid1); + + sleep(2); /* let first child die */ + + if (pipe(fds) < 0) + exit(2); + + switch (pid2 = fork()) { + case -1: + exit(3); + case 0: + setpgid(0, pid1); + ok = getpgID() == pid1; + write(fds[1], &ok, 1); + exit(0); + } + setpgid(pid2, pid1); + + close(fds[1]); + if (read(fds[0], &ok, 1) != 1) + exit(4); + wait(&status); + wait(&status); + exit(ok ? 0 : 5); +} +]])], [bash_cv_pgrp_pipe=no], [bash_cv_pgrp_pipe=yes], + [AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no) + bash_cv_pgrp_pipe=no] +)]) +AC_MSG_RESULT($bash_cv_pgrp_pipe) +if test $bash_cv_pgrp_pipe = yes; then +AC_DEFINE(PGRP_PIPE) +fi +]) + +AC_DEFUN(BASH_SYS_REINSTALL_SIGHANDLERS, +[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) +AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked]) +AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +typedef void sigfunc(); + +volatile 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 + +void +sigint(s) +int s; +{ + nsigint++; +} + +int +main() +{ + nsigint = 0; + set_signal_handler(SIGINT, sigint); + kill((int)getpid(), SIGINT); + kill((int)getpid(), SIGINT); + exit(nsigint != 2); +} +]])], [bash_cv_must_reinstall_sighandlers=no], [bash_cv_must_reinstall_sighandlers=yes], + [AC_MSG_WARN(cannot check signal handling if cross compiling -- defaulting to no) + bash_cv_must_reinstall_sighandlers=no] +)]) +AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers) +if test $bash_cv_must_reinstall_sighandlers = yes; then +AC_DEFINE(MUST_REINSTALL_SIGHANDLERS) +fi +]) + +dnl check that some necessary job control definitions are present +AC_DEFUN(BASH_SYS_JOB_CONTROL_MISSING, +[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) +AC_MSG_CHECKING(for presence of necessary job control definitions) +AC_CACHE_VAL(bash_cv_job_control_missing, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#ifdef HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +/* add more tests in here as appropriate */ + +/* signal type */ +#if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS) +#error +#endif + +/* signals and tty control. */ +#if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT) +#error +#endif + +/* process control */ +#if !defined (WNOHANG) || !defined (WUNTRACED) +#error +#endif + +/* Posix systems have tcgetpgrp and waitpid. */ +#if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP) +#error +#endif + +#if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID) +#error +#endif + +/* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */ +#if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3) +#error +#endif + +]], [[ int x; ]] )], +[bash_cv_job_control_missing=present], [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_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +/* Add more tests in here as appropriate. */ +int +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("bash-aclocal", 0700); +if (err < 0) { + perror ("mkdir"); + exit(1); +} +fd = mknod ("bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0); +if (fd == -1) { + rmdir ("bash-aclocal"); + exit (1); +} +close(fd); +unlink ("bash-aclocal/sh-np-autoconf"); +rmdir ("bash-aclocal"); +exit(0); +} +]])], [bash_cv_sys_named_pipes=present], [bash_cv_sys_named_pipes=missing], + [AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing) + bash_cv_sys_named_pipes=missing] +)]) +AC_MSG_RESULT($bash_cv_sys_named_pipes) +if test $bash_cv_sys_named_pipes = missing; then +AC_DEFINE(NAMED_PIPES_MISSING) +fi +]) + +AC_DEFUN(BASH_SYS_DEFAULT_MAIL_DIR, +[AC_MSG_CHECKING(for default mail directory) +AC_CACHE_VAL(bash_cv_mail_dir, +[if test -d /var/mail; then + bash_cv_mail_dir=/var/mail + elif test -d /var/spool/mail; then + bash_cv_mail_dir=/var/spool/mail + elif test -d /usr/mail; then + bash_cv_mail_dir=/usr/mail + elif test -d /usr/spool/mail; then + bash_cv_mail_dir=/usr/spool/mail + else + bash_cv_mail_dir=unknown + fi +]) +AC_MSG_RESULT($bash_cv_mail_dir) +AC_DEFINE_UNQUOTED(DEFAULT_MAIL_DIRECTORY, "$bash_cv_mail_dir") +]) + +AC_DEFUN(BASH_HAVE_TIOCGWINSZ, +[AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h) +AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include ]], [[int x = TIOCGWINSZ;]] )], + [bash_cv_tiocgwinsz_in_ioctl=yes], [bash_cv_tiocgwinsz_in_ioctl=no] +)]) +AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl) +if test $bash_cv_tiocgwinsz_in_ioctl = yes; then +AC_DEFINE(GWINSZ_IN_SYS_IOCTL) +fi +]) + +AC_DEFUN(BASH_HAVE_TIOCSTAT, +[AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h) +AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include ]], [[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_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include ]], [[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 . Some versions of linux +dnl require a definition of speed_t each time is included, +dnl but you can only get speed_t if you include (on some +dnl versions) or (on others). +dnl +AC_DEFUN(BASH_CHECK_SPEED_T, +[AC_MSG_CHECKING(for speed_t in sys/types.h) +AC_CACHE_VAL(bash_cv_speed_t_in_sys_types, +[AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[speed_t x;]])], + [bash_cv_speed_t_in_sys_types=yes],[bash_cv_speed_t_in_sys_types=no])]) +AC_MSG_RESULT($bash_cv_speed_t_in_sys_types) +if test $bash_cv_speed_t_in_sys_types = yes; then +AC_DEFINE(SPEED_T_IN_SYS_TYPES) +fi +]) + +AC_DEFUN(BASH_CHECK_GETPW_FUNCS, +[AC_MSG_CHECKING(whether getpw functions are declared in pwd.h) +AC_CACHE_VAL(bash_cv_getpw_declared, +[AC_EGREP_CPP(getpwuid, +[ +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include +], +bash_cv_getpw_declared=yes,bash_cv_getpw_declared=no)]) +AC_MSG_RESULT($bash_cv_getpw_declared) +if test $bash_cv_getpw_declared = yes; then +AC_DEFINE(HAVE_GETPW_DECLS) +fi +]) + +AC_DEFUN(BASH_CHECK_DEV_FD, +[AC_MSG_CHECKING(whether /dev/fd is available) +AC_CACHE_VAL(bash_cv_dev_fd, +[bash_cv_dev_fd="" +if test -d /dev/fd && (exec test -r /dev/fd/0 < /dev/null) ; then +# check for systems like FreeBSD 5 that only provide /dev/fd/[012] + if (exec test -r /dev/fd/3 3 +#include +]], +[[ + int f; + f = RLIMIT_DATA; +]] )], +[bash_cv_rlimit=yes], [bash_cv_rlimit=no] +)]) +]) + +dnl +dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions +dnl +AC_DEFUN(BASH_CHECK_KERNEL_RLIMIT, +[AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines]) +AC_CACHE_VAL(bash_cv_kernel_rlimit, +[BASH_CHECK_RLIMIT +if test $bash_cv_rlimit = no; then +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#define _KERNEL +#include +#undef _KERNEL +]], +[[ + int f; + f = RLIMIT_DATA; +]] )], [bash_cv_kernel_rlimit=yes], [bash_cv_kernel_rlimit=no] ) +fi +]) +AC_MSG_RESULT($bash_cv_kernel_rlimit) +if test $bash_cv_kernel_rlimit = yes; then +AC_DEFINE(RLIMIT_NEEDS_KERNEL) +fi +]) + +dnl +dnl Check for 64-bit off_t -- used for malloc alignment +dnl +dnl C does not allow duplicate case labels, so the compile will fail if +dnl sizeof(off_t) is > 4. +dnl +AC_DEFUN(BASH_CHECK_OFF_T_64, +[AC_CACHE_CHECK(for 64-bit off_t, bash_cv_off_t_64, +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_UNISTD_H +#include +#endif +#include +]],[[ +switch (0) case 0: case (sizeof (off_t) <= 4):; +]] )], [bash_cv_off_t_64=no], [bash_cv_off_t_64=yes] +)) +if test $bash_cv_off_t_64 = yes; then + AC_DEFINE(HAVE_OFF_T_64) +fi]) + +AC_DEFUN(BASH_CHECK_RTSIGS, +[AC_MSG_CHECKING(for unusable real-time signals due to large values) +AC_CACHE_VAL(bash_cv_unusable_rtsigs, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include + +#ifndef NSIG +# define NSIG 64 +#endif + +int +main () +{ + int n_sigs = 2 * NSIG; +#ifdef SIGRTMIN + int rtmin = SIGRTMIN; +#else + int rtmin = 0; +#endif + + exit(rtmin < n_sigs); +} +]])], [bash_cv_unusable_rtsigs=yes], [bash_cv_unusable_rtsigs=no], + [AC_MSG_WARN(cannot check real-time signals if cross compiling -- defaulting to yes) + bash_cv_unusable_rtsigs=yes] +)]) +AC_MSG_RESULT($bash_cv_unusable_rtsigs) +if test $bash_cv_unusable_rtsigs = yes; then +AC_DEFINE(UNUSABLE_RT_SIGNALS) +fi +]) + +dnl +dnl check for availability of multibyte characters and functions +dnl +dnl geez, I wish I didn't have to check for all of this stuff separately +dnl +AC_DEFUN(BASH_CHECK_MULTIBYTE, +[ +AC_CHECK_HEADERS(wctype.h) +AC_CHECK_HEADERS(wchar.h) +AC_CHECK_HEADERS(langinfo.h) + +AC_CHECK_HEADERS(mbstr.h) + +AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN)) +AC_CHECK_FUNC(mbscasecmp, AC_DEFINE(HAVE_MBSCMP)) +AC_CHECK_FUNC(mbscmp, AC_DEFINE(HAVE_MBSCMP)) +AC_CHECK_FUNC(mbsnrtowcs, AC_DEFINE(HAVE_MBSNRTOWCS)) +AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS)) + +AC_REPLACE_FUNCS(mbschr) + +AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB)) +AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL)) +AC_CHECK_FUNC(wcsdup, AC_DEFINE(HAVE_WCSDUP)) +AC_CHECK_FUNC(wcwidth, AC_DEFINE(HAVE_WCWIDTH)) +AC_CHECK_FUNC(wctype, AC_DEFINE(HAVE_WCTYPE)) + +AC_REPLACE_FUNCS(wcswidth) + +dnl checks for both mbrtowc and mbstate_t +AC_FUNC_MBRTOWC +if test $ac_cv_func_mbrtowc = yes; then + AC_DEFINE(HAVE_MBSTATE_T) +fi + +AC_CHECK_FUNCS(iswlower iswupper towlower towupper iswctype) + +AC_REQUIRE([AM_LANGINFO_CODESET]) + +dnl check for wchar_t in +AC_CACHE_CHECK([for wchar_t in wchar.h], bash_cv_type_wchar_t, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +[#include ]], +[[ + wchar_t foo; + foo = 0; +]] )], [bash_cv_type_wchar_t=yes], [bash_cv_type_wchar_t=no] +)]) +if test $bash_cv_type_wchar_t = yes; then + AC_DEFINE(HAVE_WCHAR_T, 1, [systems should define this type here]) +fi + +dnl check for wctype_t in +AC_CACHE_CHECK([for wctype_t in wctype.h], bash_cv_type_wctype_t, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +[#include ]], +[[ + wctype_t foo; + foo = 0; +]] )], [bash_cv_type_wctype_t=yes], [bash_cv_type_wctype_t=no] +)]) +if test $bash_cv_type_wctype_t = yes; then + AC_DEFINE(HAVE_WCTYPE_T, 1, [systems should define this type here]) +fi + +dnl check for wint_t in +AC_CACHE_CHECK([for wint_t in wctype.h], bash_cv_type_wint_t, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +[#include ]], +[[ + wint_t foo; + foo = 0; +]] )], [bash_cv_type_wint_t=yes], [bash_cv_type_wint_t=no] +)]) +if test $bash_cv_type_wint_t = yes; then + AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here]) +fi + +dnl check for broken wcwidth +AC_CACHE_CHECK([for wcwidth broken with unicode combining characters], +bash_cv_wcwidth_broken, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include + +#include +#include + +int +main(c, v) +int c; +char **v; +{ + int w; + + setlocale(LC_ALL, "en_US.UTF-8"); + w = wcwidth (0x0301); + exit (w == 0); /* exit 0 if wcwidth broken */ +} +]])], [bash_cv_wcwidth_broken=yes], [bash_cv_wcwidth_broken=no], + [bash_cv_wcwidth_broken=no] +)]) +if test "$bash_cv_wcwidth_broken" = yes; then + AC_DEFINE(WCWIDTH_BROKEN, 1, [wcwidth is usually not broken]) +fi + +if test "$am_cv_func_iconv" = yes; then + OLDLIBS="$LIBS" + LIBS="$LIBS $LIBINTL $LIBICONV" + AC_CHECK_FUNCS(locale_charset) + LIBS="$OLDLIBS" +fi + +AC_CHECK_SIZEOF(wchar_t, 4) + +]) + +dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB +dnl require: +dnl AC_PROG_CC +dnl BASH_CHECK_LIB_TERMCAP + +AC_DEFUN([RL_LIB_READLINE_VERSION], +[ +AC_REQUIRE([BASH_CHECK_LIB_TERMCAP]) + +AC_MSG_CHECKING([version of installed readline library]) + +# What a pain in the ass this is. + +# save cpp and ld options +_save_CFLAGS="$CFLAGS" +_save_LDFLAGS="$LDFLAGS" +_save_LIBS="$LIBS" + +# Don't set ac_cv_rl_prefix if the caller has already assigned a value. This +# allows the caller to do something like $_rl_prefix=$withval if the user +# specifies --with-installed-readline=PREFIX as an argument to configure + +if test -z "$ac_cv_rl_prefix"; then +test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix} +fi + +eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include +eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib + +LIBS="$LIBS -lreadline ${TERMCAP_LIB}" +CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}" +LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}" + +AC_CACHE_VAL(ac_cv_rl_version, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include + +extern int rl_gnu_readline_p; + +int +main() +{ + FILE *fp; + fp = fopen("conftest.rlv", "w"); + if (fp == 0) + exit(1); + if (rl_gnu_readline_p != 1) + fprintf(fp, "0.0\n"); + else + fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0"); + fclose(fp); + exit(0); +} +]])], +[ac_cv_rl_version=`cat conftest.rlv`], +[ac_cv_rl_version='0.0'], +[ac_cv_rl_version='8.0'] +)]) + +CFLAGS="$_save_CFLAGS" +LDFLAGS="$_save_LDFLAGS" +LIBS="$_save_LIBS" + +RL_MAJOR=0 +RL_MINOR=0 + +# ( +case "$ac_cv_rl_version" in +2*|3*|4*|5*|6*|7*|8*|9*) + RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'` + RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'` + ;; +esac + +# ((( +case $RL_MAJOR in +[[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;; +[[0-9]]) _RL_MAJOR=0$RL_MAJOR ;; +*) _RL_MAJOR=00 ;; +esac + +# ((( +case $RL_MINOR in +[[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;; +[[0-9]]) _RL_MINOR=0$RL_MINOR ;; +*) _RL_MINOR=00 ;; +esac + +RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}" + +# Readline versions greater than 4.2 have these defines in readline.h + +if test $ac_cv_rl_version = '0.0' ; then + AC_MSG_WARN([Could not test version of installed readline library.]) +elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then + # set these for use by the caller + RL_PREFIX=$ac_cv_rl_prefix + RL_LIBDIR=$ac_cv_rl_libdir + RL_INCLUDEDIR=$ac_cv_rl_includedir + AC_MSG_RESULT($ac_cv_rl_version) +else + +AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library]) +AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library]) +AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library]) + +AC_SUBST(RL_VERSION) +AC_SUBST(RL_MAJOR) +AC_SUBST(RL_MINOR) + +# set these for use by the caller +RL_PREFIX=$ac_cv_rl_prefix +RL_LIBDIR=$ac_cv_rl_libdir +RL_INCLUDEDIR=$ac_cv_rl_includedir + +AC_MSG_RESULT($ac_cv_rl_version) + +fi +]) + +AC_DEFUN(BASH_CHECK_WCONTINUED, +[ +AC_MSG_CHECKING(whether WCONTINUED flag to waitpid is unavailable or available but broken) +AC_CACHE_VAL(bash_cv_wcontinued_broken, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +#include +#include + +#ifndef errno +extern int errno; +#endif +int +main() +{ + int x; + + x = waitpid(-1, (int *)0, WNOHANG|WCONTINUED); + if (x == -1 && errno == EINVAL) + exit (1); + else + exit (0); +} +]])], [bash_cv_wcontinued_broken=no], [bash_cv_wcontinued_broken=yes], + [AC_MSG_WARN(cannot check WCONTINUED if cross compiling -- defaulting to no) + bash_cv_wcontinued_broken=no] +)]) +AC_MSG_RESULT($bash_cv_wcontinued_broken) +if test $bash_cv_wcontinued_broken = yes; then +AC_DEFINE(WCONTINUED_BROKEN) +fi +]) + +dnl +dnl tests added for bashdb +dnl + + +AC_DEFUN([AM_PATH_LISPDIR], + [AC_ARG_WITH(lispdir, AS_HELP_STRING([--with-lispdir], [override the default lisp directory]), + [ lispdir="$withval" + AC_MSG_CHECKING([where .elc files should go]) + AC_MSG_RESULT([$lispdir])], + [ + # If set to t, that means we are running in a shell under Emacs. + # If you have an Emacs named "t", then use the full path. + test x"$EMACS" = xt && EMACS= + AC_CHECK_PROGS(EMACS, emacs xemacs, no) + if test $EMACS != "no"; then + if test x${lispdir+set} != xset; then + AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [dnl + am_cv_lispdir=`$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' | sed -n -e 's,/$,,' -e '/.*\/lib\/\(x\?emacs\/site-lisp\)$/{s,,${libdir}/\1,;p;q;}' -e '/.*\/share\/\(x\?emacs\/site-lisp\)$/{s,,${datadir}/\1,;p;q;}'` + if test -z "$am_cv_lispdir"; then + am_cv_lispdir='${datadir}/emacs/site-lisp' + fi + ]) + lispdir="$am_cv_lispdir" + fi + fi + ]) + AC_SUBST(lispdir) +]) + +dnl From gnulib +AC_DEFUN([BASH_FUNC_FPURGE], +[ + AC_CHECK_FUNCS_ONCE([fpurge]) + AC_CHECK_FUNCS_ONCE([__fpurge]) + AC_CHECK_DECLS([fpurge], , , [#include ]) +]) + +AC_DEFUN([BASH_FUNC_SNPRINTF], +[ + AC_CHECK_FUNCS_ONCE([snprintf]) + if test X$ac_cv_func_snprintf = Xyes; then + AC_CACHE_CHECK([for standard-conformant snprintf], [bash_cv_func_snprintf], + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include + +int +main() +{ + int n; + n = snprintf (0, 0, "%s", "0123456"); + exit(n != 7); +} +]])], [bash_cv_func_snprintf=yes], [bash_cv_func_snprintf=no], + [AC_MSG_WARN([cannot check standard snprintf if cross-compiling]) + bash_cv_func_snprintf=yes] +)]) + if test $bash_cv_func_snprintf = no; then + ac_cv_func_snprintf=no + fi + fi + if test $ac_cv_func_snprintf = no; then + AC_DEFINE(HAVE_SNPRINTF, 0, + [Define if you have a standard-conformant snprintf function.]) + fi +]) + +AC_DEFUN([BASH_FUNC_VSNPRINTF], +[ + AC_CHECK_FUNCS_ONCE([vsnprintf]) + if test X$ac_cv_func_vsnprintf = Xyes; then + AC_CACHE_CHECK([for standard-conformant vsnprintf], [bash_cv_func_vsnprintf], + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#if HAVE_STDARG_H +#include +#else +#include +#endif +#include +#include + +static int +#if HAVE_STDARG_H +foo(const char *fmt, ...) +#else +foo(format, va_alist) + const char *format; + va_dcl +#endif +{ + va_list args; + int n; + +#if HAVE_STDARG_H + va_start(args, fmt); +#else + va_start(args); +#endif + n = vsnprintf(0, 0, fmt, args); + va_end (args); + return n; +} + +int +main() +{ + int n; + n = foo("%s", "0123456"); + exit(n != 7); +} +]])], [bash_cv_func_vsnprintf=yes], [bash_cv_func_vsnprintf=no], + [AC_MSG_WARN([cannot check standard vsnprintf if cross-compiling]) + bash_cv_func_vsnprintf=yes] +)]) + if test $bash_cv_func_vsnprintf = no; then + ac_cv_func_vsnprintf=no + fi + fi + if test $ac_cv_func_vsnprintf = no; then + AC_DEFINE(HAVE_VSNPRINTF, 0, + [Define if you have a standard-conformant vsnprintf function.]) + fi +]) + +AC_DEFUN(BASH_STRUCT_WEXITSTATUS_OFFSET, +[AC_MSG_CHECKING(for offset of exit status in return status from wait) +AC_CACHE_VAL(bash_cv_wexitstatus_offset, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include + +#include + +int +main(c, v) + int c; + char **v; +{ + pid_t pid, p; + int s, i, n; + + s = 0; + pid = fork(); + if (pid == 0) + exit (42); + + /* wait for the process */ + p = wait(&s); + if (p != pid) + exit (255); + + /* crack s */ + for (i = 0; i < (sizeof(s) * 8); i++) + { + n = (s >> i) & 0xff; + if (n == 42) + exit (i); + } + + exit (254); +} +]])], [bash_cv_wexitstatus_offset=0], [bash_cv_wexitstatus_offset=$?], + [AC_MSG_WARN(cannot check WEXITSTATUS offset if cross compiling -- defaulting to 0) + bash_cv_wexitstatus_offset=0] +)]) +if test "$bash_cv_wexitstatus_offset" -gt 32 ; then + AC_MSG_WARN(bad exit status from test program -- defaulting to 0) + bash_cv_wexitstatus_offset=0 +fi +AC_MSG_RESULT($bash_cv_wexitstatus_offset) +AC_DEFINE_UNQUOTED([WEXITSTATUS_OFFSET], [$bash_cv_wexitstatus_offset], [Offset of exit status in wait status word]) +]) + +AC_DEFUN([BASH_FUNC_SBRK], +[ + AC_MSG_CHECKING([for sbrk]) + AC_CACHE_VAL(ac_cv_func_sbrk, + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[ void *x = sbrk (4096); ]])], + [ac_cv_func_sbrk=yes],[ac_cv_func_sbrk=no])]) + AC_MSG_RESULT($ac_cv_func_sbrk) + if test X$ac_cv_func_sbrk = Xyes; then + AC_CACHE_CHECK([for working sbrk], [bash_cv_func_sbrk], + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include + +int +main(int c, char **v) +{ + void *x; + + x = sbrk (4096); + exit ((x == (void *)-1) ? 1 : 0); +} +]])],[bash_cv_func_sbrk=yes],[bash_cv_func_sbrk=no],[AC_MSG_WARN([cannot check working sbrk if cross-compiling]) + bash_cv_func_sbrk=yes +])]) + if test $bash_cv_func_sbrk = no; then + ac_cv_func_sbrk=no + fi + fi + if test $ac_cv_func_sbrk = yes; then + AC_DEFINE(HAVE_SBRK, 1, + [Define if you have a working sbrk function.]) + fi +]) + +AC_DEFUN(BASH_FUNC_FNMATCH_EQUIV_FALLBACK, +[AC_MSG_CHECKING(whether fnmatch can be used to check bracket equivalence classes) +AC_CACHE_VAL(bash_cv_fnmatch_equiv_fallback, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +#include +#include + +char *pattern = "[[=a=]]"; + +/* char *string = "ä"; */ +unsigned char string[4] = { '\xc3', '\xa4', '\0' }; + +int +main (int c, char **v) +{ + setlocale (LC_ALL, "en_US.UTF-8"); + if (fnmatch (pattern, (const char *)string, 0) != FNM_NOMATCH) + exit (0); + exit (1); +} +]])], [bash_cv_fnmatch_equiv_fallback=yes], [bash_cv_fnmatch_equiv_fallback=no], + [AC_MSG_WARN(cannot check fnmatch if cross compiling -- defaulting to no) + bash_cv_fnmatch_equiv_fallback=no] +)]) +AC_MSG_RESULT($bash_cv_fnmatch_equiv_fallback) +if test "$bash_cv_fnmatch_equiv_fallback" = "yes" ; then + bash_cv_fnmatch_equiv_value=1 +else + bash_cv_fnmatch_equiv_value=0 +fi +AC_DEFINE_UNQUOTED([FNMATCH_EQUIV_FALLBACK], [$bash_cv_fnmatch_equiv_value], [Whether fnmatch can be used for bracket equivalence classes]) +]) diff --git a/ansi_stdlib.h b/ansi_stdlib.h new file mode 100644 index 0000000..7dc2ee0 --- /dev/null +++ b/ansi_stdlib.h @@ -0,0 +1,54 @@ +/* ansi_stdlib.h -- An ANSI Standard stdlib.h. */ +/* A minimal stdlib.h containing extern declarations for those functions + that bash uses. */ + +/* Copyright (C) 1993 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, 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. If not, see . +*/ + +#if !defined (_STDLIB_H_) +#define _STDLIB_H_ 1 + +/* String conversion functions. */ +extern int atoi (); + +extern double atof (); +extern double strtod (); + +/* Memory allocation functions. */ +/* Generic pointer type. */ +#ifndef PTR_T + +#if defined (__STDC__) +# define PTR_T void * +#else +# define PTR_T char * +#endif + +#endif /* PTR_T */ + +extern PTR_T malloc (); +extern PTR_T realloc (); +extern void free (); + +/* Other miscellaneous functions. */ +extern void abort (); +extern void exit (); +extern char *getenv (); +extern void qsort (); + +#endif /* _STDLIB_H */ diff --git a/bind.c b/bind.c new file mode 100644 index 0000000..971116a --- /dev/null +++ b/bind.c @@ -0,0 +1,3082 @@ +/* bind.c -- key binding and startup file support for the readline library. */ + +/* Copyright (C) 1987-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# include +#endif + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif /* HAVE_SYS_FILE_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +#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_skip_to_delim (char *, int, int); + +#if defined (USE_VARARGS) && defined (PREFER_STDARG) +static void _rl_init_file_error (const char *, ...) __attribute__((__format__ (printf, 1, 2))); +#else +static void _rl_init_file_error (); +#endif + +static rl_command_func_t *_rl_function_of_keyseq_internal (const char *, size_t, Keymap, int *); + +static char *_rl_read_file (char *, size_t *); +static int _rl_read_init_file (const char *, int); +static int glean_key_from_name (char *); + +static int find_boolean_var (const char *); +static int find_string_var (const char *); + +static const char *boolean_varname (int); +static const char *string_varname (int); + +static char *_rl_get_string_variable_value (const char *); +static int substring_member_of_array (const char *, const char * const *); + +static int _rl_get_keymap_by_name (const char *); +static int _rl_get_keymap_by_map (Keymap); + +static int currently_reading_init_file; + +/* used only in this file */ +static int _rl_prefer_visible_bell = 1; + +#define OP_EQ 1 +#define OP_NE 2 +#define OP_GT 3 +#define OP_GE 4 +#define OP_LT 5 +#define OP_LE 6 + +#define OPSTART(c) ((c) == '=' || (c) == '!' || (c) == '<' || (c) == '>') +#define CMPSTART(c) ((c) == '=' || (c) == '!') + +/* **************************************************************** */ +/* */ +/* Binding keys */ +/* */ +/* **************************************************************** */ + +/* rl_add_defun (char *name, rl_command_func_t *function, int key) + Add NAME to the list of named functions. Make FUNCTION be the function + that gets called. If KEY is not -1, then bind it. */ +int +rl_add_defun (const char *name, rl_command_func_t *function, int key) +{ + if (key != -1) + rl_bind_key (key, function); + rl_add_funmap_entry (name, function); + return 0; +} + +/* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */ +int +rl_bind_key (int key, rl_command_func_t *function) +{ + char keyseq[4]; + int l; + + if (key < 0 || key > largest_char) + return (key); + + /* Want to make this a multi-character key sequence with an ESC prefix */ + 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); + } + + /* Otherwise, let's just let rl_generic_bind handle the key sequence. + We start it off with ESC here and let the code below add the rest + of the sequence. */ + keyseq[0] = ESC; + l = 1; + key = UNMETA(key); + goto bind_keyseq; + } + + /* If it's bound to a function or macro, just overwrite. Otherwise we have + to treat it as a key sequence so rl_generic_bind handles shadow keymaps + for us. If we are binding '\' or \C-@ (NUL) make sure to escape it so + it makes it through the call to rl_translate_keyseq. */ + if (_rl_keymap[key].type != ISKMAP) + { + if (_rl_keymap[key].type == ISMACR) + xfree ((char *)_rl_keymap[key].function); + _rl_keymap[key].type = ISFUNC; + _rl_keymap[key].function = function; + } + else + { + l = 0; +bind_keyseq: + if (key == '\\') + { + keyseq[l++] = '\\'; + keyseq[l++] = '\\'; + } + else if (key == '\0') + { + keyseq[l++] = '\\'; + keyseq[l++] = '0'; + } + else + keyseq[l++] = key; + keyseq[l] = '\0'; + rl_bind_keyseq (keyseq, 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 (int key, rl_command_func_t *function, Keymap map) +{ + int result; + Keymap oldmap; + + oldmap = _rl_keymap; + _rl_keymap = map; + result = rl_bind_key (key, function); + _rl_keymap = oldmap; + return (result); +} + +/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right + now, this is always used to attempt to bind the arrow keys. */ +int +rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *default_func, Keymap kmap) +{ + char *keyseq; + + keyseq = rl_untranslate_keyseq ((unsigned char)key); + return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap)); +} + +int +rl_bind_key_if_unbound (int key, rl_command_func_t *default_func) +{ + char *keyseq; + + keyseq = rl_untranslate_keyseq ((unsigned char)key); + return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); +} + +/* Make KEY do nothing in the currently selected keymap. + Returns non-zero in case of error. This is not the same as self-insert; + this makes it a dead key. */ +int +rl_unbind_key (int key) +{ + return (rl_bind_key (key, (rl_command_func_t *)NULL)); +} + +/* Make KEY do nothing in MAP. Returns non-zero in case of error. */ +int +rl_unbind_key_in_map (int key, Keymap map) +{ + return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map)); +} + +/* Unbind all keys bound to FUNCTION in MAP. */ +int +rl_unbind_function_in_map (rl_command_func_t *func, Keymap map) +{ + register int i, rval; + + for (i = rval = 0; i < KEYMAP_SIZE; i++) + { + if (map[i].type == ISFUNC && map[i].function == func) + { + map[i].function = (rl_command_func_t *)NULL; + rval = 1; + } + else if (map[i].type == ISKMAP) /* TAG:readline-8.1 */ + { + int r; + r = rl_unbind_function_in_map (func, FUNCTION_TO_KEYMAP (map, i)); + if (r == 1) + rval = 1; + } + } + return rval; +} + +/* Unbind all keys bound to COMMAND, which is a bindable command name, in MAP */ +int +rl_unbind_command_in_map (const char *command, Keymap map) +{ + rl_command_func_t *func; + + func = rl_named_function (command); + if (func == 0) + return 0; + return (rl_unbind_function_in_map (func, map)); +} + +/* Bind the key sequence represented by the string KEYSEQ to + FUNCTION, starting in the current keymap. This makes new + keymaps as necessary. */ +int +rl_bind_keyseq (const char *keyseq, rl_command_func_t *function) +{ + return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap)); +} + +/* Bind the key sequence represented by the string KEYSEQ to + FUNCTION. This makes new keymaps as necessary. The initial + place to do bindings is in MAP. */ +int +rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) +{ + return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); +} + +/* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */ +int +rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map) +{ + return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); +} + +/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right + now, this is always used to attempt to bind the arrow keys, hence the + check for rl_vi_movement_mode. */ +int +rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *default_func, Keymap kmap) +{ + rl_command_func_t *func; + char *keys; + int keys_len; + + if (keyseq) + { + /* Handle key sequences that require translations and `raw' ones that + don't. This might be a problem with backslashes. */ + keys = (char *)xmalloc (1 + (2 * strlen (keyseq))); + if (rl_translate_keyseq (keyseq, keys, &keys_len)) + { + xfree (keys); + return -1; + } + func = rl_function_of_keyseq_len (keys, keys_len, kmap, (int *)NULL); + xfree (keys); +#if defined (VI_MODE) + if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode) +#else + if (!func || func == rl_do_lowercase_version) +#endif + return (rl_bind_keyseq_in_map (keyseq, default_func, kmap)); + else + return 1; + } + return 0; +} + +int +rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *default_func) +{ + return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); +} + +/* Bind the key sequence represented by the string KEYSEQ to + the string of characters MACRO. This makes new keymaps as + necessary. The initial place to do bindings is in MAP. */ +int +rl_macro_bind (const char *keyseq, const char *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, ¯o_keys_len)) + { + xfree (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 (int type, const char *keyseq, char *data, Keymap map) +{ + char *keys; + int keys_len, prevkey, ic; + register int i; + KEYMAP_ENTRY k; + Keymap prevmap; + + k.function = 0; + + /* If no keys to bind to, exit right away. */ + if (keyseq == 0 || *keyseq == 0) + { + if (type == ISMACR) + xfree (data); + return -1; + } + + keys = (char *)xmalloc (1 + (2 * strlen (keyseq))); + + /* Translate the ASCII representation of KEYSEQ into an array of + characters. Stuff the characters into KEYS, and the length of + KEYS into KEYS_LEN. */ + if (rl_translate_keyseq (keyseq, keys, &keys_len)) + { + xfree (keys); + return -1; + } + + prevmap = map; + prevkey = keys[0]; + + /* Bind keys, making new keymaps as necessary. */ + for (i = 0; i < keys_len; i++) + { + unsigned char uc = keys[i]; + + if (i > 0) + prevkey = ic; + + ic = uc; + if (ic < 0 || ic >= KEYMAP_SIZE) + { + xfree (keys); + return -1; + } + + /* We now rely on rl_translate_keyseq to do this conversion, so this + check is superfluous. */ +#if 0 + if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) + { + ic = UNMETA (ic); + if (map[ESC].type == ISKMAP) + { + prevmap = map; + map = FUNCTION_TO_KEYMAP (map, ESC); + } + } +#endif + + if ((i + 1) < keys_len) + { + if (map[ic].type != ISKMAP) + { + /* We allow subsequences of keys. If a keymap is being + created that will `shadow' an existing function or macro + key binding, we save that keybinding into the ANYOTHERKEY + index in the new map. The dispatch code will look there + to find the function to execute if the subsequence is not + matched. ANYOTHERKEY was chosen to be greater than + UCHAR_MAX. */ + k = map[ic]; + + map[ic].type = ISKMAP; + map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap()); + } + prevmap = map; + map = FUNCTION_TO_KEYMAP (map, ic); + /* The dispatch code will return this function if no matching + key sequence is found in the keymap. This (with a little + help from the dispatch code in readline.c) allows `a' to be + mapped to something, `abc' to be mapped to something else, + and the function bound to `a' to be executed when the user + types `abx', leaving `bx' in the input queue. */ + if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR)) + { + map[ANYOTHERKEY] = k; + k.function = 0; + } + } + else + { + if (map[ic].type == ISKMAP) + { + prevmap = map; + map = FUNCTION_TO_KEYMAP (map, ic); + ic = ANYOTHERKEY; + /* If we're trying to override a keymap with a null function + (e.g., trying to unbind it), we can't use a null pointer + here because that's indistinguishable from having not been + overridden. We use a special bindable function that does + nothing. */ + if (type == ISFUNC && data == 0) + data = (char *)_rl_null_function; + } + if (map[ic].type == ISMACR) + xfree ((char *)map[ic].function); + + map[ic].function = KEYMAP_TO_FUNCTION (data); + map[ic].type = type; + } + + rl_binding_keymap = map; + + } + + /* If we unbound a key (type == ISFUNC, data == 0), and the prev keymap + points to the keymap where we unbound the key (sanity check), and the + current binding keymap is empty (rl_empty_keymap() returns non-zero), + and the binding keymap has ANYOTHERKEY set with type == ISFUNC + (overridden function), delete the now-empty keymap, take the previously- + overridden function and remove the override. */ + /* Right now, this only works one level back. */ + if (type == ISFUNC && data == 0 && + prevmap[prevkey].type == ISKMAP && + (FUNCTION_TO_KEYMAP(prevmap, prevkey) == rl_binding_keymap) && + rl_binding_keymap[ANYOTHERKEY].type == ISFUNC && + rl_empty_keymap (rl_binding_keymap)) + { + prevmap[prevkey].type = rl_binding_keymap[ANYOTHERKEY].type; + prevmap[prevkey].function = rl_binding_keymap[ANYOTHERKEY].function; + rl_discard_keymap (rl_binding_keymap); + rl_binding_keymap = prevmap; + } + + xfree (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 (const char *seq, char *array, int *len) +{ + register int i, l, temp; + int has_control, has_meta; + unsigned char c; + + has_control = 0; + has_meta = 0; + + /* When there are incomplete prefixes \C- or \M- (has_control || has_meta) + without base character at the end of SEQ, they are processed as the + prefixes for '\0'. + */ + for (i = l = 0; (c = seq[i]) || has_control || has_meta; i++) + { + /* Only backslashes followed by a non-null character are handled + specially. Trailing backslash (backslash followed by '\0') is + processed as a normal character. + */ + if (c == '\\' && seq[i + 1] != '\0') + { + c = seq[++i]; + + /* Handle \C- and \M- prefixes. */ + if (c == 'C' && seq[i + 1] == '-') + { + i++; + has_control = 1; + continue; + } + else if (c == 'M' && seq[i + 1] == '-') + { + i++; + has_meta = 1; + 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': + c = '\007'; + break; + case 'b': + c = '\b'; + break; + case 'd': + c = RUBOUT; /* readline-specific */ + break; + case 'e': + c = ESC; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = NEWLINE; + break; + case 'r': + c = RETURN; + break; + case 't': + c = TAB; + break; + case 'v': + c = 0x0B; + break; + case '\\': + c = '\\'; + break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + i++; + for (temp = 2, c -= '0'; ISOCTAL ((unsigned char)seq[i]) && temp--; i++) + c = (c * 8) + OCTVALUE (seq[i]); + i--; /* auto-increment in for loop */ + c &= largest_char; + break; + case 'x': + i++; + for (temp = 2, c = 0; ISXDIGIT ((unsigned char)seq[i]) && temp--; i++) + c = (c * 16) + HEXVALUE (seq[i]); + if (temp == 2) + c = 'x'; + i--; /* auto-increment in for loop */ + c &= largest_char; + break; + default: /* backslashes before non-special chars just add the char */ + c &= largest_char; + break; /* the backslash is stripped */ + } + } + + /* Process \C- and \M- flags */ + if (has_control) + { + /* Special treatment for C-? */ + c = (c == '?') ? RUBOUT : CTRL (_rl_to_upper (c)); + has_control = 0; + } + if (has_meta) + { + c = META (c); + has_meta = 0; + } + + /* If convert-meta is turned on, convert a meta char to a key sequence */ + if (META_CHAR (c) && _rl_convert_meta_chars_to_ascii) + { + array[l++] = ESC; /* ESC is meta-prefix */ + array[l++] = UNMETA (c); + } + else + array[l++] = (c); + + /* Null characters may be processed for incomplete prefixes at the end of + sequence */ + if (seq[i] == '\0') + break; + } + + *len = l; + array[l] = '\0'; + return (0); +} + +static int +_rl_isescape (int c) +{ + switch (c) + { + case '\007': + case '\b': + case '\f': + case '\n': + case '\r': + case TAB: + case 0x0b: return (1); + default: return (0); + } +} + +static int +_rl_escchar (int c) +{ + switch (c) + { + case '\007': return ('a'); + case '\b': return ('b'); + case '\f': return ('f'); + case '\n': return ('n'); + case '\r': return ('r'); + case TAB: return ('t'); + case 0x0b: return ('v'); + default: return (c); + } +} + +char * +rl_untranslate_keyseq (int seq) +{ + static char kseq[16]; + int i, c; + + i = 0; + c = seq; + if (META_CHAR (c)) + { + kseq[i++] = '\\'; + kseq[i++] = 'M'; + kseq[i++] = '-'; + c = UNMETA (c); + } + else if (c == ESC) + { + kseq[i++] = '\\'; + c = 'e'; + } + else if (CTRL_CHAR (c)) + { + kseq[i++] = '\\'; + kseq[i++] = 'C'; + kseq[i++] = '-'; + c = _rl_to_lower (UNCTRL (c)); + } + else if (c == RUBOUT) + { + kseq[i++] = '\\'; + kseq[i++] = 'C'; + kseq[i++] = '-'; + c = '?'; + } + + if (c == ESC) + { + kseq[i++] = '\\'; + c = 'e'; + } + else if (c == '\\' || c == '"') + { + kseq[i++] = '\\'; + } + + kseq[i++] = (unsigned char) c; + kseq[i] = '\0'; + return kseq; +} + +char * +_rl_untranslate_macro_value (char *seq, int use_escapes) +{ + char *ret, *r, *s; + int c; + + r = ret = (char *)xmalloc (7 * strlen (seq) + 1); + for (s = seq; *s; s++) + { + c = *s; + if (META_CHAR (c)) + { + *r++ = '\\'; + *r++ = 'M'; + *r++ = '-'; + c = UNMETA (c); + } + else if (c == ESC) + { + *r++ = '\\'; + c = 'e'; + } + else if (CTRL_CHAR (c)) + { + *r++ = '\\'; + if (use_escapes && _rl_isescape (c)) + c = _rl_escchar (c); + else + { + *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. The string match is case-insensitive. */ +rl_command_func_t * +rl_named_function (const char *string) +{ + register int i; + + rl_initialize_funmap (); + + for (i = 0; funmap[i]; i++) + if (_rl_stricmp (funmap[i]->name, string) == 0) + return (funmap[i]->function); + return ((rl_command_func_t *)NULL); +} + +/* Return the function (or macro) definition which would be invoked via + KEYSEQ if executed in MAP. If MAP is NULL, then the current keymap is + used. TYPE, if non-NULL, is a pointer to an int which will receive the + type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap), + or ISMACR (macro). */ +static rl_command_func_t * +_rl_function_of_keyseq_internal (const char *keyseq, size_t len, Keymap map, int *type) +{ + register int i; + + if (map == 0) + map = _rl_keymap; + + for (i = 0; keyseq && i < len; i++) + { + unsigned char ic = keyseq[i]; + + if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) + { + if (map[ESC].type == ISKMAP) + { + map = FUNCTION_TO_KEYMAP (map, ESC); + ic = UNMETA (ic); + } + /* XXX - should we just return NULL here, since this obviously + doesn't match? */ + else + { + if (type) + *type = map[ESC].type; + + return (map[ESC].function); + } + } + + if (map[ic].type == ISKMAP) + { + /* If this is the last key in the key sequence, return the + map. */ + if (i + 1 == len) + { + if (type) + *type = ISKMAP; + + return (map[ic].function); + } + else + map = FUNCTION_TO_KEYMAP (map, ic); + } + /* If we're not at the end of the key sequence, and the current key + is bound to something other than a keymap, then the entire key + sequence is not bound. */ + else if (map[ic].type != ISKMAP && i+1 < len) + return ((rl_command_func_t *)NULL); + else /* map[ic].type != ISKMAP && i+1 == len */ + { + if (type) + *type = map[ic].type; + + return (map[ic].function); + } + } + return ((rl_command_func_t *) NULL); +} + +rl_command_func_t * +rl_function_of_keyseq (const char *keyseq, Keymap map, int *type) +{ + return _rl_function_of_keyseq_internal (keyseq, strlen (keyseq), map, type); +} + +rl_command_func_t * +rl_function_of_keyseq_len (const char *keyseq, size_t len, Keymap map, int *type) +{ + return _rl_function_of_keyseq_internal (keyseq, len, map, type); +} + +/* Assuming there is a numeric argument at the beginning of KEYSEQ (the + caller is responsible for checking), return the index of the portion of + the key sequence following the numeric argument. If there's no numeric + argument (?), or if KEYSEQ consists solely of a numeric argument (?), + return -1. */ +int +rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map) +{ + register int i, j, parsing_digits; + unsigned char ic; + Keymap map0; + + if (map == 0) + map = _rl_keymap; + map0 = map; + + /* The digits following the initial one (e.g., the binding to digit-argument) + or the optional `-' in a binding to digit-argument or universal-argument + are not added to rl_executing_keyseq. This is basically everything read by + rl_digit_loop. The parsing_digits logic is here in case they ever are. */ + for (i = j = parsing_digits = 0; keyseq && i < len; i++) + { + ic = keyseq[i]; + + if (parsing_digits) + { + if (_rl_digit_p (ic)) + { + j = i + 1; + continue; + } + parsing_digits = 0; + } + + if (map[ic].type == ISKMAP) + { + if (i + 1 == len) + return -1; + map = FUNCTION_TO_KEYMAP (map, ic); + continue; + } + if (map[ic].type == ISFUNC) + { +#if defined (VI_MODE) + if (map[ic].function != rl_digit_argument && map[ic].function != rl_universal_argument && map[ic].function != rl_vi_arg_digit) +#else + if (map[ic].function != rl_digit_argument && map[ic].function != rl_universal_argument) +#endif + return (j); + + /* We don't bother with a keyseq that is only a numeric argument */ + if (i + 1 == len) + return -1; + + parsing_digits = 1; + + /* This logic should be identical to rl_digit_loop */ + /* We accept M-- as equivalent to M--1, C-u- as equivalent to C-u-1 + but set parsing_digits to 2 to note that we saw `-' */ + if (map[ic].function == rl_universal_argument && (i + 1 == '-')) + { + i++; + parsing_digits = 2; + } + if (map[ic].function == rl_digit_argument && ic == '-') + { + parsing_digits = 2; + } + + map = map0; + j = i + 1; + } + } + + /* If we're still parsing digits by the time we get here, we don't allow a + key sequence that consists solely of a numeric argument */ + return -1; +} + +/* The last key bindings file read. */ +static char *last_readline_init_file = (char *)NULL; + +/* The file we're currently reading key bindings from. */ +static const char *current_readline_init_file; +static int current_readline_init_include_level; +static int current_readline_init_lineno; + +/* Read FILENAME into a locally-allocated buffer and return the buffer. + The size of the buffer is returned in *SIZEP. Returns NULL if any + errors were encountered. */ +static char * +_rl_read_file (char *filename, size_t *sizep) +{ + struct stat finfo; + size_t file_size; + char *buffer; + int i, file; + + file = -1; + if (((file = open (filename, O_RDONLY, 0666)) < 0) || (fstat (file, &finfo) < 0)) + { + if (file >= 0) + close (file); + return ((char *)NULL); + } + + file_size = (size_t)finfo.st_size; + + /* check for overflow on very large files */ + if (file_size != finfo.st_size || file_size + 1 < file_size) + { + if (file >= 0) + close (file); +#if defined (EFBIG) + errno = EFBIG; +#endif + return ((char *)NULL); + } + + /* Read the file into BUFFER. */ + buffer = (char *)xmalloc (file_size + 1); + i = read (file, buffer, file_size); + close (file); + + if (i < 0) + { + xfree (buffer); + return ((char *)NULL); + } + + RL_CHECK_SIGNALS (); + + buffer[i] = '\0'; + if (sizep) + *sizep = i; + + return (buffer); +} + +/* Re-read the current keybindings file. */ +int +rl_re_read_init_file (int count, int ignore) +{ + int r; + r = rl_read_init_file ((const char *)NULL); + rl_set_keymap_from_edit_mode (); + return r; +} + +/* Do key bindings from a file. If FILENAME is NULL it defaults + to the first non-null filename from this list: + 1. the filename used for the previous call + 2. the value of the shell variable `INPUTRC' + 3. ~/.inputrc + 4. /etc/inputrc + If the file existed and could be opened and read, 0 is returned, + otherwise errno is returned. */ +int +rl_read_init_file (const char *filename) +{ + /* Default the filename. */ + if (filename == 0) + filename = last_readline_init_file; + if (filename == 0) + filename = sh_get_env_value ("INPUTRC"); + if (filename == 0 || *filename == 0) + { + filename = DEFAULT_INPUTRC; + /* Try to read DEFAULT_INPUTRC; fall back to SYS_INPUTRC on failure */ + if (_rl_read_init_file (filename, 0) == 0) + return 0; + filename = SYS_INPUTRC; + } + +#if defined (__MSDOS__) + if (_rl_read_init_file (filename, 0) == 0) + return 0; + filename = "~/_inputrc"; +#endif + return (_rl_read_init_file (filename, 0)); +} + +static int +_rl_read_init_file (const char *filename, int include_level) +{ + register int i; + char *buffer, *openname, *line, *end; + size_t file_size; + + current_readline_init_file = filename; + current_readline_init_include_level = include_level; + + openname = tilde_expand (filename); + buffer = _rl_read_file (openname, &file_size); + xfree (openname); + + RL_CHECK_SIGNALS (); + if (buffer == 0) + return (errno); + + if (include_level == 0 && filename != last_readline_init_file) + { + FREE (last_readline_init_file); + last_readline_init_file = savestring (filename); + } + + currently_reading_init_file = 1; + + /* Loop over the lines in the file. Lines that start with `#' are + comments; all other lines are commands for readline initialization. */ + current_readline_init_lineno = 1; + line = buffer; + end = buffer + file_size; + while (line < end) + { + /* Find the end of this line. */ + for (i = 0; line + i != end && line[i] != '\n'; i++); + +#if defined (__CYGWIN__) + /* ``Be liberal in what you accept.'' */ + if (line[i] == '\n' && line[i-1] == '\r') + line[i - 1] = '\0'; +#endif + + /* Mark end of line. */ + line[i] = '\0'; + + /* Skip leading whitespace. */ + while (*line && whitespace (*line)) + { + line++; + i--; + } + + /* If the line is not a comment, then parse it. */ + if (*line && *line != '#') + rl_parse_and_bind (line); + + /* Move to the next line. */ + line += i + 1; + current_readline_init_lineno++; + } + + xfree (buffer); + currently_reading_init_file = 0; + return (0); +} + +static void +#if defined (PREFER_STDARG) +_rl_init_file_error (const char *format, ...) +#else +_rl_init_file_error (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 + + fprintf (stderr, "readline: "); + if (currently_reading_init_file) + fprintf (stderr, "%s: line %d: ", current_readline_init_file, + current_readline_init_lineno); + + vfprintf (stderr, format, args); + fprintf (stderr, "\n"); + fflush (stderr); + + va_end (args); +} + +/* **************************************************************** */ +/* */ +/* Parser Helper Functions */ +/* */ +/* **************************************************************** */ + +static int +parse_comparison_op (s, indp) + const char *s; + int *indp; +{ + int i, peekc, op; + + if (OPSTART (s[*indp]) == 0) + return -1; + i = *indp; + peekc = s[i] ? s[i+1] : 0; + op = -1; + + if (s[i] == '=') + { + op = OP_EQ; + if (peekc == '=') + i++; + i++; + } + else if (s[i] == '!' && peekc == '=') + { + op = OP_NE; + i += 2; + } + else if (s[i] == '<' && peekc == '=') + { + op = OP_LE; + i += 2; + } + else if (s[i] == '>' && peekc == '=') + { + op = OP_GE; + i += 2; + } + else if (s[i] == '<') + { + op = OP_LT; + i += 1; + } + else if (s[i] == '>') + { + op = OP_GT; + i += 1; + } + + *indp = i; + return op; +} + +/* **************************************************************** */ +/* */ +/* Parser Directives */ +/* */ +/* **************************************************************** */ + +typedef int _rl_parser_func_t (char *); + +/* Things that mean `Control'. */ +const char * const _rl_possible_control_prefixes[] = { + "Control-", "C-", "CTRL-", (const char *)NULL +}; + +const char * const _rl_possible_meta_prefixes[] = { + "Meta", "M-", (const char *)NULL +}; + +/* Forward declarations */ +static int parser_if (char *); +static int parser_else (char *); +static int parser_endif (char *); +static int parser_include (char *); + +/* Conditionals. */ + +/* Calling programs set this to have their argv[0]. */ +const char *rl_readline_name = "other"; + +/* Stack of previous values of parsing_conditionalized_out. */ +static unsigned char *if_stack = (unsigned char *)NULL; +static int if_stack_depth; +static int if_stack_size; + +/* Push _rl_parsing_conditionalized_out, and set parser state based + on ARGS. */ +static int +parser_if (char *args) +{ + int i, llen, boolvar, strvar; + + boolvar = strvar = -1; + + /* 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; + + llen = strlen (args); + + /* 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); + xfree (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 */ + else if (_rl_strnicmp (args, "version", 7) == 0) + { + int rlversion, versionarg, op, previ, major, minor, opresult; + + _rl_parsing_conditionalized_out = 1; + rlversion = RL_VERSION_MAJOR*10 + RL_VERSION_MINOR; + /* if "version" is separated from the operator by whitespace, or the + operand is separated from the operator by whitespace, restore it. + We're more liberal with allowed whitespace for this variable. */ + if (i > 0 && i <= llen && args[i-1] == '\0') + args[i-1] = ' '; + args[llen] = '\0'; /* just in case */ + for (i = 7; whitespace (args[i]); i++) + ; + if (OPSTART(args[i]) == 0) + { + _rl_init_file_error ("comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line"); + return 0; + } + previ = i; + op = parse_comparison_op (args, &i); + if (op <= 0) + { + _rl_init_file_error ("comparison operator expected, found `%s'", args+previ); + return 0; + } + for ( ; args[i] && whitespace (args[i]); i++) + ; + if (args[i] == 0 || _rl_digit_p (args[i]) == 0) + { + _rl_init_file_error ("numeric argument expected, found `%s'", args+i); + return 0; + } + major = minor = 0; + previ = i; + for ( ; args[i] && _rl_digit_p (args[i]); i++) + major = major*10 + _rl_digit_value (args[i]); + if (args[i] == '.') + { + if (args[i + 1] && _rl_digit_p (args [i + 1]) == 0) + { + _rl_init_file_error ("numeric argument expected, found `%s'", args+previ); + return 0; + } + for (++i; args[i] && _rl_digit_p (args[i]); i++) + minor = minor*10 + _rl_digit_value (args[i]); + } + /* optional - check for trailing garbage on the line, allow whitespace + and a trailing comment */ + previ = i; + for ( ; args[i] && whitespace (args[i]); i++) + ; + if (args[i] && args[i] != '#') + { + _rl_init_file_error ("trailing garbage on line: `%s'", args+previ); + return 0; + } + versionarg = major*10 + minor; + + switch (op) + { + case OP_EQ: + opresult = rlversion == versionarg; + break; + case OP_NE: + opresult = rlversion != versionarg; + break; + case OP_GT: + opresult = rlversion > versionarg; + break; + case OP_GE: + opresult = rlversion >= versionarg; + break; + case OP_LT: + opresult = rlversion < versionarg; + break; + case OP_LE: + opresult = rlversion <= versionarg; + break; + } + _rl_parsing_conditionalized_out = 1 - opresult; + } + /* 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 if ((boolvar = find_boolean_var (args)) >= 0 || (strvar = find_string_var (args)) >= 0) + { + int op, previ; + size_t vlen; + const char *vname; + char *valuearg, *vval, prevc; + + _rl_parsing_conditionalized_out = 1; + vname = (boolvar >= 0) ? boolean_varname (boolvar) : string_varname (strvar); + vlen = strlen (vname); + if (i > 0 && i <= llen && args[i-1] == '\0') + args[i-1] = ' '; + args[llen] = '\0'; /* just in case */ + for (i = vlen; whitespace (args[i]); i++) + ; + if (CMPSTART(args[i]) == 0) + { + _rl_init_file_error ("equality comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line"); + return 0; + } + previ = i; + op = parse_comparison_op (args, &i); + if (op != OP_EQ && op != OP_NE) + { + _rl_init_file_error ("equality comparison operator expected, found `%s'", args+previ); + return 0; + } + for ( ; args[i] && whitespace (args[i]); i++) + ; + if (args[i] == 0) + { + _rl_init_file_error ("argument expected, found `%s'", args+i); + return 0; + } + previ = i; + valuearg = args + i; + for ( ; args[i] && whitespace (args[i]) == 0; i++) + ; + prevc = args[i]; + args[i] = '\0'; /* null-terminate valuearg */ + vval = rl_variable_value (vname); + if (op == OP_EQ) + _rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) != 0; + else if (op == OP_NE) + _rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) == 0; + args[i] = prevc; + } + else + _rl_parsing_conditionalized_out = 1; + return 0; +} + +/* Invert the current parser state if there is anything on the stack. */ +static int +parser_else (char *args) +{ + register int i; + + if (if_stack_depth == 0) + { + _rl_init_file_error ("$else found without matching $if"); + return 0; + } + +#if 0 + /* Check the previous (n - 1) levels of the stack to make sure that + we haven't previously turned off parsing. */ + for (i = 0; i < if_stack_depth - 1; i++) +#else + /* Check the previous (n) levels of the stack to make sure that + we haven't previously turned off parsing. */ + for (i = 0; i < if_stack_depth; i++) +#endif + if (if_stack[i] == 1) + return 0; + + /* Invert the state of parsing if at top level. */ + _rl_parsing_conditionalized_out = !_rl_parsing_conditionalized_out; + return 0; +} + +/* Terminate a conditional, popping the value of + _rl_parsing_conditionalized_out from the stack. */ +static int +parser_endif (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 (char *args) +{ + const char *old_init_file; + char *e; + int old_line_number, old_include_level, r; + + if (_rl_parsing_conditionalized_out) + return (0); + + old_init_file = current_readline_init_file; + old_line_number = current_readline_init_lineno; + old_include_level = current_readline_init_include_level; + + e = strchr (args, '\n'); + if (e) + *e = '\0'; + r = _rl_read_init_file ((const char *)args, old_include_level + 1); + + current_readline_init_file = old_init_file; + current_readline_init_lineno = old_line_number; + current_readline_init_include_level = old_include_level; + + return r; +} + +/* Associate textual names with actual functions. */ +static const struct { + const char * const name; + _rl_parser_func_t *function; +} parser_directives [] = { + { "if", parser_if }, + { "endif", parser_endif }, + { "else", parser_else }, + { "include", parser_include }, + { (char *)0x0, (_rl_parser_func_t *)0x0 } +}; + +/* Handle a parser directive. STATEMENT is the line of the directive + without any leading `$'. */ +static int +handle_parser_directive (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 ("%s: unknown parser directive", directive); + return (1); +} + +/* Start at STRING[START] and look for DELIM. Return I where STRING[I] == + DELIM or STRING[I] == 0. DELIM is usually a double quote. */ +static int +_rl_skip_to_delim (char *string, int start, int delim) +{ + int i, c, passc; + + for (i = start,passc = 0; c = string[i]; i++) + { + if (passc) + { + passc = 0; + if (c == 0) + break; + continue; + } + + if (c == '\\') + { + passc = 1; + continue; + } + + if (c == delim) + break; + } + + return i; +} + +/* 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 (char *string) +{ + char *funname, *kname; + register int c, i; + int key, equivalency, foundmod, foundsep; + + while (string && whitespace (*string)) + string++; + + if (string == 0 || *string == 0 || *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 == '"') + { + i = _rl_skip_to_delim (string, 1, '"'); + + /* If we didn't find a closing quote, abort the line. */ + if (string[i] == '\0') + { + _rl_init_file_error ("%s: no closing `\"' in key binding", string); + return 1; + } + else + i++; /* skip past closing double quote */ + } + + /* Advance to the colon (:) or whitespace which separates the two objects. */ + for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ ); + + if (i == 0) + { + _rl_init_file_error ("`%s': invalid key binding: missing key sequence", string); + return 1; + } + + equivalency = (c == ':' && string[i + 1] == '='); + + foundsep = c != 0; + + /* Mark the end of the command (or keyname). */ + if (string[i]) + string[i++] = '\0'; + + /* If doing assignment, skip the '=' sign as well. */ + if (equivalency) + string[i++] = '\0'; + + /* If this is a command to set a variable, then do that. */ + if (_rl_stricmp (string, "set") == 0) + { + char *var, *value, *e; + int s; + + var = string + i; + /* Make VAR point to start of variable name. */ + while (*var && whitespace (*var)) var++; + + /* Make VALUE point to start of value string. */ + value = var; + while (*value && whitespace (*value) == 0) value++; + if (*value) + *value++ = '\0'; + while (*value && whitespace (*value)) value++; + + /* Strip trailing whitespace from values of boolean variables. */ + if (find_boolean_var (var) >= 0) + { + /* just read a whitespace-delimited word or empty string */ + for (e = value; *e && whitespace (*e) == 0; e++) + ; + if (e > value) + *e = '\0'; /* cut off everything trailing */ + } + else if ((i = find_string_var (var)) >= 0) + { + /* Allow quoted strings in variable values */ + if (*value == '"') + { + i = _rl_skip_to_delim (value, 1, *value); + value[i] = '\0'; + value++; /* skip past the quote */ + } + else + { + /* remove trailing whitespace */ + e = value + strlen (value) - 1; + while (e >= value && whitespace (*e)) + e--; + e++; /* skip back to whitespace or EOS */ + + if (*e && e >= value) + *e = '\0'; + } + } + else + { + /* avoid calling rl_variable_bind just to find this out */ + _rl_init_file_error ("%s: unknown variable name", var); + return 1; + } + + 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 == '"') + { + i = _rl_skip_to_delim (string, i+1, *funname); + if (string[i]) + i++; + else + { + _rl_init_file_error ("`%s': missing closing quote for macro", funname); + return 1; + } + } + + /* Advance to the end of the string. */ + for (; string[i] && whitespace (string[i]) == 0; 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 (foundsep == 0) + { + _rl_init_file_error ("%s: no key sequence terminator", string); + return 1; + } + + /* If this is a new-style key-binding, then do the binding with + rl_bind_keyseq (). Otherwise, let the older code deal with it. */ + if (*string == '"') + { + char *seq; + register int j, k, passc; + + seq = (char *)xmalloc (1 + strlen (string)); + for (j = 1, k = passc = 0; string[j]; j++) + { + /* Allow backslash to quote characters, but leave them in place. + This allows a string to end with a backslash quoting another + backslash, or with a backslash quoting a double quote. The + backslashes are left in place for rl_translate_keyseq (). */ + if (passc || (string[j] == '\\')) + { + seq[k++] = string[j]; + passc = !passc; + continue; + } + + if (string[j] == '"') + break; + + seq[k++] = string[j]; + } + seq[k] = '\0'; + + /* Binding macro? */ + if (*funname == '\'' || *funname == '"') + { + j = strlen (funname); + + /* Remove the delimiting quotes from each end of FUNNAME. */ + if (j && funname[j - 1] == *funname) + funname[j - 1] = '\0'; + + rl_macro_bind (seq, &funname[1], _rl_keymap); + } + else + rl_bind_keyseq (seq, rl_named_function (funname)); + + xfree (seq); + return 0; + } + + /* Get the actual character we want to deal with. */ + kname = strrchr (string, '-'); + if (kname == 0) + kname = string; + else + kname++; + + key = glean_key_from_name (kname); + + /* Add in control and meta bits. */ + foundmod = 0; + if (substring_member_of_array (string, _rl_possible_control_prefixes)) + { + key = CTRL (_rl_to_upper (key)); + foundmod = 1; + } + + if (substring_member_of_array (string, _rl_possible_meta_prefixes)) + { + key = META (key); + foundmod = 1; + } + + if (foundmod == 0 && kname != string) + { + _rl_init_file_error ("%s: unknown key modifier", string); + return 1; + } + + /* Temporary. Handle old-style keyname with macro-binding. */ + if (*funname == '\'' || *funname == '"') + { + char useq[2]; + int fl = strlen (funname); + + useq[0] = key; useq[1] = '\0'; + if (fl && funname[fl - 1] == *funname) + funname[fl - 1] = '\0'; + + rl_macro_bind (useq, &funname[1], _rl_keymap); + } +#if defined (PREFIX_META_HACK) + /* Ugly, but working hack to keep prefix-meta around. */ + else if (_rl_stricmp (funname, "prefix-meta") == 0) + { + char seq[2]; + + seq[0] = key; + seq[1] = '\0'; + rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, _rl_keymap); + } +#endif /* PREFIX_META_HACK */ + else + rl_bind_key (key, rl_named_function (funname)); + + return 0; +} + +/* Simple structure for boolean readline variables (i.e., those that can + have one of two values; either "On" or 1 for truth, or "Off" or 0 for + false. */ + +#define V_SPECIAL 0x1 + +static const struct { + const char * const name; + int *value; + int flags; +} boolean_varlist [] = { + { "bind-tty-special-chars", &_rl_bind_stty_chars, 0 }, + { "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL }, + { "byte-oriented", &rl_byte_oriented, 0 }, +#if defined (COLOR_SUPPORT) + { "colored-completion-prefix",&_rl_colored_completion_prefix, 0 }, + { "colored-stats", &_rl_colored_stats, 0 }, +#endif + { "completion-ignore-case", &_rl_completion_case_fold, 0 }, + { "completion-map-case", &_rl_completion_case_map, 0 }, + { "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, + { "disable-completion", &rl_inhibit_completion, 0 }, + { "echo-control-characters", &_rl_echo_control_chars, 0 }, + { "enable-active-region", &_rl_enable_active_region, 0 }, + { "enable-bracketed-paste", &_rl_enable_bracketed_paste, V_SPECIAL }, + { "enable-keypad", &_rl_enable_keypad, 0 }, + { "enable-meta-key", &_rl_enable_meta, 0 }, + { "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, + { "history-preserve-point", &_rl_history_preserve_point, 0 }, + { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 }, + { "input-meta", &_rl_meta_flag, 0 }, + { "mark-directories", &_rl_complete_mark_directories, 0 }, + { "mark-modified-lines", &_rl_mark_modified_lines, 0 }, + { "mark-symlinked-directories", &_rl_complete_mark_symlink_dirs, 0 }, + { "match-hidden-files", &_rl_match_hidden_files, 0 }, + { "menu-complete-display-prefix", &_rl_menu_complete_prefix_first, 0 }, + { "meta-flag", &_rl_meta_flag, 0 }, + { "output-meta", &_rl_output_meta_chars, 0 }, + { "page-completions", &_rl_page_completions, 0 }, + { "prefer-visible-bell", &_rl_prefer_visible_bell, V_SPECIAL }, + { "print-completions-horizontally", &_rl_print_completions_horizontally, 0 }, + { "revert-all-at-newline", &_rl_revert_all_at_newline, 0 }, + { "show-all-if-ambiguous", &_rl_complete_show_all, 0 }, + { "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 }, + { "show-mode-in-prompt", &_rl_show_mode_in_prompt, 0 }, + { "skip-completed-text", &_rl_skip_completed_text, 0 }, +#if defined (VISIBLE_STATS) + { "visible-stats", &rl_visible_stats, 0 }, +#endif /* VISIBLE_STATS */ + { (char *)NULL, (int *)NULL, 0 } +}; + +static int +find_boolean_var (const char *name) +{ + register int i; + + for (i = 0; boolean_varlist[i].name; i++) + if (_rl_stricmp (name, boolean_varlist[i].name) == 0) + return i; + return -1; +} + +static const char * +boolean_varname (int i) +{ + return ((i >= 0) ? boolean_varlist[i].name : (char *)NULL); +} + +/* 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 (int i) +{ + const char *name; + + name = boolean_varlist[i].name; + + if (_rl_stricmp (name, "blink-matching-paren") == 0) + _rl_enable_paren_matching (rl_blink_matching_paren); + else if (_rl_stricmp (name, "prefer-visible-bell") == 0) + { + if (_rl_prefer_visible_bell) + _rl_bell_preference = VISIBLE_BELL; + else + _rl_bell_preference = AUDIBLE_BELL; + } + else if (_rl_stricmp (name, "show-mode-in-prompt") == 0) + _rl_reset_prompt (); + else if (_rl_stricmp (name, "enable-bracketed-paste") == 0) + _rl_enable_active_region = _rl_enable_bracketed_paste; +} + +typedef int _rl_sv_func_t (const char *); + +/* These *must* correspond to the array indices for the appropriate + string variable. (Though they're not used right now.) */ +#define V_BELLSTYLE 0 +#define V_COMBEGIN 1 +#define V_EDITMODE 2 +#define V_ISRCHTERM 3 +#define V_KEYMAP 4 + +#define V_STRING 1 +#define V_INT 2 + +/* Forward declarations */ +static int sv_region_start_color (const char *); +static int sv_region_end_color (const char *); +static int sv_bell_style (const char *); +static int sv_combegin (const char *); +static int sv_dispprefix (const char *); +static int sv_compquery (const char *); +static int sv_compwidth (const char *); +static int sv_editmode (const char *); +static int sv_emacs_modestr (const char *); +static int sv_histsize (const char *); +static int sv_isrchterm (const char *); +static int sv_keymap (const char *); +static int sv_seqtimeout (const char *); +static int sv_viins_modestr (const char *); +static int sv_vicmd_modestr (const char *); + +static const struct { + const char * const name; + int flags; + _rl_sv_func_t *set_func; +} string_varlist[] = { + { "active-region-end-color", V_STRING, sv_region_end_color }, + { "active-region-start-color", V_STRING, sv_region_start_color }, + { "bell-style", V_STRING, sv_bell_style }, + { "comment-begin", V_STRING, sv_combegin }, + { "completion-display-width", V_INT, sv_compwidth }, + { "completion-prefix-display-length", V_INT, sv_dispprefix }, + { "completion-query-items", V_INT, sv_compquery }, + { "editing-mode", V_STRING, sv_editmode }, + { "emacs-mode-string", V_STRING, sv_emacs_modestr }, + { "history-size", V_INT, sv_histsize }, + { "isearch-terminators", V_STRING, sv_isrchterm }, + { "keymap", V_STRING, sv_keymap }, + { "keyseq-timeout", V_INT, sv_seqtimeout }, + { "vi-cmd-mode-string", V_STRING, sv_vicmd_modestr }, + { "vi-ins-mode-string", V_STRING, sv_viins_modestr }, + { (char *)NULL, 0, (_rl_sv_func_t *)0 } +}; + +static int +find_string_var (const char *name) +{ + register int i; + + for (i = 0; string_varlist[i].name; i++) + if (_rl_stricmp (name, string_varlist[i].name) == 0) + return i; + return -1; +} + +static const char * +string_varname (int i) +{ + return ((i >= 0) ? string_varlist[i].name : (char *)NULL); +} + +/* A boolean value that can appear in a `set variable' command is true if + the value is null or empty, `on' (case-insensitive), or "1". All other + values result in 0 (false). */ +static int +bool_to_int (const char *value) +{ + return (value == 0 || *value == '\0' || + (_rl_stricmp (value, "on") == 0) || + (value[0] == '1' && value[1] == '\0')); +} + +char * +rl_variable_value (const char *name) +{ + register int i; + + /* Check for simple variables first. */ + i = find_boolean_var (name); + if (i >= 0) + return (*boolean_varlist[i].value ? "on" : "off"); + + i = find_string_var (name); + if (i >= 0) + return (_rl_get_string_variable_value (string_varlist[i].name)); + + /* Unknown variable names return NULL. */ + return (char *)NULL; +} + +int +rl_variable_bind (const char *name, const char *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, string names without a handler function are simply + ignored. */ + if (i < 0 || string_varlist[i].set_func == 0) + { + if (i < 0) + _rl_init_file_error ("%s: unknown variable name", name); + return 0; + } + + v = (*string_varlist[i].set_func) (value); + if (v != 0) + _rl_init_file_error ("%s: could not set value to `%s'", name, value); + return v; +} + +static int +sv_editmode (const char *value) +{ + if (_rl_strnicmp (value, "vi", 2) == 0) + { +#if defined (VI_MODE) + _rl_keymap = vi_insertion_keymap; + rl_editing_mode = vi_mode; +#endif /* VI_MODE */ + return 0; + } + else if (_rl_strnicmp (value, "emacs", 5) == 0) + { + _rl_keymap = emacs_standard_keymap; + rl_editing_mode = emacs_mode; + return 0; + } + return 1; +} + +static int +sv_combegin (const char *value) +{ + if (value && *value) + { + FREE (_rl_comment_begin); + _rl_comment_begin = savestring (value); + return 0; + } + return 1; +} + +static int +sv_dispprefix (const char *value) +{ + int nval = 0; + + if (value && *value) + { + nval = atoi (value); + if (nval < 0) + nval = 0; + } + _rl_completion_prefix_display_length = nval; + return 0; +} + +static int +sv_compquery (const char *value) +{ + int nval = 100; + + if (value && *value) + { + nval = atoi (value); + if (nval < 0) + nval = 0; + } + rl_completion_query_items = nval; + return 0; +} + +static int +sv_compwidth (const char *value) +{ + int nval = -1; + + if (value && *value) + nval = atoi (value); + + _rl_completion_columns = nval; + return 0; +} + +static int +sv_histsize (const char *value) +{ + int nval; + + nval = 500; + if (value && *value) + { + nval = atoi (value); + if (nval < 0) + { + unstifle_history (); + return 0; + } + } + stifle_history (nval); + return 0; +} + +static int +sv_keymap (const char *value) +{ + Keymap kmap; + + kmap = rl_get_keymap_by_name (value); + if (kmap) + { + rl_set_keymap (kmap); + return 0; + } + return 1; +} + +static int +sv_seqtimeout (const char *value) +{ + int nval; + + nval = 0; + if (value && *value) + { + nval = atoi (value); + if (nval < 0) + nval = 0; + } + _rl_keyseq_timeout = nval; + return 0; +} + +static int +sv_region_start_color (const char *value) +{ + return (_rl_reset_region_color (0, value)); +} + +static int +sv_region_end_color (const char *value) +{ + return (_rl_reset_region_color (1, value)); +} + +static int +sv_bell_style (const char *value) +{ + if (value == 0 || *value == '\0') + _rl_bell_preference = AUDIBLE_BELL; + else if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0) + _rl_bell_preference = NO_BELL; + else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0) + _rl_bell_preference = AUDIBLE_BELL; + else if (_rl_stricmp (value, "visible") == 0) + _rl_bell_preference = VISIBLE_BELL; + else + return 1; + return 0; +} + +static int +sv_isrchterm (const char *value) +{ + int beg, end, delim; + char *v; + + if (value == 0) + return 1; + + /* Isolate the value and translate it into a character string. */ + v = savestring (value); + FREE (_rl_isearch_terminators); + if (v[0] == '"' || v[0] == '\'') + { + delim = v[0]; + for (beg = end = 1; v[end] && v[end] != delim; end++) + ; + } + else + { + for (beg = end = 0; v[end] && whitespace (v[end]) == 0; end++) + ; + } + + v[end] = '\0'; + + /* The value starts at v + beg. Translate it into a character string. */ + _rl_isearch_terminators = (char *)xmalloc (2 * strlen (v) + 1); + rl_translate_keyseq (v + beg, _rl_isearch_terminators, &end); + _rl_isearch_terminators[end] = '\0'; + + xfree (v); + return 0; +} + +extern char *_rl_emacs_mode_str; + +static int +sv_emacs_modestr (const char *value) +{ + if (value && *value) + { + FREE (_rl_emacs_mode_str); + _rl_emacs_mode_str = (char *)xmalloc (2 * strlen (value) + 1); + rl_translate_keyseq (value, _rl_emacs_mode_str, &_rl_emacs_modestr_len); + _rl_emacs_mode_str[_rl_emacs_modestr_len] = '\0'; + return 0; + } + else if (value) + { + FREE (_rl_emacs_mode_str); + _rl_emacs_mode_str = (char *)xmalloc (1); + _rl_emacs_mode_str[_rl_emacs_modestr_len = 0] = '\0'; + return 0; + } + else if (value == 0) + { + FREE (_rl_emacs_mode_str); + _rl_emacs_mode_str = 0; /* prompt_modestr does the right thing */ + _rl_emacs_modestr_len = 0; + return 0; + } + return 1; +} + +static int +sv_viins_modestr (const char *value) +{ + if (value && *value) + { + FREE (_rl_vi_ins_mode_str); + _rl_vi_ins_mode_str = (char *)xmalloc (2 * strlen (value) + 1); + rl_translate_keyseq (value, _rl_vi_ins_mode_str, &_rl_vi_ins_modestr_len); + _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len] = '\0'; + return 0; + } + else if (value) + { + FREE (_rl_vi_ins_mode_str); + _rl_vi_ins_mode_str = (char *)xmalloc (1); + _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len = 0] = '\0'; + return 0; + } + else if (value == 0) + { + FREE (_rl_vi_ins_mode_str); + _rl_vi_ins_mode_str = 0; /* prompt_modestr does the right thing */ + _rl_vi_ins_modestr_len = 0; + return 0; + } + return 1; +} + +static int +sv_vicmd_modestr (const char *value) +{ + if (value && *value) + { + FREE (_rl_vi_cmd_mode_str); + _rl_vi_cmd_mode_str = (char *)xmalloc (2 * strlen (value) + 1); + rl_translate_keyseq (value, _rl_vi_cmd_mode_str, &_rl_vi_cmd_modestr_len); + _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len] = '\0'; + return 0; + } + else if (value) + { + FREE (_rl_vi_cmd_mode_str); + _rl_vi_cmd_mode_str = (char *)xmalloc (1); + _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len = 0] = '\0'; + return 0; + } + else if (value == 0) + { + FREE (_rl_vi_cmd_mode_str); + _rl_vi_cmd_mode_str = 0; /* prompt_modestr does the right thing */ + _rl_vi_cmd_modestr_len = 0; + return 0; + } + return 1; +} + +/* Return the character which matches NAME. + For example, `Space' returns ' '. */ + +typedef struct { + const char * const name; + int value; +} assoc_list; + +static const 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 (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. */ +struct name_and_keymap { + char *name; + Keymap map; +}; + +static struct name_and_keymap builtin_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 } +}; + +/* -1 for NULL entry */ +#define NUM_BUILTIN_KEYMAPS (sizeof (builtin_keymap_names) / sizeof (builtin_keymap_names[0]) - 1) + +static struct name_and_keymap *keymap_names = builtin_keymap_names; + +static int +_rl_get_keymap_by_name (const char *name) +{ + register int i; + + for (i = 0; keymap_names[i].name; i++) + if (_rl_stricmp (name, keymap_names[i].name) == 0) + return (i); + return -1; +} + +Keymap +rl_get_keymap_by_name (const char *name) +{ + int i; + + i = _rl_get_keymap_by_name (name); + return ((i >= 0) ? keymap_names[i].map : (Keymap) NULL); +} + +static int +_rl_get_keymap_by_map (Keymap map) +{ + register int i; + + for (i = 0; keymap_names[i].name; i++) + if (map == keymap_names[i].map) + return (i); + return -1; +} + +char * +rl_get_keymap_name (Keymap map) +{ + int i; + + i = _rl_get_keymap_by_map (map); + return ((i >= 0) ? keymap_names[i].name : (char *)NULL); +} + +int +rl_set_keymap_name (const char *name, Keymap map) +{ + int i, ni, mi; + + /* First check whether or not we're trying to rename a builtin keymap */ + mi = _rl_get_keymap_by_map (map); + if (mi >= 0 && mi < NUM_BUILTIN_KEYMAPS) + return -1; + + /* Then reject attempts to set one of the builtin names to a new map */ + ni = _rl_get_keymap_by_name (name); + if (ni >= 0 && ni < NUM_BUILTIN_KEYMAPS) + return -1; + + /* Renaming a keymap we already added */ + if (mi >= 0) /* XXX - could be >= NUM_BUILTIN_KEYMAPS */ + { + xfree (keymap_names[mi].name); + keymap_names[mi].name = savestring (name); + return mi; + } + + /* Associating new keymap with existing name */ + if (ni >= 0) + { + keymap_names[ni].map = map; + return ni; + } + + for (i = 0; keymap_names[i].name; i++) + ; + + if (keymap_names == builtin_keymap_names) + { + keymap_names = xmalloc ((i + 2) * sizeof (struct name_and_keymap)); + memcpy (keymap_names, builtin_keymap_names, i * sizeof (struct name_and_keymap)); + } + else + keymap_names = xrealloc (keymap_names, (i + 2) * sizeof (struct name_and_keymap)); + + keymap_names[i].name = savestring (name); + keymap_names[i].map = map; + + keymap_names[i+1].name = NULL; + keymap_names[i+1].map = NULL; + + return i; +} + +void +rl_set_keymap (Keymap map) +{ + if (map) + _rl_keymap = map; +} + +Keymap +rl_get_keymap (void) +{ + return (_rl_keymap); +} + +void +rl_set_keymap_from_edit_mode (void) +{ + 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 (void) +{ + 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 (void) +{ + register int i; + const char **funmap_names; + + funmap_names = rl_funmap_names (); + + if (!funmap_names) + return; + + for (i = 0; funmap_names[i]; i++) + fprintf (rl_outstream, "%s\n", funmap_names[i]); + + xfree (funmap_names); +} + +static char * +_rl_get_keyname (int key) +{ + char *keyname; + int i, c; + + keyname = (char *)xmalloc (8); + + c = key; + /* Since this is going to be used to write out keysequence-function + pairs for possible inclusion in an inputrc file, we don't want to + do any special meta processing on KEY. */ + +#if 1 + /* XXX - Experimental */ + /* We might want to do this, but the old version of the code did not. */ + + /* If this is an escape character, we don't want to do any more processing. + Just add the special ESC key sequence and return. */ + if (c == ESC) + { + keyname[0] = '\\'; + keyname[1] = 'e'; + keyname[2] = '\0'; + return keyname; + } +#endif + + /* RUBOUT is translated directly into \C-? */ + if (key == RUBOUT) + { + keyname[0] = '\\'; + keyname[1] = 'C'; + keyname[2] = '-'; + keyname[3] = '?'; + keyname[4] = '\0'; + return keyname; + } + + i = 0; + /* Now add special prefixes needed for control characters. This can + potentially change C. */ + if (CTRL_CHAR (c)) + { + keyname[i++] = '\\'; + keyname[i++] = 'C'; + keyname[i++] = '-'; + c = _rl_to_lower (UNCTRL (c)); + } + + /* XXX experimental code. Turn the characters that are not ASCII or + ISO Latin 1 (128 - 159) into octal escape sequences (\200 - \237). + This changes C. */ + if (c >= 128 && c <= 159) + { + keyname[i++] = '\\'; + keyname[i++] = '2'; + c -= 128; + keyname[i++] = (c / 8) + '0'; + c = (c % 8) + '0'; + } + /* These characters are valid UTF-8; convert them into octal escape + sequences as well. This changes C. */ + else if (c >= 160) + { + keyname[i++] = '\\'; + keyname[i++] = '0' + ((((unsigned char)c) >> 6) & 0x07); + keyname[i++] = '0' + ((((unsigned char)c) >> 3) & 0x07); + 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 (rl_command_func_t *function, Keymap map) +{ + register int key; + char **result; + int result_index, result_size; + + result = (char **)NULL; + result_index = result_size = 0; + + for (key = 0; key < KEYMAP_SIZE; key++) + { + switch (map[key].type) + { + case ISMACR: + /* Macros match, if, and only if, the pointers are identical. + Thus, they are treated exactly like functions in here. */ + case ISFUNC: + /* If the function in the keymap is the one we are looking for, + then add the current KEY to the list of invoking keys. */ + if (map[key].function == function) + { + char *keyname; + + keyname = _rl_get_keyname (key); + + if (result_index + 2 > result_size) + { + result_size += 10; + result = (char **)xrealloc (result, result_size * sizeof (char *)); + } + + result[result_index++] = keyname; + result[result_index] = (char *)NULL; + } + break; + + case ISKMAP: + { + char **seqs; + register int i; + + /* Find the list of keyseqs in this map which have FUNCTION as + their target. Add the key sequences found to RESULT. */ + if (map[key].function) + seqs = + rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key)); + else + break; + + if (seqs == 0) + break; + + for (i = 0; seqs[i]; i++) + { + char *keyname = (char *)xmalloc (6 + strlen (seqs[i])); + + if (key == ESC) + { + /* If ESC is the meta prefix and we're converting chars + with the eighth bit set to ESC-prefixed sequences, then + we can use \M-. Otherwise we need to use the sequence + for ESC. */ + if (_rl_convert_meta_chars_to_ascii && map[ESC].type == ISKMAP) + sprintf (keyname, "\\M-"); + else + sprintf (keyname, "\\e"); + } + else + { + int c = key, l = 0; + if (CTRL_CHAR (c) || c == RUBOUT) + { + keyname[l++] = '\\'; + keyname[l++] = 'C'; + keyname[l++] = '-'; + c = (c == RUBOUT) ? '?' : _rl_to_lower (UNCTRL (c)); + } + + if (c == '\\' || c == '"') + keyname[l++] = '\\'; + + keyname[l++] = (char) c; + keyname[l++] = '\0'; + } + + strcat (keyname, seqs[i]); + xfree (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; + } + + xfree (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 (rl_command_func_t *function) +{ + return (rl_invoking_keyseqs_in_map (function, _rl_keymap)); +} + +/* Print all of the functions and their bindings to rl_outstream. If + PRINT_READABLY is non-zero, then print the output in such a way + that it can be read back in. */ +void +rl_function_dumper (int print_readably) +{ + register int i; + const char **names; + const char *name; + + names = rl_funmap_names (); + + fprintf (rl_outstream, "\n"); + + for (i = 0; name = names[i]; i++) + { + rl_command_func_t *function; + char **invokers; + + function = rl_named_function (name); + invokers = rl_invoking_keyseqs_in_map (function, _rl_keymap); + + if (print_readably) + { + if (!invokers) + fprintf (rl_outstream, "# %s (not bound)\n", name); + else + { + register int j; + + for (j = 0; invokers[j]; j++) + { + fprintf (rl_outstream, "\"%s\": %s\n", + invokers[j], name); + xfree (invokers[j]); + } + + xfree (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++) + xfree (invokers[j]); + + xfree (invokers); + } + } + } + + xfree (names); +} + +/* 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 (int count, int 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 (int print_readably, Keymap map, char *prefix) +{ + register int key; + char *keyname, *out; + int prefix_len; + + for (key = 0; key < KEYMAP_SIZE; key++) + { + switch (map[key].type) + { + case ISMACR: + keyname = _rl_get_keyname (key); + out = _rl_untranslate_macro_value ((char *)map[key].function, 0); + + 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 : ""); + xfree (keyname); + xfree (out); + break; + case ISFUNC: + break; + case ISKMAP: + prefix_len = prefix ? strlen (prefix) : 0; + if (key == ESC) + { + keyname = (char *)xmalloc (3 + prefix_len); + if (prefix) + strcpy (keyname, prefix); + keyname[prefix_len] = '\\'; + keyname[prefix_len + 1] = 'e'; + keyname[prefix_len + 2] = '\0'; + } + else + { + keyname = _rl_get_keyname (key); + if (prefix) + { + out = (char *)xmalloc (strlen (keyname) + prefix_len + 1); + strcpy (out, prefix); + strcpy (out + prefix_len, keyname); + xfree (keyname); + keyname = out; + } + } + + _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname); + xfree (keyname); + break; + } + } +} + +void +rl_macro_dumper (int print_readably) +{ + _rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL); +} + +int +rl_dump_macros (int count, int key) +{ + if (rl_dispatching) + fprintf (rl_outstream, "\r\n"); + rl_macro_dumper (rl_explicit_arg); + rl_on_new_line (); + return (0); +} + +static char * +_rl_get_string_variable_value (const char *name) +{ + static char numbuf[32]; + char *ret; + + if (_rl_stricmp (name, "bell-style") == 0) + { + switch (_rl_bell_preference) + { + case NO_BELL: + return "none"; + case VISIBLE_BELL: + return "visible"; + case AUDIBLE_BELL: + default: + return "audible"; + } + } + else if (_rl_stricmp (name, "comment-begin") == 0) + return (_rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT); + else if (_rl_stricmp (name, "completion-display-width") == 0) + { + sprintf (numbuf, "%d", _rl_completion_columns); + return (numbuf); + } + else if (_rl_stricmp (name, "completion-prefix-display-length") == 0) + { + sprintf (numbuf, "%d", _rl_completion_prefix_display_length); + return (numbuf); + } + else if (_rl_stricmp (name, "completion-query-items") == 0) + { + sprintf (numbuf, "%d", rl_completion_query_items); + return (numbuf); + } + else if (_rl_stricmp (name, "editing-mode") == 0) + return (rl_get_keymap_name_from_edit_mode ()); + else if (_rl_stricmp (name, "history-size") == 0) + { + sprintf (numbuf, "%d", history_is_stifled() ? history_max_entries : 0); + return (numbuf); + } + else if (_rl_stricmp (name, "isearch-terminators") == 0) + { + if (_rl_isearch_terminators == 0) + return 0; + ret = _rl_untranslate_macro_value (_rl_isearch_terminators, 0); + if (ret) + { + strncpy (numbuf, ret, sizeof (numbuf) - 1); + xfree (ret); + numbuf[sizeof(numbuf) - 1] = '\0'; + } + else + numbuf[0] = '\0'; + return numbuf; + } + else if (_rl_stricmp (name, "keymap") == 0) + { + ret = rl_get_keymap_name (_rl_keymap); + if (ret == 0) + ret = rl_get_keymap_name_from_edit_mode (); + return (ret ? ret : "none"); + } + else if (_rl_stricmp (name, "keyseq-timeout") == 0) + { + sprintf (numbuf, "%d", _rl_keyseq_timeout); + return (numbuf); + } + else if (_rl_stricmp (name, "emacs-mode-string") == 0) + return (_rl_emacs_mode_str ? _rl_emacs_mode_str : RL_EMACS_MODESTR_DEFAULT); + else if (_rl_stricmp (name, "vi-cmd-mode-string") == 0) + return (_rl_vi_cmd_mode_str ? _rl_vi_cmd_mode_str : RL_VI_CMD_MODESTR_DEFAULT); + else if (_rl_stricmp (name, "vi-ins-mode-string") == 0) + return (_rl_vi_ins_mode_str ? _rl_vi_ins_mode_str : RL_VI_INS_MODESTR_DEFAULT); + else + return (0); +} + +void +rl_variable_dumper (int print_readably) +{ + int i; + char *v; + + for (i = 0; boolean_varlist[i].name; i++) + { + if (print_readably) + fprintf (rl_outstream, "set %s %s\n", boolean_varlist[i].name, + *boolean_varlist[i].value ? "on" : "off"); + else + fprintf (rl_outstream, "%s is set to `%s'\n", boolean_varlist[i].name, + *boolean_varlist[i].value ? "on" : "off"); + } + + for (i = 0; string_varlist[i].name; i++) + { + v = _rl_get_string_variable_value (string_varlist[i].name); + if (v == 0) /* _rl_isearch_terminators can be NULL */ + continue; + if (print_readably) + fprintf (rl_outstream, "set %s %s\n", string_varlist[i].name, v); + else + fprintf (rl_outstream, "%s is set to `%s'\n", string_varlist[i].name, v); + } +} + +/* Print all of the current variables and their values to + rl_outstream. If an explicit argument is given, then print + the output in such a way that it can be read back in. */ +int +rl_dump_variables (int count, int key) +{ + if (rl_dispatching) + fprintf (rl_outstream, "\r\n"); + rl_variable_dumper (rl_explicit_arg); + rl_on_new_line (); + return (0); +} + +/* Return non-zero if any members of ARRAY are a substring in STRING. */ +static int +substring_member_of_array (const char *string, const char * const *array) +{ + while (*array) + { + if (_rl_strindex (string, *array)) + return (1); + array++; + } + return (0); +} diff --git a/callback.c b/callback.c new file mode 100644 index 0000000..69df77d --- /dev/null +++ b/callback.c @@ -0,0 +1,378 @@ +/* callback.c -- functions to use readline as an X `callback' mechanism. */ + +/* Copyright (C) 1987-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include "rlconf.h" + +#if defined (READLINE_CALLBACKS) + +#include + +#ifdef HAVE_STDLIB_H +# include +#else +# include "ansi_stdlib.h" +#endif + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "readline.h" +#include "rlprivate.h" +#include "xmalloc.h" + +/* Private data for callback registration functions. See comments in + rl_callback_read_char for more details. */ +_rl_callback_func_t *_rl_callback_func = 0; +_rl_callback_generic_arg *_rl_callback_data = 0; + +/* Applications can set this to non-zero to have readline's signal handlers + installed during the entire duration of reading a complete line, as in + readline-6.2. This should be used with care, because it can result in + readline receiving signals and not handling them until it's called again + via rl_callback_read_char, thereby stealing them from the application. + By default, signal handlers are only active while readline is active. */ +int rl_persistent_signal_handlers = 0; + +/* **************************************************************** */ +/* */ +/* Callback Readline Functions */ +/* */ +/* **************************************************************** */ + +/* Allow using readline in situations where a program may have multiple + things to handle at once, and dispatches them via select(). Call + rl_callback_handler_install() with the prompt and a function to call + whenever a complete line of input is ready. The user must then + call rl_callback_read_char() every time some input is available, and + rl_callback_read_char() will call the user's function with the complete + text read in at each end of line. The terminal is kept prepped + all the time, except during calls to the user's function. Signal + handlers are only installed when the application calls back into + readline, so readline doesn't `steal' signals from the application. */ + +rl_vcpfunc_t *rl_linefunc; /* user callback function */ +static int in_handler; /* terminal_prepped and signals set? */ + +/* Make sure the terminal is set up, initialize readline, and prompt. */ +static void +_rl_callback_newline (void) +{ + rl_initialize (); + + if (in_handler == 0) + { + in_handler = 1; + + if (rl_prep_term_function) + (*rl_prep_term_function) (_rl_meta_flag); + +#if defined (HANDLE_SIGNALS) + if (rl_persistent_signal_handlers) + rl_set_signals (); +#endif + } + + readline_internal_setup (); + RL_CHECK_SIGNALS (); +} + +/* Install a readline handler, set up the terminal, and issue the prompt. */ +void +rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *linefunc) +{ + rl_set_prompt (prompt); + RL_SETSTATE (RL_STATE_CALLBACK); + rl_linefunc = linefunc; + _rl_callback_newline (); +} + +#if defined (HANDLE_SIGNALS) +#define CALLBACK_READ_RETURN() \ + do { \ + if (rl_persistent_signal_handlers == 0) \ + rl_clear_signals (); \ + return; \ + } while (0) +#else +#define CALLBACK_READ_RETURN() return +#endif + +/* Read one character, and dispatch to the handler if it ends the line. */ +void +rl_callback_read_char (void) +{ + char *line; + int eof, jcode; + static procenv_t olevel; + + if (rl_linefunc == NULL) + { + _rl_errmsg ("readline_callback_read_char() called with no handler!"); + abort (); + } + + eof = 0; + + memcpy ((void *)olevel, (void *)_rl_top_level, sizeof (procenv_t)); +#if defined (HAVE_POSIX_SIGSETJMP) + jcode = sigsetjmp (_rl_top_level, 0); +#else + jcode = setjmp (_rl_top_level); +#endif + if (jcode) + { + (*rl_redisplay_function) (); + _rl_want_redisplay = 0; + memcpy ((void *)_rl_top_level, (void *)olevel, sizeof (procenv_t)); + + /* If we longjmped because of a timeout, handle it here. */ + if (RL_ISSTATE (RL_STATE_TIMEOUT)) + { + RL_SETSTATE (RL_STATE_DONE); + rl_done = 1; + } + + CALLBACK_READ_RETURN (); + } + +#if defined (HANDLE_SIGNALS) + /* Install signal handlers only when readline has control. */ + if (rl_persistent_signal_handlers == 0) + rl_set_signals (); +#endif + + do + { + RL_CHECK_SIGNALS (); + if (RL_ISSTATE (RL_STATE_ISEARCH)) + { + eof = _rl_isearch_callback (_rl_iscxt); + if (eof == 0 && (RL_ISSTATE (RL_STATE_ISEARCH) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) + rl_callback_read_char (); + + CALLBACK_READ_RETURN (); + } + else if (RL_ISSTATE (RL_STATE_NSEARCH)) + { + eof = _rl_nsearch_callback (_rl_nscxt); + + CALLBACK_READ_RETURN (); + } +#if defined (VI_MODE) + /* States that can occur while in state VIMOTION have to be checked + before RL_STATE_VIMOTION */ + else if (RL_ISSTATE (RL_STATE_CHARSEARCH)) + { + int k; + + k = _rl_callback_data->i2; + + eof = (*_rl_callback_func) (_rl_callback_data); + /* If the function `deregisters' itself, make sure the data is + cleaned up. */ + if (_rl_callback_func == 0) /* XXX - just sanity check */ + { + if (_rl_callback_data) + { + _rl_callback_data_dispose (_rl_callback_data); + _rl_callback_data = 0; + } + } + + /* Messy case where vi motion command can be char search */ + if (RL_ISSTATE (RL_STATE_VIMOTION)) + { + _rl_vi_domove_motion_cleanup (k, _rl_vimvcxt); + _rl_internal_char_cleanup (); + CALLBACK_READ_RETURN (); + } + + _rl_internal_char_cleanup (); + } + else if (RL_ISSTATE (RL_STATE_VIMOTION)) + { + eof = _rl_vi_domove_callback (_rl_vimvcxt); + /* Should handle everything, including cleanup, numeric arguments, + and turning off RL_STATE_VIMOTION */ + if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) + _rl_internal_char_cleanup (); + + CALLBACK_READ_RETURN (); + } +#endif + else if (RL_ISSTATE (RL_STATE_NUMERICARG)) + { + eof = _rl_arg_callback (_rl_argcxt); + if (eof == 0 && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) + rl_callback_read_char (); + /* XXX - this should handle _rl_last_command_was_kill better */ + else if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) + _rl_internal_char_cleanup (); + + CALLBACK_READ_RETURN (); + } + else if (RL_ISSTATE (RL_STATE_MULTIKEY)) + { + eof = _rl_dispatch_callback (_rl_kscxt); /* For now */ + while ((eof == -1 || eof == -2) && RL_ISSTATE (RL_STATE_MULTIKEY) && _rl_kscxt && (_rl_kscxt->flags & KSEQ_DISPATCHED)) + eof = _rl_dispatch_callback (_rl_kscxt); + if (RL_ISSTATE (RL_STATE_MULTIKEY) == 0) + { + _rl_internal_char_cleanup (); + _rl_want_redisplay = 1; + } + } + else if (_rl_callback_func) + { + /* This allows functions that simply need to read an additional + character (like quoted-insert) to register a function to be + called when input is available. _rl_callback_data is a + pointer to a struct that has the argument count originally + passed to the registering function and space for any additional + parameters. */ + eof = (*_rl_callback_func) (_rl_callback_data); + /* If the function `deregisters' itself, make sure the data is + cleaned up. */ + if (_rl_callback_func == 0) + { + if (_rl_callback_data) + { + _rl_callback_data_dispose (_rl_callback_data); + _rl_callback_data = 0; + } + _rl_internal_char_cleanup (); + } + } + else + eof = readline_internal_char (); + + RL_CHECK_SIGNALS (); + if (rl_done == 0 && _rl_want_redisplay) + { + (*rl_redisplay_function) (); + _rl_want_redisplay = 0; + } + + /* Make sure application hooks can see whether we saw EOF. */ + if (eof > 0) + { + rl_eof_found = eof; + RL_SETSTATE(RL_STATE_EOF); + } + + if (rl_done) + { + line = readline_internal_teardown (eof); + + if (rl_deprep_term_function) + (*rl_deprep_term_function) (); +#if defined (HANDLE_SIGNALS) + rl_clear_signals (); +#endif + in_handler = 0; + if (rl_linefunc) /* just in case */ + (*rl_linefunc) (line); + + /* If the user did not clear out the line, do it for him. */ + if (rl_line_buffer[0]) + _rl_init_line_state (); + + /* Redisplay the prompt if readline_handler_{install,remove} + not called. */ + if (in_handler == 0 && rl_linefunc) + _rl_callback_newline (); + } + } + while (rl_pending_input || _rl_pushed_input_available () || RL_ISSTATE (RL_STATE_MACROINPUT)); + + CALLBACK_READ_RETURN (); +} + +/* Remove the handler, and make sure the terminal is in its normal state. */ +void +rl_callback_handler_remove (void) +{ + rl_linefunc = NULL; + RL_UNSETSTATE (RL_STATE_CALLBACK); + RL_CHECK_SIGNALS (); + if (in_handler) + { + in_handler = 0; + if (rl_deprep_term_function) + (*rl_deprep_term_function) (); +#if defined (HANDLE_SIGNALS) + rl_clear_signals (); +#endif + } +} + +_rl_callback_generic_arg * +_rl_callback_data_alloc (int count) +{ + _rl_callback_generic_arg *arg; + + arg = (_rl_callback_generic_arg *)xmalloc (sizeof (_rl_callback_generic_arg)); + arg->count = count; + + arg->i1 = arg->i2 = 0; + + return arg; +} + +void +_rl_callback_data_dispose (_rl_callback_generic_arg *arg) +{ + xfree (arg); +} + +/* Make sure that this agrees with cases in rl_callback_read_char */ +void +rl_callback_sigcleanup (void) +{ + if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) + return; + + if (RL_ISSTATE (RL_STATE_ISEARCH)) + _rl_isearch_cleanup (_rl_iscxt, 0); + else if (RL_ISSTATE (RL_STATE_NSEARCH)) + _rl_nsearch_cleanup (_rl_nscxt, 0); + else if (RL_ISSTATE (RL_STATE_VIMOTION)) + RL_UNSETSTATE (RL_STATE_VIMOTION); + else if (RL_ISSTATE (RL_STATE_NUMERICARG)) + { + _rl_argcxt = 0; + RL_UNSETSTATE (RL_STATE_NUMERICARG); + } + else if (RL_ISSTATE (RL_STATE_MULTIKEY)) + RL_UNSETSTATE (RL_STATE_MULTIKEY); + if (RL_ISSTATE (RL_STATE_CHARSEARCH)) + RL_UNSETSTATE (RL_STATE_CHARSEARCH); + + _rl_callback_func = 0; +} +#endif diff --git a/chardefs.h b/chardefs.h new file mode 100644 index 0000000..24a25f1 --- /dev/null +++ b/chardefs.h @@ -0,0 +1,165 @@ +/* chardefs.h -- Character definitions for readline. */ + +/* Copyright (C) 1994-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#ifndef _CHARDEFS_H_ +#define _CHARDEFS_H_ + +#include + +#if defined (HAVE_CONFIG_H) +# if defined (HAVE_STRING_H) +# include +# endif /* HAVE_STRING_H */ +# if defined (HAVE_STRINGS_H) +# include +# endif /* HAVE_STRINGS_H */ +#else +# include +#endif /* !HAVE_CONFIG_H */ + +#ifndef whitespace +#define whitespace(c) (((c) == ' ') || ((c) == '\t')) +#endif + +#ifdef CTRL +# undef CTRL +#endif +#ifdef UNCTRL +# undef UNCTRL +#endif + +/* Some character stuff. */ +#define control_character_threshold 0x020 /* Smaller than this is control. */ +#define control_character_mask 0x1f /* 0x20 - 1 */ +#define meta_character_threshold 0x07f /* Larger than this is Meta. */ +#define control_character_bit 0x40 /* 0x000000, must be off. */ +#define meta_character_bit 0x080 /* x0000000, must be on. */ +#define largest_char 255 /* Largest character value. */ + +#define CTRL_CHAR(c) ((c) < control_character_threshold && (((c) & 0x80) == 0)) +#define META_CHAR(c) ((c) > meta_character_threshold && (c) <= largest_char) + +#define CTRL(c) ((c) & control_character_mask) +#define META(c) ((c) | meta_character_bit) + +#define UNMETA(c) ((c) & (~meta_character_bit)) +#define UNCTRL(c) _rl_to_upper(((c)|control_character_bit)) + +#ifndef UCHAR_MAX +# define UCHAR_MAX 255 +#endif +#ifndef CHAR_MAX +# define CHAR_MAX 127 +#endif + +/* use this as a proxy for C89 */ +#if defined (HAVE_STDLIB_H) && defined (HAVE_STRING_H) +# define IN_CTYPE_DOMAIN(c) 1 +# define NON_NEGATIVE(c) 1 +#else +# define IN_CTYPE_DOMAIN(c) ((c) >= 0 && (c) <= CHAR_MAX) +# define NON_NEGATIVE(c) ((unsigned char)(c) == (c)) +#endif + +#if !defined (isxdigit) && !defined (HAVE_ISXDIGIT) && !defined (__cplusplus) +# define isxdigit(c) (isdigit((unsigned char)(c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) +#endif + +/* Some systems define these; we want our definitions. */ +#undef ISPRINT + +/* Beware: these only work with single-byte ASCII characters. */ + +#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum ((unsigned char)c)) +#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha ((unsigned char)c)) +#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit ((unsigned char)c)) +#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower ((unsigned char)c)) +#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint ((unsigned char)c)) +#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper ((unsigned char)c)) +#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit ((unsigned char)c)) + +#define _rl_lowercase_p(c) (NON_NEGATIVE(c) && ISLOWER(c)) +#define _rl_uppercase_p(c) (NON_NEGATIVE(c) && ISUPPER(c)) +#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') + +#define _rl_alphabetic_p(c) (NON_NEGATIVE(c) && ISALNUM(c)) +#define _rl_pure_alphabetic(c) (NON_NEGATIVE(c) && ISALPHA(c)) + +#ifndef _rl_to_upper +# define _rl_to_upper(c) (_rl_lowercase_p(c) ? toupper((unsigned char)(c)) : (c)) +# define _rl_to_lower(c) (_rl_uppercase_p(c) ? tolower((unsigned char)(c)) : (c)) +#endif + +#ifndef _rl_digit_value +# define _rl_digit_value(x) ((x) - '0') +#endif + +#ifndef _rl_isident +# define _rl_isident(c) (ISALNUM(c) || (c) == '_') +#endif + +#ifndef ISOCTAL +# define ISOCTAL(c) ((c) >= '0' && (c) <= '7') +#endif +#define OCTVALUE(c) ((c) - '0') + +#define HEXVALUE(c) \ + (((c) >= 'a' && (c) <= 'f') \ + ? (c)-'a'+10 \ + : (c) >= 'A' && (c) <= 'F' ? (c)-'A'+10 : (c)-'0') + +#ifndef NEWLINE +#define NEWLINE '\n' +#endif + +#ifndef RETURN +#define RETURN CTRL('M') +#endif + +#ifndef RUBOUT +#define RUBOUT 0x7f +#endif + +#ifndef TAB +#define TAB '\t' +#endif + +#ifdef ABORT_CHAR +#undef ABORT_CHAR +#endif +#define ABORT_CHAR CTRL('G') + +#ifdef PAGE +#undef PAGE +#endif +#define PAGE CTRL('L') + +#ifdef SPACE +#undef SPACE +#endif +#define SPACE ' ' /* XXX - was 0x20 */ + +#ifdef ESC +#undef ESC +#endif +#define ESC CTRL('[') + +#endif /* _CHARDEFS_H_ */ diff --git a/colors.c b/colors.c new file mode 100644 index 0000000..dba81a2 --- /dev/null +++ b/colors.c @@ -0,0 +1,320 @@ +/* `dir', `vdir' and `ls' directory listing programs for GNU. + + Modified by Chet Ramey for Readline. + + Copyright (C) 1985, 1988, 1990-1991, 1995-2021 + 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 3 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, see . */ + +/* Written by Richard Stallman and David MacKenzie. */ + +/* Color support by Peter Anvin and Dennis + Flaherty based on original patches by + Greg Lee . */ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include "rlconf.h" + +#if defined __TANDEM +# define _XOPEN_SOURCE_EXTENDED 1 +# define _TANDEM_SOURCE 1 +# include +# include +#endif + +#include + +#include "posixstat.h" // stat related macros (S_ISREG, ...) +#include // S_ISUID + +#ifndef S_ISDIR +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#endif + +// strlen() +#if defined (HAVE_STRING_H) +# include +#else /* !HAVE_STRING_H */ +# include +#endif /* !HAVE_STRING_H */ + +// abort() +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include "readline.h" +#include "rldefs.h" + +#ifdef COLOR_SUPPORT + +#include "xmalloc.h" +#include "colors.h" + +static bool is_colored (enum indicator_no type); +static void restore_default_color (void); + +#define RL_COLOR_PREFIX_EXTENSION "readline-colored-completion-prefix" + +COLOR_EXT_TYPE *_rl_color_ext_list = 0; + +/* Output a color indicator (which may contain nulls). */ +void +_rl_put_indicator (const struct bin_str *ind) +{ + fwrite (ind->string, ind->len, 1, rl_outstream); +} + +static bool +is_colored (enum indicator_no colored_filetype) +{ + size_t len = _rl_color_indicator[colored_filetype].len; + char const *s = _rl_color_indicator[colored_filetype].string; + return ! (len == 0 + || (len == 1 && strncmp (s, "0", 1) == 0) + || (len == 2 && strncmp (s, "00", 2) == 0)); +} + +static void +restore_default_color (void) +{ + _rl_put_indicator (&_rl_color_indicator[C_LEFT]); + _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); +} + +void +_rl_set_normal_color (void) +{ + if (is_colored (C_NORM)) + { + _rl_put_indicator (&_rl_color_indicator[C_LEFT]); + _rl_put_indicator (&_rl_color_indicator[C_NORM]); + _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); + } +} + +static struct bin_str * +_rl_custom_readline_prefix (void) +{ + size_t len; + COLOR_EXT_TYPE *ext; + + len = strlen (RL_COLOR_PREFIX_EXTENSION); + for (ext = _rl_color_ext_list; ext; ext = ext->next) + if (ext->ext.len == len && STREQN (ext->ext.string, RL_COLOR_PREFIX_EXTENSION, len)) + return (&ext->seq); + return (NULL); +} + +bool +_rl_print_prefix_color (void) +{ + struct bin_str *s; + + /* What do we want to use for the prefix? Let's try cyan first, see colors.h */ + s = _rl_custom_readline_prefix (); + if (s == 0) + s = &_rl_color_indicator[C_PREFIX]; + if (s->string != NULL) + { + if (is_colored (C_NORM)) + restore_default_color (); + _rl_put_indicator (&_rl_color_indicator[C_LEFT]); + _rl_put_indicator (s); + _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); + return 0; + } + else + return 1; +} + +/* Returns whether any color sequence was printed. */ +bool +_rl_print_color_indicator (const char *f) +{ + enum indicator_no colored_filetype; + COLOR_EXT_TYPE *ext; /* Color extension */ + size_t len; /* Length of name */ + + const char* name; + char *filename; + struct stat astat, linkstat; + mode_t mode; + int linkok; /* 1 == ok, 0 == dangling symlink, -1 == missing */ + int stat_ok; + + name = f; + + /* This should already have undergone tilde expansion */ + filename = 0; + if (rl_filename_stat_hook) + { + filename = savestring (f); + (*rl_filename_stat_hook) (&filename); + name = filename; + } + +#if defined (HAVE_LSTAT) + stat_ok = lstat(name, &astat); +#else + stat_ok = stat(name, &astat); +#endif + if (stat_ok == 0) + { + mode = astat.st_mode; +#if defined (HAVE_LSTAT) + if (S_ISLNK (mode)) + { + linkok = stat (name, &linkstat) == 0; + if (linkok && strncmp (_rl_color_indicator[C_LINK].string, "target", 6) == 0) + mode = linkstat.st_mode; + } + else +#endif + linkok = 1; + } + else + linkok = -1; + + /* Is this a nonexistent file? If so, linkok == -1. */ + + if (linkok == -1 && _rl_color_indicator[C_MISSING].string != NULL) + colored_filetype = C_MISSING; + else if (linkok == 0 && _rl_color_indicator[C_ORPHAN].string != NULL) + colored_filetype = C_ORPHAN; /* dangling symlink */ + else if(stat_ok != 0) + { + static enum indicator_no filetype_indicator[] = FILETYPE_INDICATORS; + colored_filetype = filetype_indicator[normal]; //f->filetype]; + } + else + { + if (S_ISREG (mode)) + { + colored_filetype = C_FILE; + +#if defined (S_ISUID) + if ((mode & S_ISUID) != 0 && is_colored (C_SETUID)) + colored_filetype = C_SETUID; + else +#endif +#if defined (S_ISGID) + if ((mode & S_ISGID) != 0 && is_colored (C_SETGID)) + colored_filetype = C_SETGID; + else +#endif + if (is_colored (C_CAP) && 0) //f->has_capability) + colored_filetype = C_CAP; + else if ((mode & S_IXUGO) != 0 && is_colored (C_EXEC)) + colored_filetype = C_EXEC; + else if ((1 < astat.st_nlink) && is_colored (C_MULTIHARDLINK)) + colored_filetype = C_MULTIHARDLINK; + } + else if (S_ISDIR (mode)) + { + colored_filetype = C_DIR; + +#if defined (S_ISVTX) + if ((mode & S_ISVTX) && (mode & S_IWOTH) + && is_colored (C_STICKY_OTHER_WRITABLE)) + colored_filetype = C_STICKY_OTHER_WRITABLE; + else +#endif + if ((mode & S_IWOTH) != 0 && is_colored (C_OTHER_WRITABLE)) + colored_filetype = C_OTHER_WRITABLE; +#if defined (S_ISVTX) + else if ((mode & S_ISVTX) != 0 && is_colored (C_STICKY)) + colored_filetype = C_STICKY; +#endif + } +#if defined (S_ISLNK) + else if (S_ISLNK (mode)) + colored_filetype = C_LINK; +#endif + else if (S_ISFIFO (mode)) + colored_filetype = C_FIFO; +#if defined (S_ISSOCK) + else if (S_ISSOCK (mode)) + colored_filetype = C_SOCK; +#endif +#if defined (S_ISBLK) + else if (S_ISBLK (mode)) + colored_filetype = C_BLK; +#endif + else if (S_ISCHR (mode)) + colored_filetype = C_CHR; + else + { + /* Classify a file of some other type as C_ORPHAN. */ + colored_filetype = C_ORPHAN; + } + } + + /* Check the file's suffix only if still classified as C_FILE. */ + ext = NULL; + if (colored_filetype == C_FILE) + { + /* Test if NAME has a recognized suffix. */ + len = strlen (name); + name += len; /* Pointer to final \0. */ + for (ext = _rl_color_ext_list; ext != NULL; ext = ext->next) + { + if (ext->ext.len <= len + && strncmp (name - ext->ext.len, ext->ext.string, + ext->ext.len) == 0) + break; + } + } + + free (filename); /* NULL or savestring return value */ + + { + const struct bin_str *const s + = ext ? &(ext->seq) : &_rl_color_indicator[colored_filetype]; + if (s->string != NULL) + { + /* Need to reset so not dealing with attribute combinations */ + if (is_colored (C_NORM)) + restore_default_color (); + _rl_put_indicator (&_rl_color_indicator[C_LEFT]); + _rl_put_indicator (s); + _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); + return 0; + } + else + return 1; + } +} + +void +_rl_prep_non_filename_text (void) +{ + if (_rl_color_indicator[C_END].string != NULL) + _rl_put_indicator (&_rl_color_indicator[C_END]); + else + { + _rl_put_indicator (&_rl_color_indicator[C_LEFT]); + _rl_put_indicator (&_rl_color_indicator[C_RESET]); + _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); + } +} +#endif /* COLOR_SUPPORT */ diff --git a/colors.h b/colors.h new file mode 100644 index 0000000..6561ad9 --- /dev/null +++ b/colors.h @@ -0,0 +1,126 @@ +/* `dir', `vdir' and `ls' directory listing programs for GNU. + + Modified by Chet Ramey for Readline. + + Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012, 2015 + 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 3 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, see . */ + +/* Written by Richard Stallman and David MacKenzie. */ + +/* Color support by Peter Anvin and Dennis + Flaherty based on original patches by + Greg Lee . */ + +#ifndef _COLORS_H_ +#define _COLORS_H_ + +#include // size_t + +#if defined(__TANDEM) && defined(HAVE_STDBOOL_H) && (__STDC_VERSION__ < 199901L) +typedef int _Bool; +#endif + +#if defined (HAVE_STDBOOL_H) +# include // bool +#else +typedef int _rl_bool_t; + +#ifdef bool +# undef bool +#endif +#define bool _rl_bool_t + +#ifndef true +# define true 1 +# define false 0 +#endif + +#endif /* !HAVE_STDBOOL_H */ + +/* Null is a valid character in a color indicator (think about Epson + printers, for example) so we have to use a length/buffer string + type. */ +struct bin_str + { + size_t len; + const char *string; + }; + +/* file type indicators (dir, sock, fifo, ...) + Default value is initialized in parse-colors.c. + It is then modified from the values of $LS_COLORS. */ +extern struct bin_str _rl_color_indicator[]; + +/* The LS_COLORS variable is in a termcap-like format. */ +typedef struct _color_ext_type + { + struct bin_str ext; /* The extension we're looking for */ + struct bin_str seq; /* The sequence to output when we do */ + struct _color_ext_type *next; /* Next in list */ + } COLOR_EXT_TYPE; + +/* file extensions indicators (.txt, .log, .jpg, ...) + Values are taken from $LS_COLORS in rl_parse_colors(). */ +extern COLOR_EXT_TYPE *_rl_color_ext_list; + +#define FILETYPE_INDICATORS \ + { \ + C_ORPHAN, C_FIFO, C_CHR, C_DIR, C_BLK, C_FILE, \ + C_LINK, C_SOCK, C_FILE, C_DIR \ + } + +/* Whether we used any colors in the output so far. If so, we will + need to restore the default color later. If not, we will need to + call prep_non_filename_text before using color for the first time. */ + +enum indicator_no + { + C_LEFT, C_RIGHT, C_END, C_RESET, C_NORM, C_FILE, C_DIR, C_LINK, + C_FIFO, C_SOCK, + C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR, C_SETUID, C_SETGID, + C_STICKY, C_OTHER_WRITABLE, C_STICKY_OTHER_WRITABLE, C_CAP, C_MULTIHARDLINK, + C_CLR_TO_EOL + }; + + +#if !S_IXUGO +# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) +#endif + +enum filetype + { + unknown, + fifo, + chardev, + directory, + blockdev, + normal, + symbolic_link, + sock, + whiteout, + arg_directory + }; + +/* Prefix color, currently same as socket */ +#define C_PREFIX C_SOCK + +extern void _rl_put_indicator (const struct bin_str *ind); +extern void _rl_set_normal_color (void); +extern bool _rl_print_prefix_color (void); +extern bool _rl_print_color_indicator (const char *f); +extern void _rl_prep_non_filename_text (void); + +#endif /* !_COLORS_H_ */ diff --git a/compat.c b/compat.c new file mode 100644 index 0000000..fc2a48f --- /dev/null +++ b/compat.c @@ -0,0 +1,106 @@ +/* compat.c -- backwards compatibility functions. */ + +/* Copyright (C) 2000-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#include "rlstdc.h" +#include "rltypedefs.h" + +extern void rl_free_undo_list (void); +extern int rl_maybe_save_line (void); +extern int rl_maybe_unsave_line (void); +extern int rl_maybe_replace_line (void); + +extern int rl_crlf (void); +extern int rl_ding (void); +extern int rl_alphabetic (int); + +extern char **rl_completion_matches (const char *, rl_compentry_func_t *); +extern char *rl_username_completion_function (const char *, int); +extern char *rl_filename_completion_function (const char *, int); + +/* Provide backwards-compatible entry points for old function names. */ + +void +free_undo_list (void) +{ + rl_free_undo_list (); +} + +int +maybe_replace_line (void) +{ + return rl_maybe_replace_line (); +} + +int +maybe_save_line (void) +{ + return rl_maybe_save_line (); +} + +int +maybe_unsave_line (void) +{ + return rl_maybe_unsave_line (); +} + +int +ding (void) +{ + return rl_ding (); +} + +int +crlf (void) +{ + return rl_crlf (); +} + +int +alphabetic (int c) +{ + return rl_alphabetic (c); +} + +char ** +completion_matches (const char *s, rl_compentry_func_t *f) +{ + return rl_completion_matches (s, f); +} + +char * +username_completion_function (const char *s, int i) +{ + return rl_username_completion_function (s, i); +} + +char * +filename_completion_function (const char *s, int i) +{ + return rl_filename_completion_function (s, i); +} diff --git a/complete.c b/complete.c new file mode 100644 index 0000000..e5d224e --- /dev/null +++ b/complete.c @@ -0,0 +1,2992 @@ +/* complete.c -- filename completion for readline. */ + +/* Copyright (C) 1987-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# define _XOPEN_SOURCE_EXTENDED 1 +#endif + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#if defined (__TANDEM) +# include +#endif +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +#include +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +#if defined (HAVE_PWD_H) +#include +#endif + +#include "posixdir.h" +#include "posixstat.h" + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "xmalloc.h" +#include "rlprivate.h" + +#if defined (COLOR_SUPPORT) +# include "colors.h" +#endif + +#ifdef __STDC__ +typedef int QSFUNC (const void *, const void *); +#else +typedef int QSFUNC (); +#endif + +#ifdef HAVE_LSTAT +# define LSTAT lstat +#else +# define LSTAT stat +#endif + +/* Unix version of a hidden file. Could be different on other systems. */ +#define HIDDEN_FILE(fname) ((fname)[0] == '.') + +/* Most systems don't declare getpwent in if _POSIX_SOURCE is + defined. */ +#if defined (HAVE_GETPWENT) && (!defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE)) +extern struct passwd *getpwent (void); +#endif /* HAVE_GETPWENT && (!HAVE_GETPW_DECLS || _POSIX_SOURCE) */ + +/* If non-zero, then this is the address of a function to call when + completing a word would normally display the list of possible matches. + This function is called instead of actually doing the display. + It takes three arguments: (char **matches, int num_matches, int max_length) + where MATCHES is the array of strings that matched, NUM_MATCHES is the + number of strings in that array, and MAX_LENGTH is the length of the + longest string in that array. */ +rl_compdisp_func_t *rl_completion_display_matches_hook = (rl_compdisp_func_t *)NULL; + +#if defined (VISIBLE_STATS) || defined (COLOR_SUPPORT) +# if !defined (X_OK) +# define X_OK 1 +# endif +#endif + +#if defined (VISIBLE_STATS) +static int stat_char (char *); +#endif + +#if defined (COLOR_SUPPORT) +static int colored_stat_start (const char *); +static void colored_stat_end (void); +static int colored_prefix_start (void); +static void colored_prefix_end (void); +#endif + +static int path_isdir (const char *); + +static char *rl_quote_filename (char *, int, char *); + +static void _rl_complete_sigcleanup (int, void *); + +static void set_completion_defaults (int); +static int get_y_or_n (int); +static int _rl_internal_pager (int); +static char *printable_part (char *); +static int fnwidth (const char *); +static int fnprint (const char *, int, const char *); +static int print_filename (char *, char *, int); + +static char **gen_completion_matches (char *, int, int, rl_compentry_func_t *, int, int); + +static char **remove_duplicate_matches (char **); +static void insert_match (char *, int, int, char *); +static int append_to_match (char *, int, int, int); +static void insert_all_matches (char **, int, char *); +static int complete_fncmp (const char *, int, const char *, int); +static void display_matches (char **); +static int compute_lcd_of_matches (char **, int, const char *); +static int postprocess_matches (char ***, int); +static int compare_match (char *, const char *); +static int complete_get_screenwidth (void); + +static char *make_quoted_replacement (char *, int, char *); + +/* **************************************************************** */ +/* */ +/* Completion matching, from readline's point of view. */ +/* */ +/* **************************************************************** */ + +/* Variables known only to the readline library. */ + +/* If non-zero, non-unique completions always show the list of matches. */ +int _rl_complete_show_all = 0; + +/* If non-zero, non-unique completions show the list of matches, unless it + is not possible to do partial completion and modify the line. */ +int _rl_complete_show_unmodified = 0; + +/* If non-zero, completed directory names have a slash appended. */ +int _rl_complete_mark_directories = 1; + +/* If non-zero, the symlinked directory completion behavior introduced in + readline-4.2a is disabled, and symlinks that point to directories have + a slash appended (subject to the value of _rl_complete_mark_directories). + This is user-settable via the mark-symlinked-directories variable. */ +int _rl_complete_mark_symlink_dirs = 0; + +/* If non-zero, completions are printed horizontally in alphabetical order, + like `ls -x'. */ +int _rl_print_completions_horizontally; + +/* Non-zero means that case is not significant in filename completion. */ +#if (defined (__MSDOS__) && !defined (__DJGPP__)) || (defined (_WIN32) && !defined (__CYGWIN__)) +int _rl_completion_case_fold = 1; +#else +int _rl_completion_case_fold = 0; +#endif + +/* Non-zero means that `-' and `_' are equivalent when comparing filenames + for completion. */ +int _rl_completion_case_map = 0; + +/* If zero, don't match hidden files (filenames beginning with a `.' on + Unix) when doing filename completion. */ +int _rl_match_hidden_files = 1; + +/* Length in characters of a common prefix replaced with an ellipsis (`...') + when displaying completion matches. Matches whose printable portion has + more than this number of displaying characters in common will have the common + display prefix replaced with an ellipsis. */ +int _rl_completion_prefix_display_length = 0; + +/* The readline-private number of screen columns to use when displaying + matches. If < 0 or > _rl_screenwidth, it is ignored. */ +int _rl_completion_columns = -1; + +#if defined (COLOR_SUPPORT) +/* Non-zero means to use colors to indicate file type when listing possible + completions. The colors used are taken from $LS_COLORS, if set. */ +int _rl_colored_stats = 0; + +/* Non-zero means to use a color (currently magenta) to indicate the common + prefix of a set of possible word completions. */ +int _rl_colored_completion_prefix = 0; +#endif + +/* If non-zero, when completing in the middle of a word, don't insert + characters from the match that match characters following point in + the word. This means, for instance, completing when the cursor is + after the `e' in `Makefile' won't result in `Makefilefile'. */ +int _rl_skip_completed_text = 0; + +/* If non-zero, menu completion displays the common prefix first in the + cycle of possible completions instead of the last. */ +int _rl_menu_complete_prefix_first = 0; + +/* Global variables available to applications using readline. */ + +#if defined (VISIBLE_STATS) +/* Non-zero means add an additional character to each filename displayed + during listing completion iff rl_filename_completion_desired which helps + to indicate the type of file being listed. */ +int rl_visible_stats = 0; +#endif /* VISIBLE_STATS */ + +/* If non-zero, then this is the address of a function to call when + completing on a directory name. The function is called with + the address of a string (the current directory name) as an arg. */ +rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL; + +rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL; + +rl_icppfunc_t *rl_filename_stat_hook = (rl_icppfunc_t *)NULL; + +/* If non-zero, this is the address of a function to call when reading + directory entries from the filesystem for completion and comparing + them to the partial word to be completed. The function should + either return its first argument (if no conversion takes place) or + newly-allocated memory. This can, for instance, convert filenames + between character sets for comparison against what's typed at the + keyboard. The returned value is what is added to the list of + matches. The second argument is the length of the filename to be + converted. */ +rl_dequote_func_t *rl_filename_rewrite_hook = (rl_dequote_func_t *)NULL; + +/* Non-zero means readline completion functions perform tilde expansion. */ +int rl_complete_with_tilde_expansion = 0; + +/* Pointer to the generator function for completion_matches (). + NULL means to use rl_filename_completion_function (), the default filename + completer. */ +rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)NULL; + +/* Pointer to generator function for rl_menu_complete (). NULL means to use + *rl_completion_entry_function (see above). */ +rl_compentry_func_t *rl_menu_completion_entry_function = (rl_compentry_func_t *)NULL; + +/* Pointer to alternative function to create matches. + Function is called with TEXT, START, and END. + START and END are indices in RL_LINE_BUFFER saying what the boundaries + of TEXT are. + If this function exists and returns NULL then call the value of + rl_completion_entry_function to try to match, otherwise use the + array of strings returned. */ +rl_completion_func_t *rl_attempted_completion_function = (rl_completion_func_t *)NULL; + +/* Non-zero means to suppress normal filename completion after the + user-specified completion function has been called. */ +int rl_attempted_completion_over = 0; + +/* Set to a character indicating the type of completion being performed + by rl_complete_internal, available for use by application completion + functions. */ +int rl_completion_type = 0; + +/* Up to this many items will be displayed in response to a + possible-completions call. After that, we ask the user if + she is sure she wants to see them all. A negative value means + don't ask. */ +int rl_completion_query_items = 100; + +int _rl_page_completions = 1; + +/* The basic list of characters that signal a break between words for the + completer routine. The contents of this variable is what breaks words + in the shell, i.e. " \t\n\"\\'`@$><=" */ +const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; /* }) */ + +/* List of basic quoting characters. */ +const char *rl_basic_quote_characters = "\"'"; + +/* The list of characters that signal a break between words for + rl_complete_internal. The default list is the contents of + rl_basic_word_break_characters. */ +const char *rl_completer_word_break_characters = 0; + +/* Hook function to allow an application to set the completion word + break characters before readline breaks up the line. Allows + position-dependent word break characters. */ +rl_cpvfunc_t *rl_completion_word_break_hook = (rl_cpvfunc_t *)NULL; + +/* List of characters which can be used to quote a substring of the line. + Completion occurs on the entire substring, and within the substring + rl_completer_word_break_characters are treated as any other character, + unless they also appear within this list. */ +const char *rl_completer_quote_characters = (const char *)NULL; + +/* List of characters that should be quoted in filenames by the completer. */ +const char *rl_filename_quote_characters = (const char *)NULL; + +/* List of characters that are word break characters, but should be left + in TEXT when it is passed to the completion function. The shell uses + this to help determine what kind of completing to do. */ +const char *rl_special_prefixes = (const char *)NULL; + +/* If non-zero, then disallow duplicates in the matches. */ +int rl_ignore_completion_duplicates = 1; + +/* Non-zero means that the results of the matches are to be treated + as filenames. This is ALWAYS zero on entry, and can only be changed + within a completion entry finder function. */ +int rl_filename_completion_desired = 0; + +/* Non-zero means that the results of the matches are to be quoted using + double quotes (or an application-specific quoting mechanism) if the + filename contains any characters in rl_filename_quote_chars. This is + ALWAYS non-zero on entry, and can only be changed within a completion + entry finder function. */ +int rl_filename_quoting_desired = 1; + +/* This function, if defined, is called by the completer when real + filename completion is done, after all the matching names have been + generated. It is passed a (char**) known as matches in the code below. + It consists of a NULL-terminated array of pointers to potential + matching strings. The 1st element (matches[0]) is the maximal + substring that is common to all matches. This function can re-arrange + the list of matches as required, but all elements of the array must be + free()'d if they are deleted. The main intent of this function is + to implement FIGNORE a la SunOS csh. */ +rl_compignore_func_t *rl_ignore_some_completions_function = (rl_compignore_func_t *)NULL; + +/* Set to a function to quote a filename in an application-specific fashion. + Called with the text to quote, the type of match found (single or multiple) + and a pointer to the quoting character to be used, which the function can + reset if desired. */ +rl_quote_func_t *rl_filename_quoting_function = rl_quote_filename; + +/* Function to call to remove quoting characters from a filename. Called + before completion is attempted, so the embedded quotes do not interfere + with matching names in the file system. Readline doesn't do anything + with this; it's set only by applications. */ +rl_dequote_func_t *rl_filename_dequoting_function = (rl_dequote_func_t *)NULL; + +/* Function to call to decide whether or not a word break character is + quoted. If a character is quoted, it does not break words for the + completer. */ +rl_linebuf_func_t *rl_char_is_quoted_p = (rl_linebuf_func_t *)NULL; + +/* If non-zero, the completion functions don't append anything except a + possible closing quote. This is set to 0 by rl_complete_internal and + may be changed by an application-specific completion function. */ +int rl_completion_suppress_append = 0; + +/* Character appended to completed words when at the end of the line. The + default is a space. */ +int rl_completion_append_character = ' '; + +/* If non-zero, the completion functions don't append any closing quote. + This is set to 0 by rl_complete_internal and may be changed by an + application-specific completion function. */ +int rl_completion_suppress_quote = 0; + +/* Set to any quote character readline thinks it finds before any application + completion function is called. */ +int rl_completion_quote_character; + +/* Set to a non-zero value if readline found quoting anywhere in the word to + be completed; set before any application completion function is called. */ +int rl_completion_found_quote; + +/* If non-zero, a slash will be appended to completed filenames that are + symbolic links to directory names, subject to the value of the + mark-directories variable (which is user-settable). This exists so + that application completion functions can override the user's preference + (set via the mark-symlinked-directories variable) if appropriate. + It's set to the value of _rl_complete_mark_symlink_dirs in + rl_complete_internal before any application-specific completion + function is called, so without that function doing anything, the user's + preferences are honored. */ +int rl_completion_mark_symlink_dirs; + +/* If non-zero, inhibit completion (temporarily). */ +int rl_inhibit_completion; + +/* Set to the last key used to invoke one of the completion functions */ +int rl_completion_invoking_key; + +/* If non-zero, sort the completion matches. On by default. */ +int rl_sort_completion_matches = 1; + +/* Variables local to this file. */ + +/* Local variable states what happened during the last completion attempt. */ +static int completion_changed_buffer; +static int last_completion_failed = 0; + +/* The result of the query to the user about displaying completion matches */ +static int completion_y_or_n; + +static int _rl_complete_display_matches_interrupt = 0; + +/*************************************/ +/* */ +/* Bindable completion functions */ +/* */ +/*************************************/ + +/* Complete the word at or before point. You have supplied the function + that does the initial simple matching selection algorithm (see + rl_completion_matches ()). The default is to do filename completion. */ +int +rl_complete (int ignore, int invoking_key) +{ + rl_completion_invoking_key = invoking_key; + + if (rl_inhibit_completion) + return (_rl_insert_char (ignore, invoking_key)); +#if 0 + else if (rl_last_func == rl_complete && completion_changed_buffer == 0 && last_completion_failed == 0) +#else + else if (rl_last_func == rl_complete && completion_changed_buffer == 0) +#endif + return (rl_complete_internal ('?')); + else if (_rl_complete_show_all) + return (rl_complete_internal ('!')); + else if (_rl_complete_show_unmodified) + return (rl_complete_internal ('@')); + else + return (rl_complete_internal (TAB)); +} + +/* List the possible completions. See description of rl_complete (). */ +int +rl_possible_completions (int ignore, int invoking_key) +{ + rl_completion_invoking_key = invoking_key; + return (rl_complete_internal ('?')); +} + +int +rl_insert_completions (int ignore, int invoking_key) +{ + rl_completion_invoking_key = invoking_key; + return (rl_complete_internal ('*')); +} + +/* Return the correct value to pass to rl_complete_internal performing + the same tests as rl_complete. This allows consecutive calls to an + application's completion function to list possible completions and for + an application-specific completion function to honor the + show-all-if-ambiguous readline variable. */ +int +rl_completion_mode (rl_command_func_t *cfunc) +{ + if (rl_last_func == cfunc && !completion_changed_buffer) + return '?'; + else if (_rl_complete_show_all) + return '!'; + else if (_rl_complete_show_unmodified) + return '@'; + else + return TAB; +} + +/************************************/ +/* */ +/* Completion utility functions */ +/* */ +/************************************/ + +/* Reset public readline state on a signal or other event. */ +void +_rl_reset_completion_state (void) +{ + rl_completion_found_quote = 0; + rl_completion_quote_character = 0; +} + +static void +_rl_complete_sigcleanup (int sig, void *ptr) +{ + if (sig == SIGINT) /* XXX - for now */ + { + _rl_free_match_list ((char **)ptr); + _rl_complete_display_matches_interrupt = 1; + } +} + +/* Set default values for readline word completion. These are the variables + that application completion functions can change or inspect. */ +static void +set_completion_defaults (int what_to_do) +{ + /* Only the completion entry function can change these. */ + rl_filename_completion_desired = 0; + rl_filename_quoting_desired = 1; + rl_completion_type = what_to_do; + rl_completion_suppress_append = rl_completion_suppress_quote = 0; + rl_completion_append_character = ' '; + + /* The completion entry function may optionally change this. */ + rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs; + + /* Reset private state. */ + _rl_complete_display_matches_interrupt = 0; +} + +/* The user must press "y" or "n". Non-zero return means "y" pressed. */ +static int +get_y_or_n (int for_pager) +{ + int c; + + /* For now, disable pager in callback mode, until we later convert to state + driven functions. Have to wait until next major version to add new + state definition, since it will change value of RL_STATE_DONE. */ +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + return 1; +#endif + + for (;;) + { + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (c == 'y' || c == 'Y' || c == ' ') + return (1); + if (c == 'n' || c == 'N' || c == RUBOUT) + return (0); + if (c == ABORT_CHAR || c < 0) + _rl_abort_internal (); + if (for_pager && (c == NEWLINE || c == RETURN)) + return (2); + if (for_pager && (c == 'q' || c == 'Q')) + return (0); + rl_ding (); + } +} + +static int +_rl_internal_pager (int lines) +{ + int i; + + fprintf (rl_outstream, "--More--"); + fflush (rl_outstream); + i = get_y_or_n (1); + _rl_erase_entire_line (); + if (i == 0) + return -1; + else if (i == 2) + return (lines - 1); + else + return 0; +} + +static int +path_isdir (const char *filename) +{ + struct stat finfo; + + return (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode)); +} + +#if defined (VISIBLE_STATS) +/* Return the character which best describes FILENAME. + `@' for symbolic links + `/' for directories + `*' for executables + `=' for sockets + `|' for FIFOs + `%' for character special devices + `#' for block special devices */ +static int +stat_char (char *filename) +{ + struct stat finfo; + int character, r; + char *f; + const char *fn; + + /* Short-circuit a //server on cygwin, since that will always behave as + a directory. */ +#if __CYGWIN__ + if (filename[0] == '/' && filename[1] == '/' && strchr (filename+2, '/') == 0) + return '/'; +#endif + + f = 0; + if (rl_filename_stat_hook) + { + f = savestring (filename); + (*rl_filename_stat_hook) (&f); + fn = f; + } + else + fn = filename; + +#if defined (HAVE_LSTAT) && defined (S_ISLNK) + r = lstat (fn, &finfo); +#else + r = stat (fn, &finfo); +#endif + + if (r == -1) + { + xfree (f); + 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 defined (_WIN32) && !defined (__CYGWIN__) + char *ext; + + /* Windows doesn't do access and X_OK; check file extension instead */ + ext = strrchr (fn, '.'); + if (ext && (_rl_stricmp (ext, ".exe") == 0 || + _rl_stricmp (ext, ".cmd") == 0 || + _rl_stricmp (ext, ".bat") == 0 || + _rl_stricmp (ext, ".com") == 0)) + character = '*'; +#else + if (access (filename, X_OK) == 0) + character = '*'; +#endif + } + + xfree (f); + return (character); +} +#endif /* VISIBLE_STATS */ + +#if defined (COLOR_SUPPORT) +static int +colored_stat_start (const char *filename) +{ + _rl_set_normal_color (); + return (_rl_print_color_indicator (filename)); +} + +static void +colored_stat_end (void) +{ + _rl_prep_non_filename_text (); + _rl_put_indicator (&_rl_color_indicator[C_CLR_TO_EOL]); +} + +static int +colored_prefix_start (void) +{ + _rl_set_normal_color (); + return (_rl_print_prefix_color ()); +} + +static void +colored_prefix_end (void) +{ + colored_stat_end (); /* for now */ +} +#endif + +/* Return the portion of PATHNAME that should be output when listing + possible completions. If we are hacking filename completion, we + are only interested in the basename, the portion following the + final slash. Otherwise, we return what we were passed. Since + printing empty strings is not very informative, if we're doing + filename completion, and the basename is the empty string, we look + for the previous slash and return the portion following that. If + there's no previous slash, we just return what we were passed. */ +static char * +printable_part (char *pathname) +{ + char *temp, *x; + + if (rl_filename_completion_desired == 0) /* don't need to do anything */ + return (pathname); + + temp = strrchr (pathname, '/'); +#if defined (__MSDOS__) || defined (_WIN32) + if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':') + temp = pathname + 1; +#endif + + if (temp == 0 || *temp == '\0') + return (pathname); + else if (temp[1] == 0 && temp == pathname) + return (pathname); + /* If the basename is NULL, we might have a pathname like '/usr/src/'. + Look for a previous slash and, if one is found, return the portion + following that slash. If there's no previous slash, just return the + pathname we were passed. */ + else if (temp[1] == '\0') + { + for (x = temp - 1; x > pathname; x--) + if (*x == '/') + break; + return ((*x == '/') ? x + 1 : pathname); + } + else + return ++temp; +} + +/* Compute width of STRING when displayed on screen by print_filename */ +static int +fnwidth (const char *string) +{ + int width, pos; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; + int left, w; + size_t clen; + WCHAR_T wc; + + left = strlen (string) + 1; + memset (&ps, 0, sizeof (mbstate_t)); +#endif + + width = pos = 0; + while (string[pos]) + { + if (CTRL_CHAR (string[pos]) || string[pos] == RUBOUT) + { + width += 2; + pos++; + } + else + { +#if defined (HANDLE_MULTIBYTE) + clen = MBRTOWC (&wc, string + pos, left - pos, &ps); + if (MB_INVALIDCH (clen)) + { + width++; + pos++; + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (MB_NULLWCH (clen)) + break; + else + { + pos += clen; + w = WCWIDTH (wc); + width += (w >= 0) ? w : 1; + } +#else + width++; + pos++; +#endif + } + } + + return width; +} + +#define ELLIPSIS_LEN 3 + +static int +fnprint (const char *to_print, int prefix_bytes, const char *real_pathname) +{ + int printed_len, w; + const char *s; + int common_prefix_len, print_len; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; + const char *end; + size_t tlen; + int width; + WCHAR_T wc; + + print_len = strlen (to_print); + end = to_print + print_len + 1; + memset (&ps, 0, sizeof (mbstate_t)); +#else + print_len = strlen (to_print); +#endif + + printed_len = common_prefix_len = 0; + + /* Don't print only the ellipsis if the common prefix is one of the + possible completions. Only cut off prefix_bytes if we're going to be + printing the ellipsis, which takes precedence over coloring the + completion prefix (see print_filename() below). */ + if (_rl_completion_prefix_display_length > 0 && prefix_bytes >= print_len) + prefix_bytes = 0; + +#if defined (COLOR_SUPPORT) + if (_rl_colored_stats && (prefix_bytes == 0 || _rl_colored_completion_prefix <= 0)) + colored_stat_start (real_pathname); +#endif + + if (prefix_bytes && _rl_completion_prefix_display_length > 0 && + prefix_bytes > _rl_completion_prefix_display_length) + { + char ellipsis; + + ellipsis = (to_print[prefix_bytes] == '.') ? '_' : '.'; + for (w = 0; w < ELLIPSIS_LEN; w++) + putc (ellipsis, rl_outstream); + printed_len = ELLIPSIS_LEN; + } +#if defined (COLOR_SUPPORT) + else if (prefix_bytes && _rl_colored_completion_prefix > 0) + { + common_prefix_len = prefix_bytes; + prefix_bytes = 0; + /* XXX - print color indicator start here */ + colored_prefix_start (); + } +#endif + + s = to_print + prefix_bytes; + while (*s) + { + if (CTRL_CHAR (*s)) + { + putc ('^', rl_outstream); + putc (UNCTRL (*s), rl_outstream); + printed_len += 2; + s++; +#if defined (HANDLE_MULTIBYTE) + memset (&ps, 0, sizeof (mbstate_t)); +#endif + } + else if (*s == RUBOUT) + { + putc ('^', rl_outstream); + putc ('?', rl_outstream); + printed_len += 2; + s++; +#if defined (HANDLE_MULTIBYTE) + memset (&ps, 0, sizeof (mbstate_t)); +#endif + } + else + { +#if defined (HANDLE_MULTIBYTE) + tlen = MBRTOWC (&wc, s, end - s, &ps); + if (MB_INVALIDCH (tlen)) + { + tlen = 1; + width = 1; + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (MB_NULLWCH (tlen)) + break; + else + { + w = WCWIDTH (wc); + width = (w >= 0) ? w : 1; + } + fwrite (s, 1, tlen, rl_outstream); + s += tlen; + printed_len += width; +#else + putc (*s, rl_outstream); + s++; + printed_len++; +#endif + } + if (common_prefix_len > 0 && (s - to_print) >= common_prefix_len) + { +#if defined (COLOR_SUPPORT) + /* printed bytes = s - to_print */ + /* printed bytes should never be > but check for paranoia's sake */ + colored_prefix_end (); + if (_rl_colored_stats) + colored_stat_start (real_pathname); /* XXX - experiment */ +#endif + common_prefix_len = 0; + } + } + +#if defined (COLOR_SUPPORT) + /* XXX - unconditional for now */ + if (_rl_colored_stats) + colored_stat_end (); +#endif + + return printed_len; +} + +/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we + are using it, check for and output a single character for `special' + filenames. Return the number of characters we output. */ + +static int +print_filename (char *to_print, char *full_pathname, int prefix_bytes) +{ + int printed_len, extension_char, slen, tlen; + char *s, c, *new_full_pathname, *dn; + + extension_char = 0; +#if defined (COLOR_SUPPORT) + /* Defer printing if we want to prefix with a color indicator */ + if (_rl_colored_stats == 0 || rl_filename_completion_desired == 0) +#endif + printed_len = fnprint (to_print, prefix_bytes, to_print); + + if (rl_filename_completion_desired && ( +#if defined (VISIBLE_STATS) + rl_visible_stats || +#endif +#if defined (COLOR_SUPPORT) + _rl_colored_stats || +#endif + _rl_complete_mark_directories)) + { + /* If to_print != full_pathname, to_print is the basename of the + path passed. In this case, we try to expand the directory + name before checking for the stat character. */ + if (to_print != full_pathname) + { + /* Terminate the directory name. */ + c = to_print[-1]; + to_print[-1] = '\0'; + + /* If setting the last slash in full_pathname to a NUL results in + full_pathname being the empty string, we are trying to complete + files in the root directory. If we pass a null string to the + bash directory completion hook, for example, it will expand it + to the current directory. We just want the `/'. */ + if (full_pathname == 0 || *full_pathname == 0) + dn = "/"; + else if (full_pathname[0] != '/') + dn = full_pathname; + else if (full_pathname[1] == 0) + dn = "//"; /* restore trailing slash to `//' */ + else if (full_pathname[1] == '/' && full_pathname[2] == 0) + dn = "/"; /* don't turn /// into // */ + else + dn = full_pathname; + s = tilde_expand (dn); + if (rl_directory_completion_hook) + (*rl_directory_completion_hook) (&s); + + slen = strlen (s); + tlen = strlen (to_print); + new_full_pathname = (char *)xmalloc (slen + tlen + 2); + strcpy (new_full_pathname, s); + if (s[slen - 1] == '/') + slen--; + else + new_full_pathname[slen] = '/'; + strcpy (new_full_pathname + slen + 1, to_print); + +#if defined (VISIBLE_STATS) + if (rl_visible_stats) + extension_char = stat_char (new_full_pathname); + else +#endif + if (_rl_complete_mark_directories) + { + dn = 0; + if (rl_directory_completion_hook == 0 && rl_filename_stat_hook) + { + dn = savestring (new_full_pathname); + (*rl_filename_stat_hook) (&dn); + xfree (new_full_pathname); + new_full_pathname = dn; + } + if (path_isdir (new_full_pathname)) + extension_char = '/'; + } + + /* Move colored-stats code inside fnprint() */ +#if defined (COLOR_SUPPORT) + if (_rl_colored_stats) + printed_len = fnprint (to_print, prefix_bytes, new_full_pathname); +#endif + + xfree (new_full_pathname); + to_print[-1] = c; + } + else + { + s = tilde_expand (full_pathname); +#if defined (VISIBLE_STATS) + if (rl_visible_stats) + extension_char = stat_char (s); + else +#endif + if (_rl_complete_mark_directories && path_isdir (s)) + extension_char = '/'; + + /* Move colored-stats code inside fnprint() */ +#if defined (COLOR_SUPPORT) + if (_rl_colored_stats) + printed_len = fnprint (to_print, prefix_bytes, s); +#endif + } + + xfree (s); + if (extension_char) + { + putc (extension_char, rl_outstream); + printed_len++; + } + } + + return printed_len; +} + +static char * +rl_quote_filename (char *s, int rtype, char *qcp) +{ + char *r; + + r = (char *)xmalloc (strlen (s) + 2); + *r = *rl_completer_quote_characters; + strcpy (r + 1, s); + if (qcp) + *qcp = *rl_completer_quote_characters; + return r; +} + +/* Find the bounds of the current word for completion purposes, and leave + rl_point set to the end of the word. This function skips quoted + substrings (characters between matched pairs of characters in + rl_completer_quote_characters). First we try to find an unclosed + quoted substring on which to do matching. If one is not found, we use + the word break characters to find the boundaries of the current word. + We call an application-specific function to decide whether or not a + particular word break character is quoted; if that function returns a + non-zero result, the character does not break a word. This function + returns the opening quote character if we found an unclosed quoted + substring, '\0' otherwise. FP, if non-null, is set to a value saying + which (shell-like) quote characters we found (single quote, double + quote, or backslash) anywhere in the string. DP, if non-null, is set to + the value of the delimiter character that caused a word break. */ + +char +_rl_find_completion_word (int *fp, int *dp) +{ + int scan, end, found_quote, delimiter, pass_next, isbrk; + char quote_char; + const char *brkchars; + + end = rl_point; + found_quote = delimiter = 0; + quote_char = '\0'; + + brkchars = 0; + if (rl_completion_word_break_hook) + brkchars = (*rl_completion_word_break_hook) (); + if (brkchars == 0) + brkchars = rl_completer_word_break_characters; + + if (rl_completer_quote_characters) + { + /* We have a list of characters which can be used in pairs to + quote substrings for the completer. Try to find the start + of an unclosed quoted substring. */ + /* FOUND_QUOTE is set so we know what kind of quotes we found. */ + for (scan = pass_next = 0; scan < end; scan = MB_NEXTCHAR (rl_line_buffer, scan, 1, MB_FIND_ANY)) + { + if (pass_next) + { + pass_next = 0; + continue; + } + + /* Shell-like semantics for single quotes -- don't allow backslash + to quote anything in single quotes, especially not the closing + quote. If you don't like this, take out the check on the value + of quote_char. */ + if (quote_char != '\'' && rl_line_buffer[scan] == '\\') + { + pass_next = 1; + found_quote |= RL_QF_BACKSLASH; + continue; + } + + if (quote_char != '\0') + { + /* Ignore everything until the matching close quote char. */ + if (rl_line_buffer[scan] == quote_char) + { + /* Found matching close. Abandon this substring. */ + quote_char = '\0'; + rl_point = end; + } + } + else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan])) + { + /* Found start of a quoted substring. */ + quote_char = rl_line_buffer[scan]; + rl_point = scan + 1; + /* Shell-like quoting conventions. */ + if (quote_char == '\'') + found_quote |= RL_QF_SINGLE_QUOTE; + else if (quote_char == '"') + found_quote |= RL_QF_DOUBLE_QUOTE; + else + found_quote |= RL_QF_OTHER_QUOTE; + } + } + } + + if (rl_point == end && quote_char == '\0') + { + /* We didn't find an unclosed quoted substring upon which to do + completion, so use the word break characters to find the + substring on which to complete. */ + while (rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_ANY)) + { + scan = rl_line_buffer[rl_point]; + + if (strchr (brkchars, scan) == 0) + continue; + + /* Call the application-specific function to tell us whether + this word break character is quoted and should be skipped. */ + if (rl_char_is_quoted_p && found_quote && + (*rl_char_is_quoted_p) (rl_line_buffer, rl_point)) + continue; + + /* Convoluted code, but it avoids an n^2 algorithm with calls + to char_is_quoted. */ + break; + } + } + + /* If we are at an unquoted word break, then advance past it. */ + scan = rl_line_buffer[rl_point]; + + /* If there is an application-specific function to say whether or not + a character is quoted and we found a quote character, let that + function decide whether or not a character is a word break, even + if it is found in rl_completer_word_break_characters. Don't bother + if we're at the end of the line, though. */ + if (scan) + { + if (rl_char_is_quoted_p) + isbrk = (found_quote == 0 || + (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) && + strchr (brkchars, scan) != 0; + else + isbrk = strchr (brkchars, scan) != 0; + + if (isbrk) + { + /* If the character that caused the word break was a quoting + character, then remember it as the delimiter. */ + if (rl_basic_quote_characters && + strchr (rl_basic_quote_characters, scan) && + (end - rl_point) > 1) + delimiter = scan; + + /* If the character isn't needed to determine something special + about what kind of completion to perform, then advance past it. */ + if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0) + rl_point++; + } + } + + if (fp) + *fp = found_quote; + if (dp) + *dp = delimiter; + + return (quote_char); +} + +static char ** +gen_completion_matches (char *text, int start, int end, rl_compentry_func_t *our_func, int found_quote, int quote_char) +{ + char **matches; + + rl_completion_found_quote = found_quote; + rl_completion_quote_character = quote_char; + + /* If the user wants to TRY to complete, but then wants to give + up and use the default completion function, they set the + variable rl_attempted_completion_function. */ + if (rl_attempted_completion_function) + { + matches = (*rl_attempted_completion_function) (text, start, end); + if (RL_SIG_RECEIVED()) + { + _rl_free_match_list (matches); + matches = 0; + RL_CHECK_SIGNALS (); + } + + if (matches || rl_attempted_completion_over) + { + rl_attempted_completion_over = 0; + return (matches); + } + } + + /* XXX -- filename dequoting moved into rl_filename_completion_function */ + + /* rl_completion_matches will check for signals as well to avoid a long + delay while reading a directory. */ + matches = rl_completion_matches (text, our_func); + if (RL_SIG_RECEIVED()) + { + _rl_free_match_list (matches); + matches = 0; + RL_CHECK_SIGNALS (); + } + return matches; +} + +/* Filter out duplicates in MATCHES. This frees up the strings in + MATCHES. */ +static char ** +remove_duplicate_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 && rl_sort_completion_matches) + 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) + { + xfree (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) + xfree (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) + { + xfree (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 (char **match_list, int matches, const char *text) +{ + register int i, c1, c2, si; + int low; /* Count of max-matched characters. */ + int lx; + char *dtext; /* dequoted TEXT, if needed */ +#if defined (HANDLE_MULTIBYTE) + int v; + size_t v1, v2; + mbstate_t ps1, ps2; + WCHAR_T wc1, wc2; +#endif + + /* If only one match, just use that. Otherwise, compare each + member of the list with the next, finding out where they + stop matching. */ + if (matches == 1) + { + match_list[0] = match_list[1]; + match_list[1] = (char *)NULL; + return 1; + } + + for (i = 1, low = 100000; i < matches; i++) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + memset (&ps1, 0, sizeof (mbstate_t)); + memset (&ps2, 0, sizeof (mbstate_t)); + } +#endif + for (si = 0; (c1 = match_list[i][si]) && (c2 = match_list[i + 1][si]); si++) + { + if (_rl_completion_case_fold) + { + c1 = _rl_to_lower (c1); + c2 = _rl_to_lower (c2); + } +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + v1 = MBRTOWC (&wc1, match_list[i]+si, strlen (match_list[i]+si), &ps1); + v2 = MBRTOWC (&wc2, match_list[i+1]+si, strlen (match_list[i+1]+si), &ps2); + if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2)) + { + if (c1 != c2) /* do byte comparison */ + break; + continue; + } + if (_rl_completion_case_fold) + { + wc1 = towlower (wc1); + wc2 = towlower (wc2); + } + if (wc1 != wc2) + break; + else if (v1 > 1) + si += v1 - 1; + } + else +#endif + if (c1 != c2) + break; + } + + if (low > si) + low = si; + } + + /* If there were multiple matches, but none matched up to even the + first character, and the user typed something, use that as the + value of matches[0]. */ + if (low == 0 && text && *text) + { + match_list[0] = (char *)xmalloc (strlen (text) + 1); + strcpy (match_list[0], text); + } + else + { + match_list[0] = (char *)xmalloc (low + 1); + + /* XXX - this might need changes in the presence of multibyte chars */ + + /* If we are ignoring case, try to preserve the case of the string + the user typed in the face of multiple matches differing in case. */ + if (_rl_completion_case_fold) + { + /* We're making an assumption here: + IF we're completing filenames AND + the application has defined a filename dequoting function AND + we found a quote character AND + the application has requested filename quoting + THEN + we assume that TEXT was dequoted before checking against + the file system and needs to be dequoted here before we + check against the list of matches + FI */ + dtext = (char *)NULL; + if (rl_filename_completion_desired && + rl_filename_dequoting_function && + rl_completion_found_quote && + rl_filename_quoting_desired) + { + dtext = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); + text = dtext; + } + + /* sort the list to get consistent answers. */ + if (rl_sort_completion_matches) + qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare); + + si = strlen (text); + lx = (si <= low) ? si : low; /* check shorter of text and matches */ + /* Try to preserve the case of what the user typed in the presence of + multiple matches: check each match for something that matches + what the user typed taking case into account; use it up to common + length of matches if one is found. If not, just use first match. */ + for (i = 1; i <= matches; i++) + if (strncmp (match_list[i], text, lx) == 0) + { + strncpy (match_list[0], match_list[i], low); + break; + } + /* no casematch, use first entry */ + if (i > matches) + strncpy (match_list[0], match_list[1], low); + + FREE (dtext); + } + else + strncpy (match_list[0], match_list[1], low); + + match_list[0][low] = '\0'; + } + + return matches; +} + +static int +postprocess_matches (char ***matchesp, int matching_filenames) +{ + char *t, **matches, **temp_matches; + int nmatch, i; + + matches = *matchesp; + + if (matches == 0) + return 0; + + /* It seems to me that in all the cases we handle we would like + to ignore duplicate possibilities. Scan for the text to + insert being identical to the other completions. */ + if (rl_ignore_completion_duplicates) + { + temp_matches = remove_duplicate_matches (matches); + xfree (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); +} + +static int +complete_get_screenwidth (void) +{ + int cols; + char *envcols; + + cols = _rl_completion_columns; + if (cols >= 0 && cols <= _rl_screenwidth) + return cols; + envcols = getenv ("COLUMNS"); + if (envcols && *envcols) + cols = atoi (envcols); + if (cols >= 0 && cols <= _rl_screenwidth) + return cols; + return _rl_screenwidth; +} + +/* 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 (char **matches, int len, int max) +{ + int count, limit, printed_len, lines, cols; + int i, j, k, l, common_length, sind; + char *temp, *t; + + /* Find the length of the prefix common to all items: length as displayed + characters (common_length) and as a byte index into the matches (sind) */ + common_length = sind = 0; + if (_rl_completion_prefix_display_length > 0) + { + t = printable_part (matches[0]); + /* check again in case of /usr/src/ */ + temp = rl_filename_completion_desired ? strrchr (t, '/') : 0; + common_length = temp ? fnwidth (temp) : fnwidth (t); + sind = temp ? strlen (temp) : strlen (t); + if (common_length > max || sind > max) + common_length = sind = 0; + + if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN) + max -= common_length - ELLIPSIS_LEN; + else if (_rl_colored_completion_prefix <= 0) + common_length = sind = 0; + } +#if defined (COLOR_SUPPORT) + else if (_rl_colored_completion_prefix > 0) + { + t = printable_part (matches[0]); + temp = rl_filename_completion_desired ? strrchr (t, '/') : 0; + common_length = temp ? fnwidth (temp) : fnwidth (t); + sind = temp ? RL_STRLEN (temp+1) : RL_STRLEN (t); /* want portion after final slash */ + if (common_length > max || sind > max) + common_length = sind = 0; + } +#endif + + /* How many items of MAX length can we fit in the screen window? */ + cols = complete_get_screenwidth (); + max += 2; + limit = cols / max; + if (limit != 1 && (limit * max == cols)) + limit--; + + /* If cols == 0, limit will end up -1 */ + if (cols < _rl_screenwidth && limit < 0) + limit = 1; + + /* Avoid a possible floating exception. If max > cols, + 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 && rl_sort_completion_matches) + qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); + + rl_crlf (); + + lines = 0; + if (_rl_print_completions_horizontally == 0) + { + /* Print the sorted items, up-and-down alphabetically, like ls. */ + for (i = 1; i <= count; i++) + { + for (j = 0, l = i; j < limit; j++) + { + if (l > len || matches[l] == 0) + break; + else + { + temp = printable_part (matches[l]); + printed_len = print_filename (temp, matches[l], sind); + + if (j + 1 < limit) + { + if (max <= printed_len) + putc (' ', rl_outstream); + else + for (k = 0; k < max - printed_len; k++) + putc (' ', rl_outstream); + } + } + l += count; + } + rl_crlf (); +#if defined (SIGWINCH) + if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0) +#else + if (RL_SIG_RECEIVED ()) +#endif + return; + lines++; + if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count) + { + lines = _rl_internal_pager (lines); + if (lines < 0) + return; + } + } + } + else + { + /* Print the sorted items, across alphabetically, like ls -x. */ + for (i = 1; matches[i]; i++) + { + temp = printable_part (matches[i]); + printed_len = print_filename (temp, matches[i], sind); + /* Have we reached the end of this line? */ +#if defined (SIGWINCH) + if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0) +#else + if (RL_SIG_RECEIVED ()) +#endif + return; + if (matches[i+1]) + { + if (limit == 1 || (i && (limit > 1) && (i % limit) == 0)) + { + rl_crlf (); + lines++; + if (_rl_page_completions && lines >= _rl_screenheight - 1) + { + lines = _rl_internal_pager (lines); + if (lines < 0) + return; + } + } + else if (max <= printed_len) + putc (' ', rl_outstream); + else + for (k = 0; k < max - printed_len; k++) + putc (' ', rl_outstream); + } + } + rl_crlf (); + } +} + +/* Display MATCHES, a list of matching filenames in argv format. This + handles the simple case -- a single match -- first. If there is more + than one match, we compute the number of strings in the list and the + length of the longest string, which will be needed by the display + function. If the application wants to handle displaying the list of + matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the + address of a function, and we just call it. If we're handling the + display ourselves, we just call rl_display_match_list. We also check + that the list of matches doesn't exceed the user-settable threshold, + and ask the user if he wants to see the list if there are more matches + than RL_COMPLETION_QUERY_ITEMS. */ +static void +display_matches (char **matches) +{ + int len, max, i; + char *temp; + + /* Move to the last visible line of a possibly-multiple-line command. */ + _rl_move_vert (_rl_vis_botlin); + + /* Handle simple case first. What if there is only one answer? */ + if (matches[1] == 0) + { + temp = printable_part (matches[0]); + rl_crlf (); + print_filename (temp, matches[0], 0); + rl_crlf (); + + rl_forced_update_display (); + rl_display_fixed = 1; + + return; + } + + /* There is more than one answer. Find out how many there are, + and find the maximum printed length of a single entry. */ + for (max = 0, i = 1; matches[i]; i++) + { + temp = printable_part (matches[i]); + len = fnwidth (temp); + + if (len > max) + max = len; + } + + len = i - 1; + + /* If the caller has defined a display hook, then call that now. */ + if (rl_completion_display_matches_hook) + { + (*rl_completion_display_matches_hook) (matches, len, max); + return; + } + + /* If there are many items, then ask the user if she really wants to + see them all. */ + if (rl_completion_query_items > 0 && len >= rl_completion_query_items) + { + rl_crlf (); + fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len); + fflush (rl_outstream); + if ((completion_y_or_n = get_y_or_n (0)) == 0) + { + rl_crlf (); + + rl_forced_update_display (); + rl_display_fixed = 1; + + return; + } + } + + rl_display_match_list (matches, len, max); + + rl_forced_update_display (); + rl_display_fixed = 1; +} + +/* qc == pointer to quoting character, if any */ +static char * +make_quoted_replacement (char *match, int mtype, char *qc) +{ + 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 (char *match, int start, int mtype, char *qc) +{ + char *replacement, *r; + char oqc; + int end, rlen; + + oqc = qc ? *qc : '\0'; + replacement = make_quoted_replacement (match, mtype, qc); + + /* Now insert the match. */ + if (replacement) + { + rlen = strlen (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--; + end = rl_point - 1; + /* Don't double a closing quote character */ + if (qc && *qc && end && rl_line_buffer[rl_point] == *qc && replacement[rlen - 1] == *qc) + end++; + if (_rl_skip_completed_text) + { + r = replacement; + while (start < rl_end && *r && rl_line_buffer[start] == *r) + { + start++; + r++; + } + if (start <= end || *r) + _rl_replace_text (r, start, end); + rl_point = start + strlen (r); + } + else + _rl_replace_text (replacement, start, end); + if (replacement != match) + xfree (replacement); + } +} + +/* Append any necessary closing quote and a separator character to the + just-inserted match. If the user has specified that directories + should be marked by a trailing `/', append one of those instead. The + default trailing character is a space. Returns the number of characters + appended. If NONTRIVIAL_MATCH is set, we test for a symlink (if the OS + has them) and don't add a suffix for a symlink to a directory. A + nontrivial match is one that actually adds to the word being completed. + The variable rl_completion_mark_symlink_dirs controls this behavior + (it's initially set to the what the user has chosen, indicated by the + value of _rl_complete_mark_symlink_dirs, but may be modified by an + application's completion function). */ +static int +append_to_match (char *text, int delimiter, int quote_char, int nontrivial_match) +{ + char temp_string[4], *filename, *fn; + int temp_string_index, s; + struct stat finfo; + + temp_string_index = 0; + if (quote_char && rl_point && rl_completion_suppress_quote == 0 && + rl_line_buffer[rl_point - 1] != quote_char) + temp_string[temp_string_index++] = quote_char; + + if (delimiter) + temp_string[temp_string_index++] = delimiter; + else if (rl_completion_suppress_append == 0 && rl_completion_append_character) + temp_string[temp_string_index++] = rl_completion_append_character; + + temp_string[temp_string_index++] = '\0'; + + if (rl_filename_completion_desired) + { + filename = tilde_expand (text); + if (rl_filename_stat_hook) + { + fn = savestring (filename); + (*rl_filename_stat_hook) (&fn); + xfree (filename); + filename = fn; + } + s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0) + ? LSTAT (filename, &finfo) + : stat (filename, &finfo); + if (s == 0 && S_ISDIR (finfo.st_mode)) + { + if (_rl_complete_mark_directories /* && rl_completion_suppress_append == 0 */) + { + /* This is clumsy. Avoid putting in a double slash if point + is at the end of the line and the previous character is a + slash. */ + if (rl_point && rl_line_buffer[rl_point] == '\0' && rl_line_buffer[rl_point - 1] == '/') + ; + else if (rl_line_buffer[rl_point] != '/') + rl_insert_text ("/"); + } + } +#ifdef S_ISLNK + /* Don't add anything if the filename is a symlink and resolves to a + directory. */ + else if (s == 0 && S_ISLNK (finfo.st_mode) && path_isdir (filename)) + ; +#endif + else + { + if (rl_point == rl_end && temp_string_index) + rl_insert_text (temp_string); + } + xfree (filename); + } + else + { + if (rl_point == rl_end && temp_string_index) + rl_insert_text (temp_string); + } + + return (temp_string_index); +} + +static void +insert_all_matches (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]) + xfree (rp); + } + } + else + { + rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc); + rl_insert_text (rp); + rl_insert_text (" "); + if (rp != matches[0]) + xfree (rp); + } + rl_end_undo_group (); +} + +void +_rl_free_match_list (char **matches) +{ + register int i; + + if (matches == 0) + return; + + for (i = 0; matches[i]; i++) + xfree (matches[i]); + xfree (matches); +} + +/* Compare a possibly-quoted filename TEXT from the line buffer and a possible + MATCH that is the product of filename completion, which acts on the dequoted + text. */ +static int +compare_match (char *text, const char *match) +{ + char *temp; + int r; + + if (rl_filename_completion_desired && rl_filename_quoting_desired && + rl_completion_found_quote && rl_filename_dequoting_function) + { + temp = (*rl_filename_dequoting_function) (text, rl_completion_quote_character); + r = strcmp (temp, match); + xfree (temp); + return r; + } + return (strcmp (text, match)); +} + +/* Complete the word at or before point. + WHAT_TO_DO says what to do with the completion. + `?' means list the possible completions. + TAB means do standard completion. + `*' means insert all of the possible completions. + `!' means to do standard completion, and list all possible completions if + there is more than one. + `@' means to do standard completion, and list all possible completions if + there is more than one and partial completion is not possible. */ +int +rl_complete_internal (int what_to_do) +{ + char **matches; + rl_compentry_func_t *our_func; + int start, end, delimiter, found_quote, i, nontrivial_lcd; + char *text, *saved_line_buffer; + char quote_char; + int tlen, mlen, saved_last_completion_failed; + + RL_SETSTATE(RL_STATE_COMPLETING); + + saved_last_completion_failed = last_completion_failed; + + set_completion_defaults (what_to_do); + + saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL; + our_func = rl_completion_entry_function + ? rl_completion_entry_function + : rl_filename_completion_function; + /* We now look backwards for the start of a filename/variable word. */ + end = rl_point; + found_quote = delimiter = 0; + quote_char = '\0'; + + if (rl_point) + /* This (possibly) changes rl_point. If it returns a non-zero char, + we know we have an open quote. */ + quote_char = _rl_find_completion_word (&found_quote, &delimiter); + + start = rl_point; + rl_point = end; + + text = rl_copy_text (start, end); + matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char); + /* nontrivial_lcd is set if the common prefix adds something to the word + being completed. */ + nontrivial_lcd = matches && compare_match (text, matches[0]) != 0; + if (what_to_do == '!' || what_to_do == '@') + tlen = strlen (text); + xfree (text); + + if (matches == 0) + { + rl_ding (); + FREE (saved_line_buffer); + completion_changed_buffer = 0; + last_completion_failed = 1; + RL_UNSETSTATE(RL_STATE_COMPLETING); + _rl_reset_completion_state (); + return (0); + } + + /* If we are matching filenames, the attempted completion function will + have set rl_filename_completion_desired to a non-zero value. The basic + rl_filename_completion_function does this. */ + i = rl_filename_completion_desired; + + if (postprocess_matches (&matches, i) == 0) + { + rl_ding (); + FREE (saved_line_buffer); + completion_changed_buffer = 0; + last_completion_failed = 1; + RL_UNSETSTATE(RL_STATE_COMPLETING); + _rl_reset_completion_state (); + return (0); + } + + if (matches && matches[0] && *matches[0]) + last_completion_failed = 0; + + switch (what_to_do) + { + case TAB: + case '!': + case '@': + /* Insert the first match with proper quoting. */ + if (what_to_do == TAB) + { + if (*matches[0]) + insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); + } + else if (*matches[0] && matches[1] == 0) + /* should we perform the check only if there are multiple matches? */ + insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); + else if (*matches[0]) /* what_to_do != TAB && multiple matches */ + { + mlen = *matches[0] ? strlen (matches[0]) : 0; + if (mlen >= tlen) + insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); + } + + /* If there are more matches, ring the bell to indicate. + If we are in vi mode, Posix.2 says to not ring the bell. + If the `show-all-if-ambiguous' variable is set, display + all the matches immediately. Otherwise, if this was the + only match, and we are hacking files, check the file to + see if it was a directory. If so, and the `mark-directories' + variable is set, add a '/' to the name. If not, and we + are at the end of the line, then add a space. */ + if (matches[1]) + { + if (what_to_do == '!') + { + display_matches (matches); + break; + } + else if (what_to_do == '@') + { + if (nontrivial_lcd == 0) + display_matches (matches); + break; + } + else if (rl_editing_mode != vi_mode) + rl_ding (); /* There are other matches remaining. */ + } + else + append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); + + break; + + case '*': + insert_all_matches (matches, start, "e_char); + break; + + case '?': + /* Let's try to insert a single match here if the last completion failed + but this attempt returned a single match. */ + if (saved_last_completion_failed && matches[0] && *matches[0] && matches[1] == 0) + { + insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); + append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); + break; + } + + if (rl_completion_display_matches_hook == 0) + { + _rl_sigcleanup = _rl_complete_sigcleanup; + _rl_sigcleanarg = matches; + _rl_complete_display_matches_interrupt = 0; + } + display_matches (matches); + if (_rl_complete_display_matches_interrupt) + { + matches = 0; /* already freed by rl_complete_sigcleanup */ + _rl_complete_display_matches_interrupt = 0; + if (rl_signal_event_hook) + (*rl_signal_event_hook) (); /* XXX */ + } + _rl_sigcleanup = 0; + _rl_sigcleanarg = 0; + break; + + default: + _rl_ttymsg ("bad value %d for what_to_do in rl_complete", what_to_do); + rl_ding (); + FREE (saved_line_buffer); + RL_UNSETSTATE(RL_STATE_COMPLETING); + _rl_free_match_list (matches); + _rl_reset_completion_state (); + return 1; + } + + _rl_free_match_list (matches); + + /* Check to see if the line has changed through all of this manipulation. */ + if (saved_line_buffer) + { + completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0; + xfree (saved_line_buffer); + } + + RL_UNSETSTATE(RL_STATE_COMPLETING); + _rl_reset_completion_state (); + + RL_CHECK_SIGNALS (); + return 0; +} + +/***************************************************************/ +/* */ +/* Application-callable completion match generator functions */ +/* */ +/***************************************************************/ + +/* Return an array of (char *) which is a list of completions for TEXT. + If there are no completions, return a NULL pointer. + The first entry in the returned array is the substitution for TEXT. + The remaining entries are the possible completions. + The array is terminated with a NULL pointer. + + ENTRY_FUNCTION is a function of two args, and returns a (char *). + The first argument is TEXT. + The second is a state argument; it should be zero on the first call, and + non-zero on subsequent calls. It returns a NULL pointer to the caller + when there are no more matches. + */ +char ** +rl_completion_matches (const char *text, rl_compentry_func_t *entry_function) +{ + register int i; + + /* 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 (RL_SIG_RECEIVED ()) + { + /* Start at 1 because we don't set matches[0] in this function. + Only free the list members if we're building match list from + rl_filename_completion_function, since we know that doesn't + free the strings it returns. */ + if (entry_function == rl_filename_completion_function) + { + for (i = 1; match_list[i]; i++) + xfree (match_list[i]); + } + xfree (match_list); + match_list = 0; + match_list_size = 0; + matches = 0; + RL_CHECK_SIGNALS (); + } + + if (matches + 1 >= match_list_size) + match_list = (char **)xrealloc + (match_list, ((match_list_size += 10) + 1) * sizeof (char *)); + + if (match_list == 0) + return (match_list); + + 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. */ + { + xfree (match_list); + match_list = (char **)NULL; + } + return (match_list); +} + +/* A completion function for usernames. + TEXT contains a partial username preceded by a random + character (usually `~'). */ +char * +rl_username_completion_function (const char *text, int state) +{ +#if defined (__WIN32__) || defined (__OPENNT) + return (char *)NULL; +#else /* !__WIN32__ && !__OPENNT) */ + static char *username = (char *)NULL; + static struct passwd *entry; + static int namelen, first_char, first_char_loc; + char *value; + + if (state == 0) + { + FREE (username); + + first_char = *text; + first_char_loc = first_char == '~'; + + username = savestring (&text[first_char_loc]); + namelen = strlen (username); +#if defined (HAVE_GETPWENT) + setpwent (); +#endif + } + +#if defined (HAVE_GETPWENT) + while (entry = getpwent ()) + { + /* Null usernames should result in all users as possible completions. */ + if (namelen == 0 || (STREQN (username, entry->pw_name, namelen))) + break; + } +#endif + + if (entry == 0) + { +#if defined (HAVE_GETPWENT) + endpwent (); +#endif + return ((char *)NULL); + } + else + { + value = (char *)xmalloc (2 + strlen (entry->pw_name)); + + *value = *text; + + strcpy (value + first_char_loc, entry->pw_name); + + if (first_char == '~') + rl_filename_completion_desired = 1; + + return (value); + } +#endif /* !__WIN32__ && !__OPENNT */ +} + +/* Return non-zero if CONVFN matches FILENAME up to the length of FILENAME + (FILENAME_LEN). If _rl_completion_case_fold is set, compare without + regard to the alphabetic case of characters. If + _rl_completion_case_map is set, make `-' and `_' equivalent. CONVFN is + the possibly-converted directory entry; FILENAME is what the user typed. */ +static int +complete_fncmp (const char *convfn, int convlen, const char *filename, int filename_len) +{ + register char *s1, *s2; + int d, len; +#if defined (HANDLE_MULTIBYTE) + size_t v1, v2; + mbstate_t ps1, ps2; + WCHAR_T wc1, wc2; +#endif + +#if defined (HANDLE_MULTIBYTE) + memset (&ps1, 0, sizeof (mbstate_t)); + memset (&ps2, 0, sizeof (mbstate_t)); +#endif + + if (filename_len == 0) + return 1; + if (convlen < filename_len) + return 0; + + len = filename_len; + s1 = (char *)convfn; + s2 = (char *)filename; + + /* Otherwise, if these match up to the length of filename, then + it is a match. */ + if (_rl_completion_case_fold && _rl_completion_case_map) + { + /* Case-insensitive comparison treating _ and - as equivalent */ +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + do + { + v1 = MBRTOWC (&wc1, s1, convlen, &ps1); + v2 = MBRTOWC (&wc2, s2, filename_len, &ps2); + if (v1 == 0 && v2 == 0) + return 1; + else if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2)) + { + if (*s1 != *s2) /* do byte comparison */ + return 0; + else if ((*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_')) + return 0; + s1++; s2++; len--; + continue; + } + wc1 = towlower (wc1); + wc2 = towlower (wc2); + s1 += v1; + s2 += v1; + len -= v1; + if ((wc1 == L'-' || wc1 == L'_') && (wc2 == L'-' || wc2 == L'_')) + continue; + if (wc1 != wc2) + return 0; + } + while (len != 0); + } + else +#endif + { + do + { + d = _rl_to_lower (*s1) - _rl_to_lower (*s2); + /* *s1 == [-_] && *s2 == [-_] */ + if ((*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_')) + d = 0; + if (d != 0) + return 0; + s1++; s2++; /* already checked convlen >= filename_len */ + } + while (--len != 0); + } + + return 1; + } + else if (_rl_completion_case_fold) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + do + { + v1 = MBRTOWC (&wc1, s1, convlen, &ps1); + v2 = MBRTOWC (&wc2, s2, filename_len, &ps2); + if (v1 == 0 && v2 == 0) + return 1; + else if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2)) + { + if (*s1 != *s2) /* do byte comparison */ + return 0; + s1++; s2++; len--; + continue; + } + wc1 = towlower (wc1); + wc2 = towlower (wc2); + if (wc1 != wc2) + return 0; + s1 += v1; + s2 += v1; + len -= v1; + } + while (len != 0); + return 1; + } + else +#endif + if ((_rl_to_lower (convfn[0]) == _rl_to_lower (filename[0])) && + (convlen >= filename_len) && + (_rl_strnicmp (filename, convfn, filename_len) == 0)) + return 1; + } + else + { + if ((convfn[0] == filename[0]) && + (convlen >= filename_len) && + (strncmp (filename, convfn, filename_len) == 0)) + return 1; + } + return 0; +} + +/* Okay, now we write the entry_function for filename completion. In the + general case. Note that completion in the shell is a little different + because of all the pathnames that must be followed when looking up the + completion for a command. */ +char * +rl_filename_completion_function (const char *text, int state) +{ + static DIR *directory = (DIR *)NULL; + static char *filename = (char *)NULL; + static char *dirname = (char *)NULL; + static char *users_dirname = (char *)NULL; + static int filename_len; + char *temp, *dentry, *convfn; + int dirlen, dentlen, convlen; + int tilde_dirname; + 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__) || defined (_WIN32) + /* special hack for //X/... */ + if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/') + temp = strrchr (dirname + 3, '/'); +#endif + + if (temp) + { + strcpy (filename, ++temp); + *temp = '\0'; + } +#if defined (__MSDOS__) || (defined (_WIN32) && !defined (__CYGWIN__)) + /* searches from current directory on the drive */ + else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':') + { + strcpy (filename, dirname + 2); + dirname[2] = '\0'; + } +#endif + else + { + dirname[0] = '.'; + dirname[1] = '\0'; + } + + /* We aren't done yet. We also support the "~user" syntax. */ + + /* Save the version of the directory that the user typed, dequoting + it if necessary. */ + if (rl_completion_found_quote && rl_filename_dequoting_function) + users_dirname = (*rl_filename_dequoting_function) (dirname, rl_completion_quote_character); + else + users_dirname = savestring (dirname); + + tilde_dirname = 0; + if (*dirname == '~') + { + temp = tilde_expand (dirname); + xfree (dirname); + dirname = temp; + tilde_dirname = 1; + } + + /* We have saved the possibly-dequoted version of the directory name + the user typed. Now transform the directory name we're going to + pass to opendir(2). The directory rewrite hook modifies only the + directory name; the directory completion hook modifies both the + directory name passed to opendir(2) and the version the user + typed. Both the directory completion and rewrite hooks should perform + any necessary dequoting. The hook functions return 1 if they modify + the directory name argument. If either hook returns 0, it should + not modify the directory name pointer passed as an argument. */ + if (rl_directory_rewrite_hook) + (*rl_directory_rewrite_hook) (&dirname); + else if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname)) + { + xfree (users_dirname); + users_dirname = savestring (dirname); + } + else if (tilde_dirname == 0 && rl_completion_found_quote && rl_filename_dequoting_function) + { + /* delete single and double quotes */ + xfree (dirname); + dirname = savestring (users_dirname); + } + directory = opendir (dirname); + + /* Now dequote a non-null filename. FILENAME will not be NULL, but may + be empty. */ + if (*filename && rl_completion_found_quote && rl_filename_dequoting_function) + { + /* delete single and double quotes */ + temp = (*rl_filename_dequoting_function) (filename, rl_completion_quote_character); + xfree (filename); + filename = temp; + } + filename_len = strlen (filename); + + rl_filename_completion_desired = 1; + } + + /* At this point we should entertain the possibility of hacking wildcarded + filenames, like /usr/man/man/te. 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))) + { + convfn = dentry = entry->d_name; + convlen = dentlen = D_NAMLEN (entry); + + if (rl_filename_rewrite_hook) + { + convfn = (*rl_filename_rewrite_hook) (dentry, dentlen); + convlen = (convfn == dentry) ? dentlen : strlen (convfn); + } + + /* Special case for no filename. If the user has disabled the + `match-hidden-files' variable, skip filenames beginning with `.'. + All other entries except "." and ".." match. */ + if (filename_len == 0) + { + if (_rl_match_hidden_files == 0 && HIDDEN_FILE (convfn)) + continue; + + if (convfn[0] != '.' || + (convfn[1] && (convfn[1] != '.' || convfn[2]))) + break; + } + else + { + if (complete_fncmp (convfn, convlen, filename, filename_len)) + break; + } + } + + if (entry == 0) + { + if (directory) + { + closedir (directory); + directory = (DIR *)NULL; + } + if (dirname) + { + xfree (dirname); + dirname = (char *)NULL; + } + if (filename) + { + xfree (filename); + filename = (char *)NULL; + } + if (users_dirname) + { + xfree (users_dirname); + users_dirname = (char *)NULL; + } + + return (char *)NULL; + } + else + { + /* dirname && (strcmp (dirname, ".") != 0) */ + if (dirname && (dirname[0] != '.' || dirname[1])) + { + if (rl_complete_with_tilde_expansion && *users_dirname == '~') + { + dirlen = strlen (dirname); + temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry)); + strcpy (temp, dirname); + /* Canonicalization cuts off any final slash present. We + may need to add it back. */ + if (dirname[dirlen - 1] != '/') + { + temp[dirlen++] = '/'; + temp[dirlen] = '\0'; + } + } + else + { + dirlen = strlen (users_dirname); + temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry)); + strcpy (temp, users_dirname); + /* Make sure that temp has a trailing slash here. */ + if (users_dirname[dirlen - 1] != '/') + temp[dirlen++] = '/'; + } + + strcpy (temp + dirlen, convfn); + } + else + temp = savestring (convfn); + + if (convfn != dentry) + xfree (convfn); + + return (temp); + } +} + +/* An initial implementation of a menu completion function a la tcsh. The + first time (if the last readline command was not rl_old_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_old_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_old_menu_complete (int count, int invoking_key) +{ + rl_compentry_func_t *our_func; + int matching_filenames, found_quote; + + static char *orig_text; + static char **matches = (char **)0; + static int match_list_index = 0; + static int match_list_size = 0; + static int orig_start, orig_end; + static char quote_char; + static int delimiter; + + /* The first time through, we generate the list of matches and set things + up to insert them. */ + if (rl_last_func != rl_old_menu_complete) + { + /* Clean up from previous call, if any. */ + FREE (orig_text); + if (matches) + _rl_free_match_list (matches); + + match_list_index = match_list_size = 0; + matches = (char **)NULL; + + rl_completion_invoking_key = invoking_key; + + RL_SETSTATE(RL_STATE_COMPLETING); + + /* Only the completion entry function can change these. */ + set_completion_defaults ('%'); + + our_func = rl_menu_completion_entry_function; + if (our_func == 0) + our_func = rl_completion_entry_function + ? rl_completion_entry_function + : rl_filename_completion_function; + + /* We now look backwards for the start of a filename/variable word. */ + orig_end = rl_point; + found_quote = delimiter = 0; + quote_char = '\0'; + + if (rl_point) + /* This (possibly) changes rl_point. If it returns a non-zero char, + we know we have an open quote. */ + quote_char = _rl_find_completion_word (&found_quote, &delimiter); + + orig_start = rl_point; + rl_point = orig_end; + + orig_text = rl_copy_text (orig_start, orig_end); + matches = gen_completion_matches (orig_text, orig_start, orig_end, + our_func, found_quote, quote_char); + + /* If we are matching filenames, the attempted completion function will + have set rl_filename_completion_desired to a non-zero value. The basic + rl_filename_completion_function does this. */ + matching_filenames = rl_filename_completion_desired; + + if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0) + { + rl_ding (); + FREE (matches); + matches = (char **)0; + FREE (orig_text); + orig_text = (char *)0; + completion_changed_buffer = 0; + RL_UNSETSTATE(RL_STATE_COMPLETING); + return (0); + } + + RL_UNSETSTATE(RL_STATE_COMPLETING); + + 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. */ + + if (match_list_size > 1 && _rl_complete_show_all) + display_matches (matches); + } + + /* Now we have the list of matches. Replace the text between + rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with + matches[match_list_index], and add any necessary closing char. */ + + if (matches == 0 || match_list_size == 0) + { + rl_ding (); + FREE (matches); + matches = (char **)0; + completion_changed_buffer = 0; + return (0); + } + + match_list_index += count; + if (match_list_index < 0) + { + while (match_list_index < 0) + match_list_index += match_list_size; + } + else + match_list_index %= match_list_size; + + if (match_list_index == 0 && match_list_size > 1) + { + rl_ding (); + insert_match (orig_text, orig_start, MULT_MATCH, "e_char); + } + else + { + insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); + append_to_match (matches[match_list_index], delimiter, quote_char, + compare_match (orig_text, matches[match_list_index])); + } + + completion_changed_buffer = 1; + return (0); +} + +/* The current version of menu completion. + The differences between this function and the original are: + +1. It honors the maximum number of completions variable (completion-query-items) +2. It appends to the word as usual if there is only one match +3. It displays the common prefix if there is one, and makes it the first menu + choice if the menu-complete-display-prefix option is enabled +*/ + +int +rl_menu_complete (int count, int ignore) +{ + rl_compentry_func_t *our_func; + int matching_filenames, found_quote; + + static char *orig_text; + static char **matches = (char **)0; + static int match_list_index = 0; + static int match_list_size = 0; + static int nontrivial_lcd = 0; + static int full_completion = 0; /* set to 1 if menu completion should reinitialize on next call */ + static int orig_start, orig_end; + static char quote_char; + static int delimiter, cstate; + + /* The first time through, we generate the list of matches and set things + up to insert them. */ + if ((rl_last_func != rl_menu_complete && rl_last_func != rl_backward_menu_complete) || full_completion) + { + /* Clean up from previous call, if any. */ + FREE (orig_text); + if (matches) + _rl_free_match_list (matches); + + match_list_index = match_list_size = 0; + matches = (char **)NULL; + + full_completion = 0; + + RL_SETSTATE(RL_STATE_COMPLETING); + + /* Only the completion entry function can change these. */ + set_completion_defaults ('%'); + + our_func = rl_menu_completion_entry_function; + if (our_func == 0) + our_func = rl_completion_entry_function + ? rl_completion_entry_function + : rl_filename_completion_function; + + /* We now look backwards for the start of a filename/variable word. */ + orig_end = rl_point; + found_quote = delimiter = 0; + quote_char = '\0'; + + if (rl_point) + /* This (possibly) changes rl_point. If it returns a non-zero char, + we know we have an open quote. */ + quote_char = _rl_find_completion_word (&found_quote, &delimiter); + + orig_start = rl_point; + rl_point = orig_end; + + orig_text = rl_copy_text (orig_start, orig_end); + matches = gen_completion_matches (orig_text, orig_start, orig_end, + our_func, found_quote, quote_char); + + nontrivial_lcd = matches && compare_match (orig_text, matches[0]) != 0; + + /* If we are matching filenames, the attempted completion function will + have set rl_filename_completion_desired to a non-zero value. The basic + rl_filename_completion_function does this. */ + matching_filenames = rl_filename_completion_desired; + + if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0) + { + rl_ding (); + FREE (matches); + matches = (char **)0; + FREE (orig_text); + orig_text = (char *)0; + completion_changed_buffer = 0; + RL_UNSETSTATE(RL_STATE_COMPLETING); + return (0); + } + + RL_UNSETSTATE(RL_STATE_COMPLETING); + + for (match_list_size = 0; matches[match_list_size]; match_list_size++) + ; + + if (match_list_size == 0) + { + rl_ding (); + FREE (matches); + matches = (char **)0; + match_list_index = 0; + completion_changed_buffer = 0; + return (0); + } + + /* matches[0] is lcd if match_list_size > 1, but the circular buffer + code below should take care of it. */ + if (*matches[0]) + { + insert_match (matches[0], orig_start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); + orig_end = orig_start + strlen (matches[0]); + completion_changed_buffer = STREQ (orig_text, matches[0]) == 0; + } + + if (match_list_size > 1 && _rl_complete_show_all) + { + display_matches (matches); + /* If there are so many matches that the user has to be asked + whether or not he wants to see the matches, menu completion + is unwieldy. */ + if (rl_completion_query_items > 0 && match_list_size >= rl_completion_query_items) + { + rl_ding (); + FREE (matches); + matches = (char **)0; + full_completion = 1; + return (0); + } + else if (_rl_menu_complete_prefix_first) + { + rl_ding (); + return (0); + } + } + else if (match_list_size <= 1) + { + append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); + full_completion = 1; + return (0); + } + else if (_rl_menu_complete_prefix_first && match_list_size > 1) + { + rl_ding (); + return (0); + } + } + + /* Now we have the list of matches. Replace the text between + rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with + matches[match_list_index], and add any necessary closing char. */ + + if (matches == 0 || match_list_size == 0) + { + rl_ding (); + FREE (matches); + matches = (char **)0; + completion_changed_buffer = 0; + return (0); + } + + match_list_index += count; + if (match_list_index < 0) + { + while (match_list_index < 0) + match_list_index += match_list_size; + } + else + match_list_index %= match_list_size; + + if (match_list_index == 0 && match_list_size > 1) + { + rl_ding (); + insert_match (matches[0], orig_start, MULT_MATCH, "e_char); + } + else + { + insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); + append_to_match (matches[match_list_index], delimiter, quote_char, + compare_match (orig_text, matches[match_list_index])); + } + + completion_changed_buffer = 1; + return (0); +} + +int +rl_backward_menu_complete (int count, int key) +{ + /* Positive arguments to backward-menu-complete translate into negative + arguments for menu-complete, and vice versa. */ + return (rl_menu_complete (-count, key)); +} diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..521e778 --- /dev/null +++ b/config.h.in @@ -0,0 +1,311 @@ +/* config.h.in. Maintained by hand. */ + +/* Template definitions for autoconf */ + +/* These are set by AC_USE_SYSTEM_EXTENSIONS */ +#undef __EXTENSIONS__ +#undef _ALL_SOURCE +#undef _GNU_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_1_SOURCE +#undef _POSIX_PTHREAD_SEMANTICS +#undef _TANDEM_SOURCE +#undef _MINIX + +/* Define NO_MULTIBYTE_SUPPORT to not compile in support for multibyte + characters, even if the OS supports them. */ +#undef NO_MULTIBYTE_SUPPORT + +#undef _FILE_OFFSET_BITS + +/* Characteristics of the compiler. */ +#undef inline + +#undef sig_atomic_t + +#undef size_t + +#undef ssize_t + +#undef const + +#undef volatile + +#undef PROTOTYPES +#undef __PROTOTYPES + +#undef __CHAR_UNSIGNED__ + +/* Define if the `S_IS*' macros in do not work properly. */ +#undef STAT_MACROS_BROKEN + +/* Define if you have the chown function. */ +#undef HAVE_CHOWN + +/* Define if you have the fcntl function. */ +#undef HAVE_FCNTL + +/* Define if you have the fnmatch function. */ +#undef HAVE_FNMATCH + +/* Define if you have the getpwent function. */ +#undef HAVE_GETPWENT + +/* Define if you have the getpwnam function. */ +#undef HAVE_GETPWNAM + +/* Define if you have the getpwuid function. */ +#undef HAVE_GETPWUID + +/* Define if you have the gettimeofday function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define if you have the isascii function. */ +#undef HAVE_ISASCII + +/* Define if you have the iswctype function. */ +#undef HAVE_ISWCTYPE + +/* Define if you have the iswlower function. */ +#undef HAVE_ISWLOWER + +/* Define if you have the iswupper function. */ +#undef HAVE_ISWUPPER + +/* Define if you have the isxdigit function. */ +#undef HAVE_ISXDIGIT + +/* Define if you have the kill function. */ +#undef HAVE_KILL + +/* Define if you have the lstat function. */ +#undef HAVE_LSTAT + +/* Define if you have the mbrlen function. */ +#undef HAVE_MBRLEN + +/* Define if you have the mbrtowc function. */ +#undef HAVE_MBRTOWC + +/* Define if you have the mbsrtowcs function. */ +#undef HAVE_MBSRTOWCS + +/* Define if you have the memmove function. */ +#undef HAVE_MEMMOVE + +/* Define if you have the pselect function. */ +#undef HAVE_PSELECT + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the readlink function. */ +#undef HAVE_READLINK + +/* 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 setitimer function. */ +#undef HAVE_SETITIMER + +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + +/* Define if you have the strcasecmp function. */ +#undef HAVE_STRCASECMP + +/* Define if you have the strcoll function. */ +#undef HAVE_STRCOLL + +#undef STRCOLL_BROKEN + +/* Define if you have the strpbrk function. */ +#undef HAVE_STRPBRK + +/* Define if you have the sysconf function. */ +#undef HAVE_SYSCONF + +/* Define if you have the tcgetattr function. */ +#undef HAVE_TCGETATTR + +/* Define if you have the towlower function. */ +#undef HAVE_TOWLOWER + +/* Define if you have the towupper function. */ +#undef HAVE_TOWUPPER + +/* Define if you have the vsnprintf function. */ +#undef HAVE_VSNPRINTF + +/* Define if you have the wcrtomb function. */ +#undef HAVE_WCRTOMB + +/* Define if you have the wcscoll function. */ +#undef HAVE_WCSCOLL + +/* Define if you have the wctype function. */ +#undef HAVE_WCTYPE + +/* Define if you have the wcwidth function. */ +#undef HAVE_WCWIDTH + +/* and whether it works */ +#undef WCWIDTH_BROKEN + +/* Define if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define if you have the header file. */ +#undef HAVE_LANGINFO_H + +/* Define if you have the header file. */ +#undef HAVE_LIBAUDIT_H + +/* Define if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define if you have the header file. */ +#undef HAVE_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_NCURSES_TERMCAP_H + +/* Define if you have the header file. */ +#undef HAVE_PWD_H + +/* Define if you have the header file. */ +#undef HAVE_STDARG_H + +/* Define if you have the header file. */ +#undef HAVE_STDBOOL_H + +/* Define if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define if you have the header file. */ +#undef HAVE_STRING_H + +/* Define if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_PTE_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_PTEM_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_STREAM_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define if you have the header file. */ +#undef HAVE_TERMCAP_H + +/* Define if you have the header file. */ +#undef HAVE_TERMIO_H + +/* Define if you have the header file. */ +#undef HAVE_TERMIOS_H + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the header file. */ +#undef HAVE_VARARGS_H + +/* Define if you have the header file. */ +#undef HAVE_WCHAR_H + +/* Define if you have the header file. */ +#undef HAVE_WCTYPE_H + +#undef HAVE_MBSTATE_T + +/* Define if you have wchar_t in . */ +#undef HAVE_WCHAR_T + +/* Define if you have wctype_t in . */ +#undef HAVE_WCTYPE_T + +/* Define if you have wint_t in . */ +#undef HAVE_WINT_T + +/* Define if you have and nl_langinfo(CODESET). */ +#undef HAVE_LANGINFO_CODESET + +/* Define if you have and it defines AUDIT_USER_TTY */ +#undef HAVE_DECL_AUDIT_USER_TTY + +/* Definitions pulled in from aclocal.m4. */ +#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 HAVE_STRUCT_DIRENT_D_INO + +#undef HAVE_STRUCT_DIRENT_D_FILENO + +#undef HAVE_STRUCT_DIRENT_D_NAMLEN + +#undef HAVE_TIMEVAL + +#undef HAVE_BSD_SIGNALS + +#undef HAVE_POSIX_SIGNALS + +#undef HAVE_USG_SIGHOLD + +#undef MUST_REINSTALL_SIGHANDLERS + +#undef HAVE_POSIX_SIGSETJMP + +#undef CTYPE_NON_ASCII + +/* modify settings or make new ones based on what autoconf tells us. */ + +/* Ultrix botches type-ahead when switching from canonical to + non-canonical mode, at least through version 4.3 */ +#if !defined (HAVE_TERMIOS_H) || !defined (HAVE_TCGETATTR) || defined (ultrix) +# define TERMIOS_MISSING +#endif + +/* VARARGS defines moved to rlstdc.h */ diff --git a/configure b/configure new file mode 100755 index 0000000..cb4e07a --- /dev/null +++ b/configure @@ -0,0 +1,9219 @@ +#! /bin/sh +# From configure.ac for Readline 8.2, version 2.97. +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.71 for readline 8.2. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else \$as_nop + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else \$as_nop + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else $as_nop + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and +$0: bug-readline@gnu.org about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='readline' +PACKAGE_TARNAME='readline' +PACKAGE_VERSION='8.2' +PACKAGE_STRING='readline 8.2' +PACKAGE_BUGREPORT='bug-readline@gnu.org' +PACKAGE_URL='' + +ac_unique_file="readline.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='LTLIBOBJS +TERMCAP_PKG_CONFIG_LIB +TERMCAP_LIB +LIBVERSION +ARFLAGS +LOCAL_DEFS +LOCAL_LDFLAGS +LOCAL_CFLAGS +BUILD_DIR +EXAMPLES_INSTALL_TARGET +SHARED_INSTALL_TARGET +STATIC_INSTALL_TARGET +SHARED_TARGET +STATIC_TARGET +SHLIB_MINOR +SHLIB_MAJOR +SHLIB_LIBS +SHLIB_DLLVERSION +SHLIB_LIBVERSION +SHLIB_LIBSUFF +SHLIB_LIBPREF +SHLIB_DOT +SHLIB_XLDFLAGS +SHLIB_STATUS +SHOBJ_STATUS +SHOBJ_LIBS +SHOBJ_XLDFLAGS +SHOBJ_LDFLAGS +SHOBJ_LD +SHOBJ_CFLAGS +SHOBJ_CC +LIBOBJS +MAKE_SHELL +RANLIB +AR +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +EGREP +GREP +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +SET_MAKE +CROSS_COMPILE +BRACKETED_PASTE +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_curses +with_shared_termcap_library +enable_multibyte +enable_shared +enable_static +enable_install_examples +enable_bracketed_paste_default +enable_largefile +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +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=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$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 ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=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 ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# 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 the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures readline 8.2 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/readline] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of readline 8.2:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-multibyte enable multibyte characters if OS supports them + --enable-shared build shared libraries [[default=YES]] + --enable-static build static libraries [[default=YES]] + --disable-install-examples + don't install examples [[default=install]] + --disable-bracketed-paste-default + disable bracketed paste by default + [[default=enable]] + --disable-largefile omit support for large files + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-curses use the curses library instead of the termcap + library + --with-shared-termcap-library + link the readline shared library against the + termcap/curses shared library [[default=NO]] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +readline configure 8.2 +generated by GNU Autoconf 2.71 + +Copyright (C) 2021 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* 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_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +printf %s "checking for $2.$3... " >&6; } +if eval test \${$4+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main (void) +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$4=yes" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main (void) +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$4=yes" +else $as_nop + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$4 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_member + +# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR +# ------------------------------------------------------------------ +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. +ac_fn_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_check_decl + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_hi=$ac_mid; break +else $as_nop + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_lo=$ac_mid; break +else $as_nop + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done +else $as_nop + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_hi=$ac_mid +else $as_nop + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval (void) { return $2; } +static unsigned long int ulongval (void) { return $2; } +#include +#include +int +main (void) +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + echo >>conftest.val; read $3 config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by readline $as_me 8.2, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" +as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" + +# Auxiliary files required by this configure script. +ac_aux_files="install-sh config.guess config.sub" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}/./support" + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + +ac_config_headers="$ac_config_headers config.h" + + +LIBVERSION=8.2 + + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + +opt_curses=no +opt_shared_termcap_lib=no + + +# Check whether --with-curses was given. +if test ${with_curses+y} +then : + withval=$with_curses; opt_curses=$withval +fi + + +# Check whether --with-shared-termcap-library was given. +if test ${with_shared_termcap_library+y} +then : + withval=$with_shared_termcap_library; opt_shared_termcap_lib=$withval +fi + + +if test "$opt_curses" = "yes"; then + prefer_curses=yes +fi + +opt_multibyte=yes +opt_static_libs=yes +opt_shared_libs=yes +opt_install_examples=yes +opt_bracketed_paste_default=yes + +# Check whether --enable-multibyte was given. +if test ${enable_multibyte+y} +then : + enableval=$enable_multibyte; opt_multibyte=$enableval +fi + +# Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; opt_shared_libs=$enableval +fi + +# Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; opt_static_libs=$enableval +fi + +# Check whether --enable-install-examples was given. +if test ${enable_install_examples+y} +then : + enableval=$enable_install_examples; opt_install_examples=$enableval +fi + + +# Check whether --enable-bracketed-paste-default was given. +if test ${enable_bracketed_paste_default+y} +then : + enableval=$enable_bracketed_paste_default; opt_bracketed_paste_default=$enableval +fi + + +if test $opt_multibyte = no; then +printf "%s\n" "#define NO_MULTIBYTE_SUPPORT 1" >>confdefs.h + +fi + +if test $opt_bracketed_paste_default = yes; then + BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=1' +else + BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=0' +fi + + + + +CROSS_COMPILE= +if test "x$cross_compiling" = "xyes"; then + case "${host}" in + *-cygwin*) + cross_cache=${srcdir}/cross-build/cygwin.cache + ;; + *-mingw*) + cross_cache=${srcdir}/cross-build/mingw.cache + ;; + i[3456]86-*-beos*) + cross_cache=${srcdir}/cross-build/x86-beos.cache + ;; + *) echo "configure: cross-compiling for $host is not supported" >&2 + ;; + esac + if test -n "${cross_cache}" && test -r "${cross_cache}"; then + echo "loading cross-build cache file ${cross_cache}" + . ${cross_cache} + fi + unset cross_cache + CROSS_COMPILE='-DCROSS_COMPILING' + +fi + +echo "" +echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}" +echo "" + +# We want these before the checks, so the checks can modify their values. +test -z "$CFLAGS" && want_auto_cflags=1 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_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 $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; 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 +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test ${ac_cv_safe_to_define___extensions__+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_safe_to_define___extensions__=yes +else $as_nop + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 +printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } +if test ${ac_cv_should_define__xopen_source+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_should_define__xopen_source=no + if test $ac_cv_header_wchar_h = yes +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + mbstate_t x; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE 500 + #include + mbstate_t x; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_should_define__xopen_source=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 +printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } + + printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h + + printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h + + printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h + + if test $ac_cv_header_minix_config_h = yes +then : + MINIX=yes + printf "%s\n" "#define _MINIX 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h + +else $as_nop + MINIX= +fi + if test $ac_cv_safe_to_define___extensions__ = yes +then : + printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h + +fi + if test $ac_cv_should_define__xopen_source = yes +then : + printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h + +fi + + +# If we're using gcc and the user hasn't specified CFLAGS, add -O2 to CFLAGS +if test -n "$want_auto_cflags" ; then + AUTO_CFLAGS="-g ${GCC:+-O2}" + STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}" +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +if test $ac_cv_c_compiler_gnu = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 +printf %s "checking whether $CC needs -traditional... " >&6; } +if test ${ac_cv_prog_gcc_traditional+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_pattern="Autoconf.*'x'" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1 +then : + ac_cv_prog_gcc_traditional=yes +else $as_nop + ac_cv_prog_gcc_traditional=no +fi +rm -rf conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1 +then : + ac_cv_prog_gcc_traditional=yes +fi +rm -rf conftest* + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 +printf "%s\n" "$ac_cv_prog_gcc_traditional" >&6; } + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +test -n "$ARFLAGS" || ARFLAGS="cr" +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +MAKE_SHELL=/bin/sh + + + +# codeset.m4 serial 5 (gettext-0.18.2) + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* IBM XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_const=yes +else $as_nop + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +printf "%s\n" "#define const /**/" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo (void) {return 0; } +$ac_kw foo_t foo (void) {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +if test "$ac_prog_cc_stdc" != no; then + +printf "%s\n" "#define PROTOTYPES 1" >>confdefs.h + + +printf "%s\n" "#define __PROTOTYPES 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 +printf %s "checking whether char is unsigned... " >&6; } +if test ${ac_cv_c_char_unsigned+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ +static int test_array [1 - 2 * !(((char) -1) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_char_unsigned=no +else $as_nop + ac_cv_c_char_unsigned=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 +printf "%s\n" "$ac_cv_c_char_unsigned" >&6; } +if test $ac_cv_c_char_unsigned = yes; then + printf "%s\n" "#define __CHAR_UNSIGNED__ 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 +printf %s "checking for working volatile... " >&6; } +if test ${ac_cv_c_volatile+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + +volatile int x; +int * volatile y = (int *) 0; +return !x && !y; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_volatile=yes +else $as_nop + ac_cv_c_volatile=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +printf "%s\n" "$ac_cv_c_volatile" >&6; } +if test $ac_cv_c_volatile = no; then + +printf "%s\n" "#define volatile /**/" >>confdefs.h + +fi + + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes +then : + +else $as_nop + +printf "%s\n" "#define size_t unsigned int" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" +if test "x$ac_cv_type_ssize_t" = xyes +then : + +else $as_nop + +printf "%s\n" "#define ssize_t int" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 +printf %s "checking whether stat file-mode macros are broken... " >&6; } +if test ${ac_cv_header_stat_broken+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +#if defined S_ISBLK && defined S_IFDIR +extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; +#endif + +#if defined S_ISBLK && defined S_IFCHR +extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; +#endif + +#if defined S_ISLNK && defined S_IFREG +extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; +#endif + +#if defined S_ISSOCK && defined S_IFREG +extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_header_stat_broken=no +else $as_nop + ac_cv_header_stat_broken=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 +printf "%s\n" "$ac_cv_header_stat_broken" >&6; } +if test $ac_cv_header_stat_broken = yes; then + +printf "%s\n" "#define STAT_MACROS_BROKEN 1" >>confdefs.h + +fi + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +printf %s "checking for $ac_hdr that defines DIR... " >&6; } +if eval test \${$as_ac_Header+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main (void) +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_ac_Header=yes" +else $as_nop + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Header"\" = x"yes" +then : + cat >>confdefs.h <<_ACEOF +#define `printf "%s\n" "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +printf %s "checking for library containing opendir... " >&6; } +if test ${ac_cv_search_opendir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main (void) +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_opendir+y} +then : + break +fi +done +if test ${ac_cv_search_opendir+y} +then : + +else $as_nop + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +printf "%s\n" "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +printf %s "checking for library containing opendir... " >&6; } +if test ${ac_cv_search_opendir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main (void) +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_opendir+y} +then : + break +fi +done +if test ${ac_cv_search_opendir+y} +then : + +else $as_nop + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +printf "%s\n" "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + + +ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl" +if test "x$ac_cv_func_fcntl" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes +then : + printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "kill" "ac_cv_func_kill" +if test "x$ac_cv_func_kill" = xyes +then : + printf "%s\n" "#define HAVE_KILL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" +if test "x$ac_cv_func_lstat" = xyes +then : + printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "pselect" "ac_cv_func_pselect" +if test "x$ac_cv_func_pselect" = xyes +then : + printf "%s\n" "#define HAVE_PSELECT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "readlink" "ac_cv_func_readlink" +if test "x$ac_cv_func_readlink" = xyes +then : + printf "%s\n" "#define HAVE_READLINK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" +if test "x$ac_cv_func_select" = xyes +then : + printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer" +if test "x$ac_cv_func_setitimer" = xyes +then : + printf "%s\n" "#define HAVE_SETITIMER 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "fnmatch" "ac_cv_func_fnmatch" +if test "x$ac_cv_func_fnmatch" = xyes +then : + printf "%s\n" "#define HAVE_FNMATCH 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" +if test "x$ac_cv_func_memmove" = xyes +then : + printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" +if test "x$ac_cv_func_putenv" = xyes +then : + printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" +if test "x$ac_cv_func_setenv" = xyes +then : + printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = xyes +then : + printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" +if test "x$ac_cv_func_strcasecmp" = xyes +then : + printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strpbrk" "ac_cv_func_strpbrk" +if test "x$ac_cv_func_strpbrk" = xyes +then : + printf "%s\n" "#define HAVE_STRPBRK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" +if test "x$ac_cv_func_sysconf" = xyes +then : + printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "tcgetattr" "ac_cv_func_tcgetattr" +if test "x$ac_cv_func_tcgetattr" = xyes +then : + printf "%s\n" "#define HAVE_TCGETATTR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +if test "x$ac_cv_func_vsnprintf" = xyes +then : + printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "isascii" "ac_cv_func_isascii" +if test "x$ac_cv_func_isascii" = xyes +then : + printf "%s\n" "#define HAVE_ISASCII 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "isxdigit" "ac_cv_func_isxdigit" +if test "x$ac_cv_func_isxdigit" = xyes +then : + printf "%s\n" "#define HAVE_ISXDIGIT 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "getpwent" "ac_cv_func_getpwent" +if test "x$ac_cv_func_getpwent" = xyes +then : + printf "%s\n" "#define HAVE_GETPWENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpwnam" "ac_cv_func_getpwnam" +if test "x$ac_cv_func_getpwnam" = xyes +then : + printf "%s\n" "#define HAVE_GETPWNAM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpwuid" "ac_cv_func_getpwuid" +if test "x$ac_cv_func_getpwuid" = xyes +then : + printf "%s\n" "#define HAVE_GETPWUID 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 +printf %s "checking for uid_t in sys/types.h... " >&6; } +if test ${ac_cv_type_uid_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1 +then : + ac_cv_type_uid_t=yes +else $as_nop + ac_cv_type_uid_t=no +fi +rm -rf conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 +printf "%s\n" "$ac_cv_type_uid_t" >&6; } +if test $ac_cv_type_uid_t = no; then + +printf "%s\n" "#define uid_t int" >>confdefs.h + + +printf "%s\n" "#define gid_t int" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working chown" >&5 +printf %s "checking for working chown... " >&6; } +if test ${ac_cv_func_chown_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on glibc systems. + *-gnu*) ac_cv_func_chown_works=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_chown_works=no ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#include + +int +main (void) +{ + char *f = "conftest.chown"; + struct stat before, after; + + if (creat (f, 0600) < 0) + return 1; + if (stat (f, &before) < 0) + return 1; + if (chown (f, (uid_t) -1, (gid_t) -1) == -1) + return 1; + if (stat (f, &after) < 0) + return 1; + return ! (before.st_uid == after.st_uid && before.st_gid == after.st_gid); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_chown_works=yes +else $as_nop + ac_cv_func_chown_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +rm -f conftest.chown + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_chown_works" >&5 +printf "%s\n" "$ac_cv_func_chown_works" >&6; } +if test $ac_cv_func_chown_works = yes; then + +printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strcoll" >&5 +printf %s "checking for working strcoll... " >&6; } +if test ${ac_cv_func_strcoll_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on glibc systems. + *-gnu*) ac_cv_func_strcoll_works=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_strcoll_works=no ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ +return (strcoll ("abc", "def") >= 0 || + strcoll ("ABC", "DEF") >= 0 || + strcoll ("123", "456") >= 0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_strcoll_works=yes +else $as_nop + ac_cv_func_strcoll_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strcoll_works" >&5 +printf "%s\n" "$ac_cv_func_strcoll_works" >&6; } +if test $ac_cv_func_strcoll_works = yes; then + +printf "%s\n" "#define HAVE_STRCOLL 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes +then : + printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "varargs.h" "ac_cv_header_varargs_h" "$ac_includes_default" +if test "x$ac_cv_header_varargs_h" = xyes +then : + printf "%s\n" "#define HAVE_VARARGS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "stdarg.h" "ac_cv_header_stdarg_h" "$ac_includes_default" +if test "x$ac_cv_header_stdarg_h" = xyes +then : + printf "%s\n" "#define HAVE_STDARG_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" "$ac_includes_default" +if test "x$ac_cv_header_stdbool_h" = xyes +then : + printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes +then : + printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = xyes +then : + printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes +then : + printf "%s\n" "#define HAVE_LOCALE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pwd.h" "ac_cv_header_pwd_h" "$ac_includes_default" +if test "x$ac_cv_header_pwd_h" = xyes +then : + printf "%s\n" "#define HAVE_PWD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "memory.h" "ac_cv_header_memory_h" "$ac_includes_default" +if test "x$ac_cv_header_memory_h" = xyes +then : + printf "%s\n" "#define HAVE_MEMORY_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "termcap.h" "ac_cv_header_termcap_h" "$ac_includes_default" +if test "x$ac_cv_header_termcap_h" = xyes +then : + printf "%s\n" "#define HAVE_TERMCAP_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" +if test "x$ac_cv_header_termios_h" = xyes +then : + printf "%s\n" "#define HAVE_TERMIOS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "termio.h" "ac_cv_header_termio_h" "$ac_includes_default" +if test "x$ac_cv_header_termio_h" = xyes +then : + printf "%s\n" "#define HAVE_TERMIO_H 1" >>confdefs.h + +fi + +ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/pte.h" "ac_cv_header_sys_pte_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_pte_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PTE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stream.h" "ac_cv_header_sys_stream_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stream_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STREAM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/file.h" "ac_cv_header_sys_file_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_file_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_FILE_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_compile "$LINENO" "sys/ptem.h" "ac_cv_header_sys_ptem_h" " +#if HAVE_SYS_STREAM_H +# include +#endif + +" +if test "x$ac_cv_header_sys_ptem_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PTEM_H 1" >>confdefs.h + +fi + + +# Check whether --enable-largefile was given. +if test ${enable_largefile+y} +then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h +;; +esac +rm -rf conftest* + fi +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for type of signal functions" >&5 +printf %s "checking for type of signal functions... " >&6; } +if test ${bash_cv_signal_vintage+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if test ${bash_cv_posix_signals+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main (void) +{ + + sigset_t ss; + struct sigaction sa; + sigemptyset(&ss); sigsuspend(&ss); + sigaction(SIGINT, &sa, (struct sigaction *) 0); + sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + bash_cv_posix_signals=yes +else $as_nop + bash_cv_posix_signals=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi + + +if test $bash_cv_posix_signals = yes; then + bash_cv_signal_vintage=posix +else + if test ${bash_cv_bsd_signals+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main (void) +{ + +int mask = sigmask(SIGINT); +sigsetmask(mask); sigblock(mask); sigpause(mask); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + bash_cv_bsd_signals=yes +else $as_nop + bash_cv_bsd_signals=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi + + + if test $bash_cv_bsd_signals = yes; then + bash_cv_signal_vintage=4.2bsd + else + if test ${bash_cv_sysv_signals+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +void foo() { } + +int +main (void) +{ + +int mask = sigmask(SIGINT); +sigset(SIGINT, foo); sigrelse(SIGINT); +sighold(SIGINT); sigpause(SIGINT); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + bash_cv_sysv_signals=yes +else $as_nop + bash_cv_sysv_signals=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi + + + if test $bash_cv_sysv_signals = yes; then + bash_cv_signal_vintage=svr3 + else + bash_cv_signal_vintage=v7 + fi + fi +fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_signal_vintage" >&5 +printf "%s\n" "$bash_cv_signal_vintage" >&6; } +if test "$bash_cv_signal_vintage" = posix; then +printf "%s\n" "#define HAVE_POSIX_SIGNALS 1" >>confdefs.h + +elif test "$bash_cv_signal_vintage" = "4.2bsd"; then +printf "%s\n" "#define HAVE_BSD_SIGNALS 1" >>confdefs.h + +elif test "$bash_cv_signal_vintage" = svr3; then +printf "%s\n" "#define HAVE_USG_SIGHOLD 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if signal handlers must be reinstalled when invoked" >&5 +printf %s "checking if signal handlers must be reinstalled when invoked... " >&6; } +if test ${bash_cv_must_reinstall_sighandlers+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&5 +printf "%s\n" "$as_me: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&2;} + bash_cv_must_reinstall_sighandlers=no + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +typedef void sigfunc(); + +volatile 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 + +void +sigint(s) +int s; +{ + nsigint++; +} + +int +main() +{ + nsigint = 0; + set_signal_handler(SIGINT, sigint); + kill((int)getpid(), SIGINT); + kill((int)getpid(), SIGINT); + exit(nsigint != 2); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + bash_cv_must_reinstall_sighandlers=no +else $as_nop + bash_cv_must_reinstall_sighandlers=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_must_reinstall_sighandlers" >&5 +printf "%s\n" "$bash_cv_must_reinstall_sighandlers" >&6; } +if test $bash_cv_must_reinstall_sighandlers = yes; then +printf "%s\n" "#define MUST_REINSTALL_SIGHANDLERS 1" >>confdefs.h + +fi + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5 +printf %s "checking for presence of POSIX-style sigsetjmp/siglongjmp... " >&6; } +if test ${bash_cv_func_sigsetjmp+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals" >&5 +printf "%s\n" "$as_me: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals" >&2;} + if test "$bash_cv_posix_signals" = "yes" ; then + bash_cv_func_sigsetjmp=present + else + bash_cv_func_sigsetjmp=missing + fi + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include + +int +main() +{ +#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS) +exit (1); +#else + +int code; +sigset_t set, oset, nset; +sigjmp_buf xx; + +/* get the mask */ +sigemptyset(&set); +sigemptyset(&oset); + +sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset); +/* paranoia -- make sure SIGINT is not blocked */ +sigdelset (&oset, SIGINT); +sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); + +/* save it */ +code = sigsetjmp(xx, 1); +if (code) +{ + sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &nset); + /* could compare nset to oset here, but we just look for SIGINT */ + if (sigismember (&nset, SIGINT)) + exit(1); + exit(0); +} + +/* change it so that SIGINT is blocked */ +sigaddset(&set, SIGINT); +sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL); + +/* and siglongjmp */ +siglongjmp(xx, 10); +exit(1); +#endif +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + bash_cv_func_sigsetjmp=present +else $as_nop + bash_cv_func_sigsetjmp=missing +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_sigsetjmp" >&5 +printf "%s\n" "$bash_cv_func_sigsetjmp" >&6; } +if test $bash_cv_func_sigsetjmp = present; then +printf "%s\n" "#define HAVE_POSIX_SIGSETJMP 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lstat" >&5 +printf %s "checking for lstat... " >&6; } +if test ${bash_cv_func_lstat+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + +int +main (void) +{ + lstat(".",(struct stat *)0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + bash_cv_func_lstat=yes +else $as_nop + bash_cv_func_lstat=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_lstat" >&5 +printf "%s\n" "$bash_cv_func_lstat" >&6; } +if test $bash_cv_func_lstat = yes; then + printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether or not strcoll and strcmp differ" >&5 +printf %s "checking whether or not strcoll and strcmp differ... " >&6; } +if test ${bash_cv_func_strcoll_broken+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&5 +printf "%s\n" "$as_me: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&2;} + bash_cv_func_strcoll_broken=no + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if defined (HAVE_LOCALE_H) +#include +#endif +#include +#include + +int +main(c, v) +int c; +char *v[]; +{ + int r1, r2; + char *deflocale, *defcoll; + +#ifdef HAVE_SETLOCALE + deflocale = setlocale(LC_ALL, ""); + defcoll = setlocale(LC_COLLATE, ""); +#endif + +#ifdef HAVE_STRCOLL + /* These two values are taken from tests/glob-test. */ + r1 = strcoll("abd", "aXd"); +#else + r1 = 0; +#endif + r2 = strcmp("abd", "aXd"); + + /* These two should both be greater than 0. It is permissible for + a system to return different values, as long as the sign is the + same. */ + + /* Exit with 1 (failure) if these two values are both > 0, since + this tests whether strcoll(3) is broken with respect to strcmp(3) + in the default locale. */ + exit (r1 > 0 && r2 > 0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + bash_cv_func_strcoll_broken=yes +else $as_nop + bash_cv_func_strcoll_broken=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_strcoll_broken" >&5 +printf "%s\n" "$bash_cv_func_strcoll_broken" >&6; } +if test $bash_cv_func_strcoll_broken = yes; then +printf "%s\n" "#define STRCOLL_BROKEN 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getpw functions are declared in pwd.h" >&5 +printf %s "checking whether getpw functions are declared in pwd.h... " >&6; } +if test ${bash_cv_getpw_declared+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "getpwuid" >/dev/null 2>&1 +then : + bash_cv_getpw_declared=yes +else $as_nop + bash_cv_getpw_declared=no +fi +rm -rf conftest* + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_getpw_declared" >&5 +printf "%s\n" "$bash_cv_getpw_declared" >&6; } +if test $bash_cv_getpw_declared = yes; then +printf "%s\n" "#define HAVE_GETPW_DECLS 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5 +printf %s "checking whether termios.h defines TIOCGWINSZ... " >&6; } +if test ${ac_cv_sys_tiocgwinsz_in_termios_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#ifdef TIOCGWINSZ + yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + ac_cv_sys_tiocgwinsz_in_termios_h=yes +else $as_nop + ac_cv_sys_tiocgwinsz_in_termios_h=no +fi +rm -rf conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5 +printf "%s\n" "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; } + +if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5 +printf %s "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; } +if test ${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#ifdef TIOCGWINSZ + yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes +else $as_nop + ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no +fi +rm -rf conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5 +printf "%s\n" "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; } + + if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then + +printf "%s\n" "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h + + fi +fi + + + + ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" +if test "x$ac_cv_header_inttypes_h" = xyes +then : + printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t in signal.h" >&5 +printf %s "checking for sig_atomic_t in signal.h... " >&6; } +if test ${ac_cv_have_sig_atomic_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + sig_atomic_t x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_have_sig_atomic_t=yes +else $as_nop + ac_cv_have_sig_atomic_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sig_atomic_t" >&5 +printf "%s\n" "$ac_cv_have_sig_atomic_t" >&6; } +if test "$ac_cv_have_sig_atomic_t" = "no" +then + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t" >&5 +printf %s "checking for sig_atomic_t... " >&6; } +if test ${bash_cv_type_sig_atomic_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#if HAVE_STDLIB_H +#include +#endif +#if HAVE_STDDEF_H +#include +#endif +#if HAVE_INTTYPES_H +#include +#endif +#if HAVE_STDINT_H +#include +#endif +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "sig_atomic_t" >/dev/null 2>&1 +then : + bash_cv_type_sig_atomic_t=yes +else $as_nop + bash_cv_type_sig_atomic_t=no +fi +rm -rf conftest* + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_sig_atomic_t" >&5 +printf "%s\n" "$bash_cv_type_sig_atomic_t" >&6; } + +if test $bash_cv_type_sig_atomic_t = no; then + printf "%s\n" "#define sig_atomic_t int" >>confdefs.h + +fi + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIOCSTAT in sys/ioctl.h" >&5 +printf %s "checking for TIOCSTAT in sys/ioctl.h... " >&6; } +if test ${bash_cv_tiocstat_in_ioctl+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int +main (void) +{ +int x = TIOCSTAT; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_tiocstat_in_ioctl=yes +else $as_nop + bash_cv_tiocstat_in_ioctl=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_tiocstat_in_ioctl" >&5 +printf "%s\n" "$bash_cv_tiocstat_in_ioctl" >&6; } +if test $bash_cv_tiocstat_in_ioctl = yes; then +printf "%s\n" "#define TIOCSTAT_IN_SYS_IOCTL 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/ioctl.h" >&5 +printf %s "checking for FIONREAD in sys/ioctl.h... " >&6; } +if test ${bash_cv_fionread_in_ioctl+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int +main (void) +{ +int x = FIONREAD; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_fionread_in_ioctl=yes +else $as_nop + bash_cv_fionread_in_ioctl=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_fionread_in_ioctl" >&5 +printf "%s\n" "$bash_cv_fionread_in_ioctl" >&6; } +if test $bash_cv_fionread_in_ioctl = yes; then +printf "%s\n" "#define FIONREAD_IN_SYS_IOCTL 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for speed_t in sys/types.h" >&5 +printf %s "checking for speed_t in sys/types.h... " >&6; } +if test ${bash_cv_speed_t_in_sys_types+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +speed_t x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_speed_t_in_sys_types=yes +else $as_nop + bash_cv_speed_t_in_sys_types=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_speed_t_in_sys_types" >&5 +printf "%s\n" "$bash_cv_speed_t_in_sys_types" >&6; } +if test $bash_cv_speed_t_in_sys_types = yes; then +printf "%s\n" "#define SPEED_T_IN_SYS_TYPES 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct winsize in sys/ioctl.h and termios.h" >&5 +printf %s "checking for struct winsize in sys/ioctl.h and termios.h... " >&6; } +if test ${bash_cv_struct_winsize_header+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if test ${bash_cv_struct_winsize_ioctl+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + +struct winsize x; +if (sizeof (x) > 0) return (0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_struct_winsize_ioctl=yes +else $as_nop + bash_cv_struct_winsize_ioctl=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi + + +if test ${bash_cv_struct_winsize_termios+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + +struct winsize x; +if (sizeof (x) > 0) return (0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_struct_winsize_termios=yes +else $as_nop + bash_cv_struct_winsize_termios=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi + + + +if test $bash_cv_struct_winsize_ioctl = yes; then + bash_cv_struct_winsize_header=ioctl_h +elif test $bash_cv_struct_winsize_termios = yes; then + bash_cv_struct_winsize_header=termios_h +else + bash_cv_struct_winsize_header=other +fi + +fi + +if test $bash_cv_struct_winsize_header = ioctl_h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: sys/ioctl.h" >&5 +printf "%s\n" "sys/ioctl.h" >&6; } + printf "%s\n" "#define STRUCT_WINSIZE_IN_SYS_IOCTL 1" >>confdefs.h + +elif test $bash_cv_struct_winsize_header = termios_h; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: termios.h" >&5 +printf "%s\n" "termios.h" >&6; } + printf "%s\n" "#define STRUCT_WINSIZE_IN_TERMIOS 1" >>confdefs.h + +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_ino" >&5 +printf %s "checking for struct dirent.d_ino... " >&6; } +if test ${bash_cv_dirent_has_d_ino+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + +ac_fn_c_check_member "$LINENO" "struct dirent" "d_ino" "ac_cv_member_struct_dirent_d_ino" " +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ +#if defined(HAVE_DIRENT_H) +# include +#else +# define dirent direct +# ifdef HAVE_SYS_NDIR_H +# include +# endif /* SYSNDIR */ +# ifdef HAVE_SYS_DIR_H +# include +# endif /* SYSDIR */ +# ifdef HAVE_NDIR_H +# include +# endif +#endif /* HAVE_DIRENT_H */ + +" +if test "x$ac_cv_member_struct_dirent_d_ino" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_INO 1" >>confdefs.h + +bash_cv_dirent_has_d_ino=yes +else $as_nop + bash_cv_dirent_has_d_ino=no +fi + + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_dirent_has_d_ino" >&5 +printf "%s\n" "$bash_cv_dirent_has_d_ino" >&6; } +if test $bash_cv_dirent_has_d_ino = yes; then +printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_INO 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_fileno" >&5 +printf %s "checking for struct dirent.d_fileno... " >&6; } +if test ${bash_cv_dirent_has_d_fileno+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + +ac_fn_c_check_member "$LINENO" "struct dirent" "d_fileno" "ac_cv_member_struct_dirent_d_fileno" " +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ +#if defined(HAVE_DIRENT_H) +# include +#else +# define dirent direct +# ifdef HAVE_SYS_NDIR_H +# include +# endif /* SYSNDIR */ +# ifdef HAVE_SYS_DIR_H +# include +# endif /* SYSDIR */ +# ifdef HAVE_NDIR_H +# include +# endif +#endif /* HAVE_DIRENT_H */ + +" +if test "x$ac_cv_member_struct_dirent_d_fileno" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_FILENO 1" >>confdefs.h + +bash_cv_dirent_has_d_fileno=yes +else $as_nop + bash_cv_dirent_has_d_fileno=no +fi + + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_dirent_has_d_fileno" >&5 +printf "%s\n" "$bash_cv_dirent_has_d_fileno" >&6; } +if test $bash_cv_dirent_has_d_fileno = yes; then +printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_FILENO 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timeval in sys/time.h and time.h" >&5 +printf %s "checking for struct timeval in sys/time.h and time.h... " >&6; } +if test ${bash_cv_struct_timeval+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if HAVE_SYS_TIME_H + #include + #endif + #include + +int +main (void) +{ +static struct timeval x; x.tv_sec = x.tv_usec; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_struct_timeval=yes +else $as_nop + bash_cv_struct_timeval=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_struct_timeval" >&5 +printf "%s\n" "$bash_cv_struct_timeval" >&6; } +if test $bash_cv_struct_timeval = yes; then + printf "%s\n" "#define HAVE_TIMEVAL 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_compile "$LINENO" "libaudit.h" "ac_cv_header_libaudit_h" "$ac_includes_default" +if test "x$ac_cv_header_libaudit_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBAUDIT_H 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg +fi + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + +ac_fn_check_decl "$LINENO" "AUDIT_USER_TTY" "ac_cv_have_decl_AUDIT_USER_TTY" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_AUDIT_USER_TTY" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_AUDIT_USER_TTY $ac_have_decl" >>confdefs.h + + +case "$host_os" in +aix*) prefer_curses=yes ;; +esac + +if test "X$bash_cv_termcap_lib" = "X"; then +_bash_needmsg=yes +else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which library has the termcap functions" >&5 +printf %s "checking which library has the termcap functions... " >&6; } +_bash_needmsg= +fi +if test ${bash_cv_termcap_lib+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_fn_c_check_func "$LINENO" "tgetent" "ac_cv_func_tgetent" +if test "x$ac_cv_func_tgetent" = xyes +then : + bash_cv_termcap_lib=libc +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5 +printf %s "checking for tgetent in -ltermcap... " >&6; } +if test ${ac_cv_lib_termcap_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltermcap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char tgetent (); +int +main (void) +{ +return tgetent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_termcap_tgetent=yes +else $as_nop + ac_cv_lib_termcap_tgetent=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5 +printf "%s\n" "$ac_cv_lib_termcap_tgetent" >&6; } +if test "x$ac_cv_lib_termcap_tgetent" = xyes +then : + bash_cv_termcap_lib=libtermcap +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5 +printf %s "checking for tgetent in -ltinfo... " >&6; } +if test ${ac_cv_lib_tinfo_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltinfo $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char tgetent (); +int +main (void) +{ +return tgetent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_tinfo_tgetent=yes +else $as_nop + ac_cv_lib_tinfo_tgetent=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tinfo_tgetent" >&5 +printf "%s\n" "$ac_cv_lib_tinfo_tgetent" >&6; } +if test "x$ac_cv_lib_tinfo_tgetent" = xyes +then : + bash_cv_termcap_lib=libtinfo +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lcurses" >&5 +printf %s "checking for tgetent in -lcurses... " >&6; } +if test ${ac_cv_lib_curses_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char tgetent (); +int +main (void) +{ +return tgetent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_curses_tgetent=yes +else $as_nop + ac_cv_lib_curses_tgetent=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tgetent" >&5 +printf "%s\n" "$ac_cv_lib_curses_tgetent" >&6; } +if test "x$ac_cv_lib_curses_tgetent" = xyes +then : + bash_cv_termcap_lib=libcurses +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncurses" >&5 +printf %s "checking for tgetent in -lncurses... " >&6; } +if test ${ac_cv_lib_ncurses_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char tgetent (); +int +main (void) +{ +return tgetent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_ncurses_tgetent=yes +else $as_nop + ac_cv_lib_ncurses_tgetent=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tgetent" >&5 +printf "%s\n" "$ac_cv_lib_ncurses_tgetent" >&6; } +if test "x$ac_cv_lib_ncurses_tgetent" = xyes +then : + bash_cv_termcap_lib=libncurses +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncursesw" >&5 +printf %s "checking for tgetent in -lncursesw... " >&6; } +if test ${ac_cv_lib_ncursesw_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncursesw $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char tgetent (); +int +main (void) +{ +return tgetent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_ncursesw_tgetent=yes +else $as_nop + ac_cv_lib_ncursesw_tgetent=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_tgetent" >&5 +printf "%s\n" "$ac_cv_lib_ncursesw_tgetent" >&6; } +if test "x$ac_cv_lib_ncursesw_tgetent" = xyes +then : + bash_cv_termcap_lib=libncursesw +else $as_nop + bash_cv_termcap_lib=gnutermcap +fi + +fi + +fi + +fi + +fi + +fi + +fi + +if test "X$_bash_needmsg" = "Xyes"; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which library has the termcap functions" >&5 +printf %s "checking which library has the termcap functions... " >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using $bash_cv_termcap_lib" >&5 +printf "%s\n" "using $bash_cv_termcap_lib" >&6; } +if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then +LDFLAGS="$LDFLAGS -L./lib/termcap" +TERMCAP_LIB="./lib/termcap/libtermcap.a" +TERMCAP_DEP="./lib/termcap/libtermcap.a" +elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then +TERMCAP_LIB=-ltermcap +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libtinfo; then +TERMCAP_LIB=-ltinfo +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libncurses; then +TERMCAP_LIB=-lncurses +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libc; then +TERMCAP_LIB= +TERMCAP_DEP= +else +# we assume ncurses is installed somewhere the linker can find it +TERMCAP_LIB=-lncurses +TERMCAP_DEP= +fi + +if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then + if test "$prefer_curses" = yes; then + TERMCAP_LIB=-lcurses + else + TERMCAP_LIB=-ltermcap #default + fi +fi +# Windows ncurses installation +if test "$TERMCAP_LIB" = "-lncurses"; then + ac_fn_c_check_header_compile "$LINENO" "ncurses/termcap.h" "ac_cv_header_ncurses_termcap_h" "$ac_includes_default" +if test "x$ac_cv_header_ncurses_termcap_h" = xyes +then : + printf "%s\n" "#define HAVE_NCURSES_TERMCAP_H 1" >>confdefs.h + +fi + +fi +case "$opt_shared_termcap_lib" in +[Yy][Ee][Ss]) SHARED_TERMCAP="$TERMCAP_LIB" ;; +-l*) SHARED_TERMCAP="$opt_shared_termcap_lib" ;; +esac + +case "$TERMCAP_LIB" in +-ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;; +-lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; +-lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; +-ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;; +*) TERMCAP_PKG_CONFIG_LIB=termcap ;; +esac + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 +printf %s "checking for nl_langinfo and CODESET... " >&6; } +if test ${am_cv_langinfo_codeset+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +char* cs = nl_langinfo(CODESET); return !cs; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + am_cv_langinfo_codeset=yes +else $as_nop + am_cv_langinfo_codeset=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 +printf "%s\n" "$am_cv_langinfo_codeset" >&6; } + if test $am_cv_langinfo_codeset = yes; then + +printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h + + fi + + +ac_fn_c_check_header_compile "$LINENO" "wctype.h" "ac_cv_header_wctype_h" "$ac_includes_default" +if test "x$ac_cv_header_wctype_h" = xyes +then : + printf "%s\n" "#define HAVE_WCTYPE_H 1" >>confdefs.h + +fi + +ac_fn_c_check_header_compile "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" +if test "x$ac_cv_header_wchar_h" = xyes +then : + printf "%s\n" "#define HAVE_WCHAR_H 1" >>confdefs.h + +fi + +ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" +if test "x$ac_cv_header_langinfo_h" = xyes +then : + printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_compile "$LINENO" "mbstr.h" "ac_cv_header_mbstr_h" "$ac_includes_default" +if test "x$ac_cv_header_mbstr_h" = xyes +then : + printf "%s\n" "#define HAVE_MBSTR_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_func "$LINENO" "mbrlen" "ac_cv_func_mbrlen" +if test "x$ac_cv_func_mbrlen" = xyes +then : + printf "%s\n" "#define HAVE_MBRLEN 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "mbscasecmp" "ac_cv_func_mbscasecmp" +if test "x$ac_cv_func_mbscasecmp" = xyes +then : + printf "%s\n" "#define HAVE_MBSCMP 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "mbscmp" "ac_cv_func_mbscmp" +if test "x$ac_cv_func_mbscmp" = xyes +then : + printf "%s\n" "#define HAVE_MBSCMP 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "mbsnrtowcs" "ac_cv_func_mbsnrtowcs" +if test "x$ac_cv_func_mbsnrtowcs" = xyes +then : + printf "%s\n" "#define HAVE_MBSNRTOWCS 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "mbsrtowcs" "ac_cv_func_mbsrtowcs" +if test "x$ac_cv_func_mbsrtowcs" = xyes +then : + printf "%s\n" "#define HAVE_MBSRTOWCS 1" >>confdefs.h + +fi + + +ac_fn_c_check_func "$LINENO" "mbschr" "ac_cv_func_mbschr" +if test "x$ac_cv_func_mbschr" = xyes +then : + printf "%s\n" "#define HAVE_MBSCHR 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" mbschr.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS mbschr.$ac_objext" + ;; +esac + +fi + + +ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb" +if test "x$ac_cv_func_wcrtomb" = xyes +then : + printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "wcscoll" "ac_cv_func_wcscoll" +if test "x$ac_cv_func_wcscoll" = xyes +then : + printf "%s\n" "#define HAVE_WCSCOLL 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "wcsdup" "ac_cv_func_wcsdup" +if test "x$ac_cv_func_wcsdup" = xyes +then : + printf "%s\n" "#define HAVE_WCSDUP 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "wcwidth" "ac_cv_func_wcwidth" +if test "x$ac_cv_func_wcwidth" = xyes +then : + printf "%s\n" "#define HAVE_WCWIDTH 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "wctype" "ac_cv_func_wctype" +if test "x$ac_cv_func_wctype" = xyes +then : + printf "%s\n" "#define HAVE_WCTYPE 1" >>confdefs.h + +fi + + +ac_fn_c_check_func "$LINENO" "wcswidth" "ac_cv_func_wcswidth" +if test "x$ac_cv_func_wcswidth" = xyes +then : + printf "%s\n" "#define HAVE_WCSWIDTH 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" wcswidth.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS wcswidth.$ac_objext" + ;; +esac + +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc and mbstate_t are properly declared" >&5 +printf %s "checking whether mbrtowc and mbstate_t are properly declared... " >&6; } +if test ${ac_cv_func_mbrtowc+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +wchar_t wc; + char const s[] = ""; + size_t n = 1; + mbstate_t state; + return ! (sizeof state && (mbrtowc) (&wc, s, n, &state)); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_func_mbrtowc=yes +else $as_nop + ac_cv_func_mbrtowc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mbrtowc" >&5 +printf "%s\n" "$ac_cv_func_mbrtowc" >&6; } + if test $ac_cv_func_mbrtowc = yes; then + +printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h + + fi + +if test $ac_cv_func_mbrtowc = yes; then + printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "iswlower" "ac_cv_func_iswlower" +if test "x$ac_cv_func_iswlower" = xyes +then : + printf "%s\n" "#define HAVE_ISWLOWER 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "iswupper" "ac_cv_func_iswupper" +if test "x$ac_cv_func_iswupper" = xyes +then : + printf "%s\n" "#define HAVE_ISWUPPER 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower" +if test "x$ac_cv_func_towlower" = xyes +then : + printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "towupper" "ac_cv_func_towupper" +if test "x$ac_cv_func_towupper" = xyes +then : + printf "%s\n" "#define HAVE_TOWUPPER 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "iswctype" "ac_cv_func_iswctype" +if test "x$ac_cv_func_iswctype" = xyes +then : + printf "%s\n" "#define HAVE_ISWCTYPE 1" >>confdefs.h + +fi + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t in wchar.h" >&5 +printf %s "checking for wchar_t in wchar.h... " >&6; } +if test ${bash_cv_type_wchar_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int +main (void) +{ + + wchar_t foo; + foo = 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_type_wchar_t=yes +else $as_nop + bash_cv_type_wchar_t=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wchar_t" >&5 +printf "%s\n" "$bash_cv_type_wchar_t" >&6; } +if test $bash_cv_type_wchar_t = yes; then + +printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t in wctype.h" >&5 +printf %s "checking for wctype_t in wctype.h... " >&6; } +if test ${bash_cv_type_wctype_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int +main (void) +{ + + wctype_t foo; + foo = 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_type_wctype_t=yes +else $as_nop + bash_cv_type_wctype_t=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wctype_t" >&5 +printf "%s\n" "$bash_cv_type_wctype_t" >&6; } +if test $bash_cv_type_wctype_t = yes; then + +printf "%s\n" "#define HAVE_WCTYPE_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t in wctype.h" >&5 +printf %s "checking for wint_t in wctype.h... " >&6; } +if test ${bash_cv_type_wint_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int +main (void) +{ + + wint_t foo; + foo = 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + bash_cv_type_wint_t=yes +else $as_nop + bash_cv_type_wint_t=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wint_t" >&5 +printf "%s\n" "$bash_cv_type_wint_t" >&6; } +if test $bash_cv_type_wint_t = yes; then + +printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wcwidth broken with unicode combining characters" >&5 +printf %s "checking for wcwidth broken with unicode combining characters... " >&6; } +if test ${bash_cv_wcwidth_broken+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + bash_cv_wcwidth_broken=no + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +#include +#include + +int +main(c, v) +int c; +char **v; +{ + int w; + + setlocale(LC_ALL, "en_US.UTF-8"); + w = wcwidth (0x0301); + exit (w == 0); /* exit 0 if wcwidth broken */ +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + bash_cv_wcwidth_broken=yes +else $as_nop + bash_cv_wcwidth_broken=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_wcwidth_broken" >&5 +printf "%s\n" "$bash_cv_wcwidth_broken" >&6; } +if test "$bash_cv_wcwidth_broken" = yes; then + +printf "%s\n" "#define WCWIDTH_BROKEN 1" >>confdefs.h + +fi + +if test "$am_cv_func_iconv" = yes; then + OLDLIBS="$LIBS" + LIBS="$LIBS $LIBINTL $LIBICONV" + ac_fn_c_check_func "$LINENO" "locale_charset" "ac_cv_func_locale_charset" +if test "x$ac_cv_func_locale_charset" = xyes +then : + printf "%s\n" "#define HAVE_LOCALE_CHARSET 1" >>confdefs.h + +fi + + LIBS="$OLDLIBS" +fi + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5 +printf %s "checking size of wchar_t... " >&6; } +if test ${ac_cv_sizeof_wchar_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "$ac_includes_default" +then : + +else $as_nop + if test "$ac_cv_type_wchar_t" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (wchar_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_wchar_t=0 + fi +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_wchar_t" >&5 +printf "%s\n" "$ac_cv_sizeof_wchar_t" >&6; } + + + +printf "%s\n" "#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t" >>confdefs.h + + + + + +case "$host_cpu" in +*cray*) LOCAL_CFLAGS=-DCRAY ;; +*s390*) LOCAL_CFLAGS=-fsigned-char ;; +esac + +case "$host_os" in +isc*) LOCAL_CFLAGS=-Disc386 ;; +hpux*) LOCAL_CFLAGS="-DTGETENT_BROKEN -DTGETFLAG_BROKEN" ;; +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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking configuration for building shared libraries" >&5 +printf %s "checking configuration for building shared libraries... " >&6; } + eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}` + + # SHARED_TERMCAP is set only if opt_shared_termcap_library is set + case "$SHLIB_LIBS" in + *curses*|*tinfo*) ;; + *termcap*|*termlib*) ;; # common aliases + *) SHLIB_LIBS="$SHLIB_LIBS $SHARED_TERMCAP" ;; + esac + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SHLIB_STATUS" >&5 +printf "%s\n" "$SHLIB_STATUS" >&6; } + + # SHLIB_STATUS is either `supported' or `unsupported'. If it's + # `unsupported', turn off any default shared library building + if test "$SHLIB_STATUS" = 'unsupported'; then + opt_shared_libs=no + fi + + # shared library versioning + # quoted for m4 so I can use character classes + SHLIB_MAJOR=`expr "$LIBVERSION" : '\([0-9]\)\..*'` + SHLIB_MINOR=`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'` + + +fi + +if test "$opt_static_libs" = "yes"; then + STATIC_TARGET=static + STATIC_INSTALL_TARGET=install-static +fi +if test "$opt_shared_libs" = "yes"; then + SHARED_TARGET=shared + SHARED_INSTALL_TARGET=install-shared +fi + + + + + + +if test "$opt_install_examples" = "yes"; then + EXAMPLES_INSTALL_TARGET=install-examples +fi + + +case "$build_os" in +msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file +*) BUILD_DIR=`pwd` ;; +esac + +case "$BUILD_DIR" in +*\ *) BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;; +*) ;; +esac + + + +# CFLAGS=${CFLAGS-"$AUTO_CFLAGS"} +if test -n "$want_auto_cflags"; then + CFLAGS="$AUTO_CFLAGS" +fi +CFLAGS="$CFLAGS $STYLE_CFLAGS" + + + + + + + + + + + + + + + + + +ac_config_files="$ac_config_files Makefile doc/Makefile examples/Makefile shlib/Makefile readline.pc history.pc" + + +ac_config_commands="$ac_config_commands stamp-h" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# 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. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by readline $as_me 8.2, which was +generated by GNU Autoconf 2.71. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +readline config.status 8.2 +configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2021 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; + "shlib/Makefile") CONFIG_FILES="$CONFIG_FILES shlib/Makefile" ;; + "readline.pc") CONFIG_FILES="$CONFIG_FILES readline.pc" ;; + "history.pc") CONFIG_FILES="$CONFIG_FILES history.pc" ;; + "stamp-h") CONFIG_COMMANDS="$CONFIG_COMMANDS stamp-h" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #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. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "stamp-h":C) echo > stamp-h ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..15501fa --- /dev/null +++ b/configure.ac @@ -0,0 +1,345 @@ +dnl +dnl Configure script for readline library +dnl +dnl report bugs to chet@po.cwru.edu +dnl +dnl Process this file with autoconf to produce a configure script. + +# Copyright (C) 1987-2022 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 3 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, see . + +AC_REVISION([for Readline 8.2, version 2.97]) + +AC_INIT(readline, 8.2, bug-readline@gnu.org) + +dnl make sure we are using a recent autoconf version +AC_PREREQ(2.69) + +AC_CONFIG_SRCDIR(readline.h) +AC_CONFIG_AUX_DIR(./support) +AC_CONFIG_HEADERS(config.h) + +dnl update the value of RL_READLINE_VERSION in readline.h when this changes +LIBVERSION=8.2 + +AC_CANONICAL_HOST +AC_CANONICAL_BUILD + +dnl configure defaults +opt_curses=no +opt_shared_termcap_lib=no + +dnl arguments to configure +AC_ARG_WITH(curses, AS_HELP_STRING([--with-curses], [use the curses library instead of the termcap library]), opt_curses=$withval) +AC_ARG_WITH(shared-termcap-library, AS_HELP_STRING([--with-shared-termcap-library], [link the readline shared library against the termcap/curses shared library [[default=NO]]]), opt_shared_termcap_lib=$withval) + +if test "$opt_curses" = "yes"; then + prefer_curses=yes +fi + +dnl option parsing for optional features +opt_multibyte=yes +opt_static_libs=yes +opt_shared_libs=yes +opt_install_examples=yes +opt_bracketed_paste_default=yes + +AC_ARG_ENABLE(multibyte, AS_HELP_STRING([--enable-multibyte], [enable multibyte characters if OS supports them]), opt_multibyte=$enableval) +AC_ARG_ENABLE(shared, AS_HELP_STRING([--enable-shared], [build shared libraries [[default=YES]]]), opt_shared_libs=$enableval) +AC_ARG_ENABLE(static, AS_HELP_STRING([--enable-static], [build static libraries [[default=YES]]]), opt_static_libs=$enableval) +AC_ARG_ENABLE(install-examples, AS_HELP_STRING([--disable-install-examples], [don't install examples [[default=install]]]), opt_install_examples=$enableval) + +AC_ARG_ENABLE(bracketed-paste-default, AS_HELP_STRING([--disable-bracketed-paste-default], [disable bracketed paste by default [[default=enable]]]), opt_bracketed_paste_default=$enableval) + +if test $opt_multibyte = no; then +AC_DEFINE(NO_MULTIBYTE_SUPPORT) +fi + +if test $opt_bracketed_paste_default = yes; then + BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=1' +else + BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=0' +fi +AC_SUBST(BRACKETED_PASTE) + +dnl load up the cross-building cache file -- add more cases and cache +dnl files as necessary + +dnl Note that host and target machine are the same, and different than the +dnl build machine. + +CROSS_COMPILE= +if test "x$cross_compiling" = "xyes"; then + case "${host}" in + *-cygwin*) + cross_cache=${srcdir}/cross-build/cygwin.cache + ;; + *-mingw*) + cross_cache=${srcdir}/cross-build/mingw.cache + ;; + i[[3456]]86-*-beos*) + cross_cache=${srcdir}/cross-build/x86-beos.cache + ;; + *) echo "configure: cross-compiling for $host is not supported" >&2 + ;; + esac + if test -n "${cross_cache}" && test -r "${cross_cache}"; then + echo "loading cross-build cache file ${cross_cache}" + . ${cross_cache} + fi + unset cross_cache + CROSS_COMPILE='-DCROSS_COMPILING' + AC_SUBST(CROSS_COMPILE) +fi + +echo "" +echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}" +echo "" + +# We want these before the checks, so the checks can modify their values. +test -z "$CFLAGS" && want_auto_cflags=1 + +AC_PROG_MAKE_SET +AC_PROG_CC +AC_USE_SYSTEM_EXTENSIONS + +# If we're using gcc and the user hasn't specified CFLAGS, add -O2 to CFLAGS +if test -n "$want_auto_cflags" ; then + AUTO_CFLAGS="-g ${GCC:+-O2}" + STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}" +fi + +AC_PROG_GCC_TRADITIONAL +AC_PROG_INSTALL +AC_CHECK_TOOL(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) + +dnl include files for gettext + +m4_include([m4/codeset.m4]) + +AC_C_CONST +AC_C_INLINE +AC_C_PROTOTYPES +AC_C_CHAR_UNSIGNED +AC_C_VOLATILE + +AC_TYPE_SIZE_T +AC_CHECK_TYPE(ssize_t, int) + +AC_HEADER_STAT +AC_HEADER_DIRENT + +AC_CHECK_FUNCS(fcntl gettimeofday kill lstat pselect readlink select setitimer) +AC_CHECK_FUNCS(fnmatch memmove putenv setenv setlocale \ + strcasecmp strpbrk sysconf tcgetattr vsnprintf) +AC_CHECK_FUNCS(isascii isxdigit) +AC_CHECK_FUNCS(getpwent getpwnam getpwuid) + +AC_FUNC_CHOWN +AC_FUNC_STRCOLL + +AC_CHECK_HEADERS(fcntl.h unistd.h stdlib.h varargs.h stdarg.h stdbool.h \ + string.h strings.h \ + limits.h locale.h pwd.h memory.h termcap.h termios.h termio.h) +AC_CHECK_HEADERS(sys/ioctl.h sys/pte.h sys/stream.h sys/select.h \ + sys/time.h sys/file.h) + +AC_CHECK_HEADERS(sys/ptem.h,,, +[[ +#if HAVE_SYS_STREAM_H +# include +#endif +]]) + +AC_SYS_LARGEFILE + +BASH_SYS_SIGNAL_VINTAGE +BASH_SYS_REINSTALL_SIGHANDLERS + +BASH_FUNC_POSIX_SETJMP +BASH_FUNC_LSTAT +BASH_FUNC_STRCOLL + +BASH_CHECK_GETPW_FUNCS + +AC_HEADER_TIOCGWINSZ + +BASH_TYPE_SIG_ATOMIC_T + +BASH_HAVE_TIOCSTAT +BASH_HAVE_FIONREAD +BASH_CHECK_SPEED_T +BASH_STRUCT_WINSIZE +BASH_STRUCT_DIRENT_D_INO +BASH_STRUCT_DIRENT_D_FILENO +BASH_STRUCT_TIMEVAL + +AC_CHECK_HEADERS(libaudit.h) +AC_CHECK_DECLS([AUDIT_USER_TTY],,, [[#include ]]) + +dnl yuck +case "$host_os" in +aix*) prefer_curses=yes ;; +esac +BASH_CHECK_LIB_TERMCAP +if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then + if test "$prefer_curses" = yes; then + TERMCAP_LIB=-lcurses + else + TERMCAP_LIB=-ltermcap #default + fi +fi +# Windows ncurses installation +if test "$TERMCAP_LIB" = "-lncurses"; then + AC_CHECK_HEADERS(ncurses/termcap.h) +fi +case "$opt_shared_termcap_lib" in +[[Yy]][[Ee]][[Ss]]) SHARED_TERMCAP="$TERMCAP_LIB" ;; +-l*) SHARED_TERMCAP="$opt_shared_termcap_lib" ;; +esac + +case "$TERMCAP_LIB" in +-ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;; +-lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; +-lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; +-ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;; +*) TERMCAP_PKG_CONFIG_LIB=termcap ;; +esac + +BASH_CHECK_MULTIBYTE + +case "$host_cpu" in +*cray*) LOCAL_CFLAGS=-DCRAY ;; +*s390*) LOCAL_CFLAGS=-fsigned-char ;; +esac + +case "$host_os" in +isc*) LOCAL_CFLAGS=-Disc386 ;; +hpux*) LOCAL_CFLAGS="-DTGETENT_BROKEN -DTGETFLAG_BROKEN" ;; +esac + +# shared library configuration section +# +# Shared object configuration section. These values are generated by +# ${srcdir}/support/shobj-conf +# +if test -f ${srcdir}/support/shobj-conf; then + AC_MSG_CHECKING(configuration for building shared libraries) + eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}` + + # SHARED_TERMCAP is set only if opt_shared_termcap_library is set + case "$SHLIB_LIBS" in + *curses*|*tinfo*) ;; + *termcap*|*termlib*) ;; # common aliases + *) SHLIB_LIBS="$SHLIB_LIBS $SHARED_TERMCAP" ;; + esac + + AC_SUBST(SHOBJ_CC) + AC_SUBST(SHOBJ_CFLAGS) + AC_SUBST(SHOBJ_LD) + AC_SUBST(SHOBJ_LDFLAGS) + AC_SUBST(SHOBJ_XLDFLAGS) + AC_SUBST(SHOBJ_LIBS) + AC_SUBST(SHOBJ_STATUS) + AC_SUBST(SHLIB_STATUS) + AC_SUBST(SHLIB_XLDFLAGS) + AC_SUBST(SHLIB_DOT) + AC_SUBST(SHLIB_LIBPREF) + AC_SUBST(SHLIB_LIBSUFF) + AC_SUBST(SHLIB_LIBVERSION) + AC_SUBST(SHLIB_DLLVERSION) + AC_SUBST(SHLIB_LIBS) + AC_MSG_RESULT($SHLIB_STATUS) + + # SHLIB_STATUS is either `supported' or `unsupported'. If it's + # `unsupported', turn off any default shared library building + if test "$SHLIB_STATUS" = 'unsupported'; then + opt_shared_libs=no + fi + + # shared library versioning + # quoted for m4 so I can use character classes + SHLIB_MAJOR=[`expr "$LIBVERSION" : '\([0-9]\)\..*'`] + SHLIB_MINOR=[`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`] + AC_SUBST(SHLIB_MAJOR) + AC_SUBST(SHLIB_MINOR) +fi + +if test "$opt_static_libs" = "yes"; then + STATIC_TARGET=static + STATIC_INSTALL_TARGET=install-static +fi +if test "$opt_shared_libs" = "yes"; then + SHARED_TARGET=shared + SHARED_INSTALL_TARGET=install-shared +fi + +AC_SUBST(STATIC_TARGET) +AC_SUBST(SHARED_TARGET) +AC_SUBST(STATIC_INSTALL_TARGET) +AC_SUBST(SHARED_INSTALL_TARGET) + +if test "$opt_install_examples" = "yes"; then + EXAMPLES_INSTALL_TARGET=install-examples +fi +AC_SUBST(EXAMPLES_INSTALL_TARGET) + +case "$build_os" in +msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file +*) BUILD_DIR=`pwd` ;; +esac + +case "$BUILD_DIR" in +*\ *) BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;; +*) ;; +esac + +AC_SUBST(BUILD_DIR) + +# CFLAGS=${CFLAGS-"$AUTO_CFLAGS"} +if test -n "$want_auto_cflags"; then + CFLAGS="$AUTO_CFLAGS" +fi +CFLAGS="$CFLAGS $STYLE_CFLAGS" + +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_SUBST(TERMCAP_PKG_CONFIG_LIB) + +AC_CONFIG_FILES([Makefile doc/Makefile examples/Makefile shlib/Makefile readline.pc history.pc]) + +dnl Makefile uses this timestamp file to record whether config.h is up to date. +AC_CONFIG_COMMANDS([stamp-h], [echo > stamp-h]) + +AC_OUTPUT diff --git a/display.c b/display.c new file mode 100644 index 0000000..c1135ec --- /dev/null +++ b/display.c @@ -0,0 +1,3583 @@ +/* display.c -- readline redisplay facility. */ + +/* Copyright (C) 1987-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#include "posixstat.h" + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +#ifdef __MSDOS__ +# include +#endif + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +/* Termcap library stuff. */ +#include "tcap.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +#if !defined (strchr) && !defined (__STDC__) +extern char *strchr (), *strrchr (); +#endif /* !strchr && !__STDC__ */ + +static void putc_face (int, int, char *); +static void puts_face (const char *, const char *, int); +static void norm_face (char *, int); + +static void update_line (char *, char *, char *, char *, int, int, int, int); +static void space_to_eol (int); +static void delete_chars (int); +static void insert_some_chars (char *, int, int); +static void open_some_spaces (int); +static void cr (void); +static void redraw_prompt (char *); +static void _rl_move_cursor_relative (int, const char *, const char *); + +/* Values for FLAGS */ +#define PMT_MULTILINE 0x01 + +static char *expand_prompt (char *, int, int *, int *, int *, int *); + +#define DEFAULT_LINE_BUFFER_SIZE 1024 + +/* State of visible and invisible lines. */ +struct line_state + { + char *line; + char *lface; + int *lbreaks; + int lbsize; +#if defined (HANDLE_MULTIBYTE) + int wbsize; + int *wrapped_line; +#endif + }; + +/* The line display buffers. One is the line currently displayed on + the screen. The other is the line about to be displayed. */ +static struct line_state line_state_array[2]; +static struct line_state *line_state_visible = &line_state_array[0]; +static struct line_state *line_state_invisible = &line_state_array[1]; +static int line_structures_initialized = 0; + +/* Backwards-compatible names. */ +#define inv_lbreaks (line_state_invisible->lbreaks) +#define inv_lbsize (line_state_invisible->lbsize) +#define vis_lbreaks (line_state_visible->lbreaks) +#define vis_lbsize (line_state_visible->lbsize) + +#define visible_line (line_state_visible->line) +#define vis_face (line_state_visible->lface) +#define invisible_line (line_state_invisible->line) +#define inv_face (line_state_invisible->lface) + +#if defined (HANDLE_MULTIBYTE) +static int _rl_col_width (const char *, int, int, int); +#else +# define _rl_col_width(l, s, e, f) (((e) <= (s)) ? 0 : (e) - (s)) +#endif + +/* Heuristic used to decide whether it is faster to move from CUR to NEW + by backing up or outputting a carriage return and moving forward. CUR + and NEW are either both buffer positions or absolute screen positions. */ +#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new))) + +/* _rl_last_c_pos is an absolute cursor position in multibyte locales and a + buffer index in others. This macro is used when deciding whether the + current cursor position is in the middle of a prompt string containing + invisible characters. XXX - might need to take `modmark' into account. */ +/* XXX - only valid when tested against _rl_last_c_pos; buffer indices need + to use prompt_last_invisible directly. */ +#define PROMPT_ENDING_INDEX \ + ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1) + +#define FACE_NORMAL '0' +#define FACE_STANDOUT '1' +#define FACE_INVALID ((char)1) + +/* **************************************************************** */ +/* */ +/* Display stuff */ +/* */ +/* **************************************************************** */ + +/* This is the stuff that is hard for me. I never seem to write good + display routines in C. Let's see how I do this time. */ + +/* (PWP) Well... Good for a simple line updater, but totally ignores + the problems of input lines longer than the screen width. + + update_line and the code that calls it makes a multiple line, + automatically wrapping line update. Careful attention needs + to be paid to the vertical position variables. */ + +/* Keep two buffers; one which reflects the current contents of the + screen, and the other to draw what we think the new contents should + be. Then compare the buffers, and make whatever changes to the + screen itself that we should. Finally, make the buffer that we + just drew into be the one which reflects the current contents of the + screen, and place the cursor where it belongs. + + Commands that want to can fix the display themselves, and then let + this function know that the display has been fixed by setting the + RL_DISPLAY_FIXED variable. This is good for efficiency. */ + +/* Application-specific redisplay function. */ +rl_voidfunc_t *rl_redisplay_function = rl_redisplay; + +/* Global variables declared here. */ +/* What YOU turn on when you have handled all redisplay yourself. */ +int rl_display_fixed = 0; + +/* 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; + +/* Variables used to include the editing mode in the prompt. */ +char *_rl_emacs_mode_str; +int _rl_emacs_modestr_len; + +char *_rl_vi_ins_mode_str; +int _rl_vi_ins_modestr_len; + +char *_rl_vi_cmd_mode_str; +int _rl_vi_cmd_modestr_len; + +/* Pseudo-global variables declared here. */ + +/* Hints for other parts of readline to give to the display engine. */ +int _rl_suppress_redisplay = 0; +int _rl_want_redisplay = 0; + +/* The visible cursor position. If you print some text, adjust this. */ +/* NOTE: _rl_last_c_pos is used as a buffer index when not in a locale + supporting multibyte characters, and an absolute cursor position when + in such a locale. This is an artifact of the donated multibyte support. + Care must be taken when modifying its value. */ +int _rl_last_c_pos = 0; +int _rl_last_v_pos = 0; + +/* Number of physical lines consumed by the current line buffer currently + on screen minus 1. */ +int _rl_vis_botlin = 0; + +static int _rl_quick_redisplay = 0; + +/* This is a hint update_line gives to rl_redisplay that it has adjusted the + value of _rl_last_c_pos *and* taken the presence of any invisible chars in + the prompt into account. rl_redisplay notes this and does not do the + adjustment itself. */ +static int cpos_adjusted; + +/* The index into the line buffer corresponding to the cursor position */ +static int cpos_buffer_position; + +/* A flag to note when we're displaying the first line of the prompt */ +static int displaying_prompt_first_line; +/* The number of multibyte characters in the prompt, if any */ +static int prompt_multibyte_chars; + +static int _rl_inv_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; + +/* A buffer for `modeline' messages. */ +static char *msg_buf = 0; +static int msg_bufsiz = 0; + +/* 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 = 0; + +/* Set to a non-zero value if horizontal scrolling has been enabled + automatically because the terminal was resized to height 1. */ +static int horizontal_scrolling_autoset = 0; /* explicit initialization */ + +/* Variables to keep track of the expanded prompt string, which may + include invisible characters. */ + +static char *local_prompt, *local_prompt_prefix; +static int local_prompt_len; +static int prompt_prefix_length; +/* Number of chars in the buffer that contribute to visible chars on the screen. + This might be different from the number of physical chars in the presence + of multibyte characters */ +static int prompt_visible_length; + +/* The number of invisible characters in the line currently being + displayed on the screen. */ +static int visible_wrap_offset; + +/* The number of invisible characters in the prompt string. Static so it + can be shared between rl_redisplay and update_line */ +static int wrap_offset; + +/* The index of the last invisible character in the prompt string. */ +static int prompt_last_invisible; + +/* The length (buffer offset) of the first line of the last (possibly + multi-line) buffer displayed on the screen. */ +static int visible_first_line_len; + +/* Number of invisible characters on the first physical line of the prompt. + Only valid when the number of physical characters in the prompt exceeds + (or is equal to) _rl_screenwidth. */ +static int prompt_invis_chars_first_line; + +static int prompt_last_screen_line; + +static int prompt_physical_chars; + +/* An array of indexes into the prompt string where we will break physical + screen lines. It's easier to compute in expand_prompt and use later in + rl_redisplay instead of having rl_redisplay try to guess about invisible + characters in the prompt or use heuristics about where they are. */ +static int *local_prompt_newlines; + +/* set to a non-zero value by rl_redisplay if we are marking modified history + lines and the current line is so marked. */ +static int modmark; + +static int line_totbytes; + +/* Variables to save and restore prompt and display information. */ + +/* These are getting numerous enough that it's time to create a struct. */ + +static char *saved_local_prompt; +static char *saved_local_prefix; +static int *saved_local_prompt_newlines; + +static int saved_last_invisible; +static int saved_visible_length; +static int saved_prefix_length; +static int saved_local_length; +static int saved_invis_chars_first_line; +static int saved_physical_chars; + +/* Return a string indicating the editing mode, for use in the prompt. */ + +static char * +prompt_modestr (int *lenp) +{ + if (rl_editing_mode == emacs_mode) + { + if (lenp) + *lenp = _rl_emacs_mode_str ? _rl_emacs_modestr_len : RL_EMACS_MODESTR_DEFLEN; + return _rl_emacs_mode_str ? _rl_emacs_mode_str : RL_EMACS_MODESTR_DEFAULT; + } + else if (_rl_keymap == vi_insertion_keymap) + { + if (lenp) + *lenp = _rl_vi_ins_mode_str ? _rl_vi_ins_modestr_len : RL_VI_INS_MODESTR_DEFLEN; + return _rl_vi_ins_mode_str ? _rl_vi_ins_mode_str : RL_VI_INS_MODESTR_DEFAULT; /* vi insert mode */ + } + else + { + if (lenp) + *lenp = _rl_vi_cmd_mode_str ? _rl_vi_cmd_modestr_len : RL_VI_CMD_MODESTR_DEFLEN; + return _rl_vi_cmd_mode_str ? _rl_vi_cmd_mode_str : RL_VI_CMD_MODESTR_DEFAULT; /* vi command mode */ + } +} + +/* Expand the prompt string S and return the number of visible + characters in *LP, if LP is not null. This is currently more-or-less + a placeholder for expansion. LIP, if non-null is a place to store the + index of the last invisible character in the returned string. NIFLP, + if non-zero, is a place to store the number of invisible characters in + the first prompt line. The previous are used as byte counts -- indexes + into a character buffer. *VLP gets the number of physical characters in + the expanded prompt (visible length) */ + +/* 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'. */ + +/* Possible values for FLAGS: + PMT_MULTILINE caller indicates that this is part of a multiline prompt +*/ + +/* This approximates the number of lines the prompt will take when displayed */ +#define APPROX_DIV(n, d) (((n) < (d)) ? 1 : ((n) / (d)) + 1) + +static char * +expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp) +{ + char *r, *ret, *p, *igstart, *nprompt, *ms; + int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars; + int mlen, newlines, newlines_guess, bound, can_add_invis; + int mb_cur_max; + + /* We only expand the mode string for the last line of a multiline prompt + (a prompt with embedded newlines). */ + ms = (((pmt == rl_prompt) ^ (flags & PMT_MULTILINE)) && _rl_show_mode_in_prompt) ? prompt_modestr (&mlen) : 0; + if (ms) + { + l = strlen (pmt); + nprompt = (char *)xmalloc (l + mlen + 1); + memcpy (nprompt, ms, mlen); + strcpy (nprompt + mlen, pmt); + } + else + nprompt = pmt; + + can_add_invis = 0; + mb_cur_max = MB_CUR_MAX; + + if (_rl_screenwidth == 0) + _rl_get_screen_size (0, 0); /* avoid division by zero */ + + /* Short-circuit if we can. We can do this if we are treating the prompt as + a sequence of bytes and there are no invisible characters in the prompt + to deal with. Since we populate local_prompt_newlines, we have to run + through the rest of the function if this prompt looks like it's going to + be longer than one screen line. */ + if ((mb_cur_max <= 1 || rl_byte_oriented) && strchr (nprompt, RL_PROMPT_START_IGNORE) == 0) + { + l = strlen (nprompt); + if (l < (_rl_screenwidth > 0 ? _rl_screenwidth : 80)) + { + r = (nprompt == pmt) ? savestring (pmt) : nprompt; + if (lp) + *lp = l; + if (lip) + *lip = 0; + if (niflp) + *niflp = 0; + if (vlp) + *vlp = l; + + local_prompt_newlines = (int *) xrealloc (local_prompt_newlines, sizeof (int) * 2); + local_prompt_newlines[0] = 0; + local_prompt_newlines[1] = -1; + + return r; + } + } + + l = strlen (nprompt); /* XXX */ + r = ret = (char *)xmalloc (l + 1); + + /* Guess at how many screen lines the prompt will take to size the array that + keeps track of where the line wraps happen */ + newlines_guess = (_rl_screenwidth > 0) ? APPROX_DIV(l, _rl_screenwidth) : APPROX_DIV(l, 80); + local_prompt_newlines = (int *) xrealloc (local_prompt_newlines, sizeof (int) * (newlines_guess + 1)); + local_prompt_newlines[newlines = 0] = 0; + for (rl = 1; rl <= newlines_guess; rl++) + local_prompt_newlines[rl] = -1; + + rl = physchars = 0; /* mode string now part of nprompt */ + invfl = 0; /* invisible chars in first line of prompt */ + invflset = 0; /* we only want to set invfl once */ + igstart = 0; /* we're not ignoring any characters yet */ + + for (ignoring = last = ninvis = 0, p = nprompt; p && *p; p++) + { + /* This code strips the invisible character string markers + RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */ + if (ignoring == 0 && *p == RL_PROMPT_START_IGNORE) /* XXX - check ignoring? */ + { + ignoring = 1; + igstart = p; + continue; + } + else if (ignoring && *p == RL_PROMPT_END_IGNORE) + { + ignoring = 0; + /* If we have a run of invisible characters, adjust local_prompt_newlines + to add them, since update_line expects them to be counted before + wrapping the line. */ + if (can_add_invis) + { + local_prompt_newlines[newlines] = r - ret; + /* If we're adding to the number of invisible characters on the + first line of the prompt, but we've already set the number of + invisible characters on that line, we need to adjust the + counter. */ + if (invflset && newlines == 1) + invfl = ninvis; + } + if (p != (igstart + 1)) + last = r - ret - 1; + continue; + } + else + { +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + pind = p - nprompt; + ind = _rl_find_next_mbchar (nprompt, pind, 1, MB_FIND_NONZERO); + l = ind - pind; + while (l--) + *r++ = *p++; + if (!ignoring) + { + /* rl ends up being assigned to prompt_visible_length, + which is the number of characters in the buffer that + contribute to characters on the screen, which might + not be the same as the number of physical characters + on the screen in the presence of multibyte characters */ + rl += ind - pind; + physchars += _rl_col_width (nprompt, pind, ind, 0); + } + else + ninvis += ind - pind; + p--; /* compensate for later increment */ + } + else +#endif + { + *r++ = *p; + if (!ignoring) + { + rl++; /* visible length byte counter */ + physchars++; + } + else + ninvis++; /* invisible chars byte counter */ + } + + if (invflset == 0 && physchars >= _rl_screenwidth) + { + invfl = ninvis; + invflset = 1; + } + + if (physchars >= (bound = (newlines + 1) * _rl_screenwidth) && local_prompt_newlines[newlines+1] == -1) + { + int new; + if (physchars > bound) /* should rarely happen */ + { +#if defined (HANDLE_MULTIBYTE) + *r = '\0'; /* need null-termination for strlen */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + new = _rl_find_prev_mbchar (ret, r - ret, MB_FIND_ANY); + else +#endif + new = r - ret - (physchars - bound); /* XXX */ + } + else + new = r - ret; + local_prompt_newlines[++newlines] = new; + } + + /* What if a physical character of width >= 2 is split? There is + code that wraps before the physical screen width if the character + width would exceed it, but it needs to be checked against this + code and local_prompt_newlines[]. */ + if (ignoring == 0) + can_add_invis = (physchars == bound); + } + } + + if (rl <= _rl_screenwidth) + invfl = ninvis; + + *r = '\0'; + if (lp) + *lp = rl; + if (lip) + *lip = last; + if (niflp) + *niflp = invfl; + if (vlp) + *vlp = physchars; + + if (nprompt != pmt) + xfree (nprompt); + + 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 (char *pmt) +{ + char *ret; + + ret = expand_prompt (pmt, 0, (int *)NULL, (int *)NULL, (int *)NULL, (int *)NULL); + return ret; +} + +void +_rl_reset_prompt (void) +{ + rl_visible_prompt_length = rl_expand_prompt (rl_prompt); +} + +/* + * Expand the prompt string into the various display components, if + * necessary. + * + * local_prompt = expanded last line of string in rl_display_prompt + * (portion after the final newline) + * local_prompt_prefix = portion before last newline of rl_display_prompt, + * expanded via expand_prompt + * prompt_visible_length = number of visible characters in local_prompt + * prompt_prefix_length = number of visible characters in local_prompt_prefix + * + * It also tries to keep track of the number of invisible characters in the + * prompt string, and where they are. + * + * 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. In this case, multi-line means + * there are embedded newlines in the prompt string itself, not that the + * number of physical characters exceeds the screen width and the prompt + * wraps. + */ +int +rl_expand_prompt (char *prompt) +{ + char *p, *t; + int c; + + /* Clear out any saved values. */ + FREE (local_prompt); + FREE (local_prompt_prefix); + + local_prompt = local_prompt_prefix = (char *)0; + local_prompt_len = 0; + prompt_last_invisible = prompt_invis_chars_first_line = 0; + prompt_visible_length = prompt_physical_chars = 0; + + if (prompt == 0 || *prompt == 0) + return (0); + + p = strrchr (prompt, '\n'); + if (p == 0) + { + /* The prompt is only one logical line, though it might wrap. */ + local_prompt = expand_prompt (prompt, 0, &prompt_visible_length, + &prompt_last_invisible, + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)0; + local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + return (prompt_visible_length); + } + else + { + /* The prompt spans multiple lines. */ + t = ++p; + 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, PMT_MULTILINE, + &prompt_prefix_length, + (int *)NULL, + (int *)NULL, + (int *)NULL); + *t = c; + + local_prompt = expand_prompt (p, PMT_MULTILINE, + &prompt_visible_length, + &prompt_last_invisible, + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + return (prompt_prefix_length); + } +} + +/* Allocate the various line structures, making sure they can hold MINSIZE + bytes. If the existing line size can accommodate MINSIZE bytes, don't do + anything. */ +static void +realloc_line (int minsize) +{ + int minimum_size; + int newsize, delta; + + minimum_size = DEFAULT_LINE_BUFFER_SIZE; + if (minsize < minimum_size) + minsize = minimum_size; + if (minsize <= _rl_screenwidth) /* XXX - for gdb */ + minsize = _rl_screenwidth + 1; + if (line_size >= minsize) + return; + + newsize = minimum_size; + while (newsize < minsize) + newsize *= 2; + + visible_line = (char *)xrealloc (visible_line, newsize); + vis_face = (char *)xrealloc (vis_face, newsize); + + invisible_line = (char *)xrealloc (invisible_line, newsize); + inv_face = (char *)xrealloc (inv_face, newsize); + + delta = newsize - line_size; + memset (visible_line + line_size, 0, delta); + memset (vis_face + line_size, FACE_NORMAL, delta); + memset (invisible_line + line_size, 1, delta); + memset (inv_face + line_size, FACE_INVALID, delta); + + line_size = newsize; +} + +/* 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 (int minsize) +{ + if (invisible_line == 0) /* initialize it */ + { + if (line_size > minsize) + minsize = line_size; + } + realloc_line (minsize); + + if (vis_lbreaks == 0) + { + /* should be enough. */ + inv_lbsize = vis_lbsize = 256; + +#if defined (HANDLE_MULTIBYTE) + line_state_visible->wbsize = vis_lbsize; + line_state_visible->wrapped_line = (int *)xmalloc (line_state_visible->wbsize * sizeof (int)); + + line_state_invisible->wbsize = inv_lbsize; + line_state_invisible->wrapped_line = (int *)xmalloc (line_state_invisible->wbsize * sizeof (int)); +#endif + + inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int)); + vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int)); + inv_lbreaks[0] = vis_lbreaks[0] = 0; + } + + line_structures_initialized = 1; +} + +/* Convenience functions to add chars to the invisible line that update the + face information at the same time. */ +static void /* XXX - change this */ +invis_addc (int *outp, char c, char face) +{ + realloc_line (*outp + 1); + invisible_line[*outp] = c; + inv_face[*outp] = face; + *outp += 1; +} + +static void +invis_adds (int *outp, const char *str, int n, char face) +{ + int i; + + for (i = 0; i < n; i++) + invis_addc (outp, str[i], face); +} + +static void +invis_nul (int *outp) +{ + invis_addc (outp, '\0', 0); + *outp -= 1; +} + +static void +set_active_region (int *beg, int *end) +{ + if (rl_point >= 0 && rl_point <= rl_end && rl_mark >= 0 && rl_mark <= rl_end) + { + *beg = (rl_mark < rl_point) ? rl_mark : rl_point; + *end = (rl_mark < rl_point) ? rl_point : rl_mark; + } +} + +/* Do whatever tests are necessary and tell update_line that it can do a + quick, dumb redisplay on the assumption that there are so many + differences between the old and new lines that it would be a waste to + compute all the differences. + Right now, it just sets _rl_quick_redisplay if the current visible line + is a single line (so we don't have to move vertically or mess with line + wrapping). */ +void +_rl_optimize_redisplay (void) +{ + if (_rl_vis_botlin == 0) + _rl_quick_redisplay = 1; +} + +/* Basic redisplay algorithm. See comments inline. */ +void +rl_redisplay (void) +{ + int in, out, c, linenum, cursor_linenum; + int inv_botlin, lb_botlin, lb_linenum, o_cpos; + int newlines, lpos, temp, n0, num, prompt_lines_estimate; + char *prompt_this_line; + char cur_face; + int hl_begin, hl_end; + int mb_cur_max = MB_CUR_MAX; +#if defined (HANDLE_MULTIBYTE) + WCHAR_T wc; + size_t wc_bytes; + int wc_width; + mbstate_t ps; + int _rl_wrapped_multicolumn = 0; +#endif + + if (_rl_echoing_p == 0) + return; + + /* Block keyboard interrupts because this function manipulates global + data structures. */ + _rl_block_sigint (); + RL_SETSTATE (RL_STATE_REDISPLAYING); + + cur_face = FACE_NORMAL; + /* Can turn this into an array for multiple highlighted objects in addition + to the region */ + hl_begin = hl_end = -1; + + if (rl_mark_active_p ()) + set_active_region (&hl_begin, &hl_end); + + if (!rl_display_prompt) + rl_display_prompt = ""; + + if (line_structures_initialized == 0) + { + init_line_structures (0); + rl_on_new_line (); + } + else if (line_size <= _rl_screenwidth) + init_line_structures (_rl_screenwidth + 1); + + /* Enable horizontal scrolling automatically for terminals of height 1 + where wrapping lines doesn't work. Disable it as soon as the terminal + height is increased again if it was automatically enabled. */ + if (_rl_screenheight <= 1) + { + if (_rl_horizontal_scroll_mode == 0) + horizontal_scrolling_autoset = 1; + _rl_horizontal_scroll_mode = 1; + } + else if (horizontal_scrolling_autoset) + _rl_horizontal_scroll_mode = 0; + + /* Draw the line into the buffer. */ + cpos_buffer_position = -1; + + prompt_multibyte_chars = prompt_visible_length - prompt_physical_chars; + + out = inv_botlin = 0; + + /* Mark the line as modified or not. We only do this for history + lines. */ + modmark = 0; + if (_rl_mark_modified_lines && current_history () && rl_undo_list) + { + invis_addc (&out, '*', cur_face); + invis_nul (&out); + modmark = 1; + } + + /* If someone thought that the redisplay was handled, but the currently + visible line has a different modification state than the one about + to become visible, then correct the caller's misconception. */ + if (visible_line[0] != invisible_line[0]) + rl_display_fixed = 0; + + /* If the prompt to be displayed is the `primary' readline prompt (the + one passed to readline()), use the values we have already expanded. + If not, use what's already in rl_display_prompt. WRAP_OFFSET is the + number of non-visible characters (bytes) in the prompt string. */ + /* This is where we output the characters in the prompt before the last + newline, if any. If there aren't any embedded newlines, we don't + write anything. Copy the last line of the prompt string into the line in + any case */ + if (rl_display_prompt == rl_prompt || local_prompt) + { + if (local_prompt_prefix && forced_display) + _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix)); + + if (local_prompt_len > 0) + invis_adds (&out, local_prompt, local_prompt_len, cur_face); + invis_nul (&out); + wrap_offset = local_prompt_len - prompt_visible_length; + } + else + { + int pmtlen; + prompt_this_line = strrchr (rl_display_prompt, '\n'); + if (!prompt_this_line) + prompt_this_line = rl_display_prompt; + else + { + prompt_this_line++; + pmtlen = prompt_this_line - rl_display_prompt; /* temp var */ + if (forced_display) + { + _rl_output_some_chars (rl_display_prompt, pmtlen); + /* Make sure we are at column zero even after a newline, + regardless of the state of terminal output processing. */ + if (pmtlen < 2 || prompt_this_line[-2] != '\r') + cr (); + } + } + + prompt_physical_chars = pmtlen = strlen (prompt_this_line); /* XXX */ + invis_adds (&out, prompt_this_line, pmtlen, cur_face); + invis_nul (&out); + wrap_offset = prompt_invis_chars_first_line = 0; + } + +#if defined (HANDLE_MULTIBYTE) +#define CHECK_INV_LBREAKS() \ + do { \ + if (newlines >= (inv_lbsize - 2)) \ + { \ + inv_lbsize *= 2; \ + inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ + } \ + if (newlines >= (line_state_invisible->wbsize - 2)) \ + { \ + line_state_invisible->wbsize *= 2; \ + line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, line_state_invisible->wbsize * sizeof(int)); \ + } \ + } while (0) +#else +#define CHECK_INV_LBREAKS() \ + do { \ + if (newlines >= (inv_lbsize - 2)) \ + { \ + inv_lbsize *= 2; \ + inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ + } \ + } while (0) +#endif /* !HANDLE_MULTIBYTE */ + +#if defined (HANDLE_MULTIBYTE) +#define CHECK_LPOS() \ + do { \ + lpos++; \ + if (lpos >= _rl_screenwidth) \ + { \ + if (newlines >= (inv_lbsize - 2)) \ + { \ + inv_lbsize *= 2; \ + inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ + } \ + inv_lbreaks[++newlines] = out; \ + if (newlines >= (line_state_invisible->wbsize - 2)) \ + { \ + line_state_invisible->wbsize *= 2; \ + line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, line_state_invisible->wbsize * sizeof(int)); \ + } \ + line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; \ + lpos = 0; \ + } \ + } while (0) +#else +#define CHECK_LPOS() \ + do { \ + lpos++; \ + if (lpos >= _rl_screenwidth) \ + { \ + if (newlines >= (inv_lbsize - 2)) \ + { \ + inv_lbsize *= 2; \ + inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ + } \ + inv_lbreaks[++newlines] = out; \ + lpos = 0; \ + } \ + } while (0) +#endif + + /* inv_lbreaks[i] is where line i starts in the buffer. */ + inv_lbreaks[newlines = 0] = 0; + /* lpos is a physical cursor position, so it needs to be adjusted by the + number of invisible characters in the prompt, per line. We compute + the line breaks in the prompt string in expand_prompt, taking invisible + characters into account, and if lpos exceeds the screen width, we copy + the data in the loop below. */ + lpos = prompt_physical_chars + modmark; + +#if defined (HANDLE_MULTIBYTE) + memset (line_state_invisible->wrapped_line, 0, line_state_invisible->wbsize * sizeof (int)); + num = 0; +#endif + + /* prompt_invis_chars_first_line is the number of invisible characters (bytes) + in the first physical line of the prompt. + wrap_offset - prompt_invis_chars_first_line is usually the number of + invis chars on the second (or, more generally, last) line. */ + + /* This is zero-based, used to set the newlines */ + prompt_lines_estimate = lpos / _rl_screenwidth; + + /* what if lpos is already >= _rl_screenwidth before we start drawing the + contents of the command line? */ + if (lpos >= _rl_screenwidth) + { + temp = 0; + + /* first copy the linebreaks array we computed in expand_prompt */ + while (local_prompt_newlines[newlines+1] != -1) + { + temp = local_prompt_newlines[newlines+1]; + inv_lbreaks[++newlines] = temp; + } + + /* Now set lpos from the last newline */ + if (mb_cur_max > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0) + lpos = _rl_col_width (local_prompt, temp, local_prompt_len, 1) - (wrap_offset - prompt_invis_chars_first_line); + else + lpos -= (_rl_screenwidth * newlines); + } + + prompt_last_screen_line = newlines; + + /* Draw the rest of the line (after the prompt) into invisible_line, keeping + track of where the cursor is (cpos_buffer_position), the number of the + line containing the cursor (lb_linenum), the last line number (lb_botlin + and inv_botlin). + It maintains an array of line breaks for display (inv_lbreaks). + This handles expanding tabs for display and displaying meta characters. */ + lb_linenum = 0; +#if defined (HANDLE_MULTIBYTE) + in = 0; + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + memset (&ps, 0, sizeof (mbstate_t)); + if (_rl_utf8locale && UTF8_SINGLEBYTE(rl_line_buffer[0])) + { + wc = (WCHAR_T)rl_line_buffer[0]; + wc_bytes = 1; + } + else + wc_bytes = MBRTOWC (&wc, rl_line_buffer, rl_end, &ps); + } + else + wc_bytes = 1; + while (in < rl_end) +#else + for (in = 0; in < rl_end; in++) +#endif + { + if (in == hl_begin) + cur_face = FACE_STANDOUT; + else if (in == hl_end) + cur_face = FACE_NORMAL; + + c = (unsigned char)rl_line_buffer[in]; + +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + if (MB_INVALIDCH (wc_bytes)) + { + /* Byte sequence is invalid or shortened. Assume that the + first byte represents a character. */ + wc_bytes = 1; + /* Assume that a character occupies a single column. */ + wc_width = 1; + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (MB_NULLWCH (wc_bytes)) + break; /* Found '\0' */ + else + { + temp = WCWIDTH (wc); + wc_width = (temp >= 0) ? temp : 1; + } + } +#endif + + if (in == rl_point) + { + cpos_buffer_position = out; + lb_linenum = newlines; + } + +#if defined (HANDLE_MULTIBYTE) + if (META_CHAR (c) && _rl_output_meta_chars == 0) /* XXX - clean up */ +#else + if (META_CHAR (c)) +#endif + { + if (_rl_output_meta_chars == 0) + { + char obuf[5]; + int olen; + + olen = sprintf (obuf, "\\%o", c); + + if (lpos + olen >= _rl_screenwidth) + { + temp = _rl_screenwidth - lpos; + CHECK_INV_LBREAKS (); + inv_lbreaks[++newlines] = out + temp; +#if defined (HANDLE_MULTIBYTE) + line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; +#endif + lpos = olen - temp; + } + else + lpos += olen; + + for (temp = 0; temp < olen; temp++) + { + invis_addc (&out, obuf[temp], cur_face); + CHECK_LPOS (); + } + } + else + { + invis_addc (&out, c, cur_face); + CHECK_LPOS(); + } + } +#if defined (DISPLAY_TABS) + else if (c == '\t') + { + register int newout; + + newout = out + 8 - lpos % 8; + temp = newout - out; + if (lpos + temp >= _rl_screenwidth) + { + register int temp2; + temp2 = _rl_screenwidth - lpos; + CHECK_INV_LBREAKS (); + inv_lbreaks[++newlines] = out + temp2; +#if defined (HANDLE_MULTIBYTE) + line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; +#endif + lpos = temp - temp2; + while (out < newout) + invis_addc (&out, ' ', cur_face); + } + else + { + while (out < newout) + invis_addc (&out, ' ', cur_face); + lpos += temp; + } + } +#endif + else if (c == '\n' && _rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) + { + invis_addc (&out, '\0', cur_face); + CHECK_INV_LBREAKS (); + inv_lbreaks[++newlines] = out; +#if defined (HANDLE_MULTIBYTE) + line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; +#endif + lpos = 0; + } + else if (CTRL_CHAR (c) || c == RUBOUT) + { + invis_addc (&out, '^', cur_face); + CHECK_LPOS(); + invis_addc (&out, CTRL_CHAR (c) ? UNCTRL (c) : '?', cur_face); + CHECK_LPOS(); + } + else + { +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + register int i; + + _rl_wrapped_multicolumn = 0; + + if (_rl_screenwidth < lpos + wc_width) + for (i = lpos; i < _rl_screenwidth; i++) + { + /* The space will be removed in update_line() */ + invis_addc (&out, ' ', cur_face); + _rl_wrapped_multicolumn++; + CHECK_LPOS(); + } + if (in == rl_point) + { + cpos_buffer_position = out; + lb_linenum = newlines; + } + for (i = in; i < in+wc_bytes; i++) + invis_addc (&out, rl_line_buffer[i], cur_face); + for (i = 0; i < wc_width; i++) + CHECK_LPOS(); + } + else + { + invis_addc (&out, c, cur_face); + CHECK_LPOS(); + } +#else + invis_addc (&out, c, cur_face); + CHECK_LPOS(); +#endif + } + +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + in += wc_bytes; + if (_rl_utf8locale && UTF8_SINGLEBYTE(rl_line_buffer[in])) + { + wc = (WCHAR_T)rl_line_buffer[in]; + wc_bytes = 1; + memset (&ps, 0, sizeof (mbstate_t)); /* re-init state */ + } + else + wc_bytes = MBRTOWC (&wc, rl_line_buffer + in, rl_end - in, &ps); + } + else + in++; +#endif + } + invis_nul (&out); + line_totbytes = out; + if (cpos_buffer_position < 0) + { + cpos_buffer_position = out; + lb_linenum = newlines; + } + + /* If we are switching from one line to multiple wrapped lines, we don't + want to do a dumb update (or we want to make it smarter). */ + if (_rl_quick_redisplay && newlines > 0) + _rl_quick_redisplay = 0; + + inv_botlin = lb_botlin = _rl_inv_botlin = newlines; + CHECK_INV_LBREAKS (); + inv_lbreaks[newlines+1] = out; +#if defined (HANDLE_MULTIBYTE) + /* This should be 0 anyway */ + line_state_invisible->wrapped_line[newlines+1] = _rl_wrapped_multicolumn; +#endif + cursor_linenum = lb_linenum; + + /* CPOS_BUFFER_POSITION == position in buffer where cursor should be placed. + CURSOR_LINENUM == line number where the cursor should be placed. */ + + /* PWP: now is when things get a bit hairy. The visible and invisible + line buffers are really multiple lines, which would wrap every + (screenwidth - 1) characters. Go through each in turn, finding + the changed region and updating it. The line order is top to bottom. */ + + /* If we can move the cursor up and down, then use multiple lines, + otherwise, let long lines display in a single terminal line, and + horizontally scroll it. */ + displaying_prompt_first_line = 1; + if (_rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) + { + int nleft, pos, changed_screen_line, tx; + + if (!rl_display_fixed || forced_display) + { + forced_display = 0; + + /* If we have more than a screenful of material to display, then + only display a screenful. We should display the last screen, + not the first. */ + if (out >= _rl_screenchars) + { +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + out = _rl_find_prev_mbchar (invisible_line, _rl_screenchars, MB_FIND_ANY); + else +#endif + out = _rl_screenchars - 1; + } + + /* The first line is at character position 0 in the buffer. The + second and subsequent lines start at inv_lbreaks[N], offset by + OFFSET (which has already been calculated above). */ + +#define INVIS_FIRST() (prompt_physical_chars > _rl_screenwidth ? prompt_invis_chars_first_line : wrap_offset) +#define WRAP_OFFSET(line, offset) ((line == 0) \ + ? (offset ? INVIS_FIRST() : 0) \ + : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0)) +#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0) +#define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l])) +#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l]) +#define VIS_CHARS(line) (visible_line + vis_lbreaks[line]) +#define VIS_FACE(line) (vis_face + vis_lbreaks[line]) +#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line) +#define VIS_LINE_FACE(line) ((line) > _rl_vis_botlin) ? "" : VIS_FACE(line) +#define INV_LINE(line) (invisible_line + inv_lbreaks[line]) +#define INV_LINE_FACE(line) (inv_face + inv_lbreaks[line]) + +#define OLD_CPOS_IN_PROMPT() (cpos_adjusted == 0 && \ + _rl_last_c_pos != o_cpos && \ + _rl_last_c_pos > wrap_offset && \ + o_cpos < prompt_last_invisible) + + + /* We don't want to highlight anything that's going to be off the top + of the display; if the current line takes up more than an entire + screen, just mark the lines that won't be displayed as having a + `normal' face. + It's imperfect, but better than display corruption. */ + if (rl_mark_active_p () && inv_botlin > _rl_screenheight) + { + int extra; + + extra = inv_botlin - _rl_screenheight; + for (linenum = 0; linenum <= extra; linenum++) + norm_face (INV_LINE_FACE(linenum), INV_LLEN (linenum)); + } + + /* For each line in the buffer, do the updating display. */ + for (linenum = 0; linenum <= inv_botlin; linenum++) + { + /* This can lead us astray if we execute a program that changes + the locale from a non-multibyte to a multibyte one. */ + o_cpos = _rl_last_c_pos; + cpos_adjusted = 0; + update_line (VIS_LINE(linenum), VIS_LINE_FACE(linenum), + INV_LINE(linenum), INV_LINE_FACE(linenum), + linenum, + VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin); + + /* update_line potentially changes _rl_last_c_pos, but doesn't + take invisible characters into account, since _rl_last_c_pos + is an absolute cursor position in a multibyte locale. We + choose to (mostly) compensate for that here, rather than + change update_line itself. There are several cases in which + update_line adjusts _rl_last_c_pos itself (so it can pass + _rl_move_cursor_relative accurate values); it communicates + this back by setting cpos_adjusted. If we assume that + _rl_last_c_pos is correct (an absolute cursor position) each + time update_line is called, then we can assume in our + calculations that o_cpos does not need to be adjusted by + wrap_offset. */ + if (linenum == 0 && (mb_cur_max > 1 && rl_byte_oriented == 0) && OLD_CPOS_IN_PROMPT()) + _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */ + else if (cpos_adjusted == 0 && + linenum == prompt_last_screen_line && + prompt_physical_chars > _rl_screenwidth && + (mb_cur_max > 1 && rl_byte_oriented == 0) && + _rl_last_c_pos != o_cpos && + _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line)) /* XXX - rethink this last one */ + /* This assumes that all the invisible characters are split + between the first and last lines of the prompt, if the + prompt consumes more than two lines. It's usually right */ + /* XXX - not sure this is ever executed */ + _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line); + + /* If this is the line with the prompt, we might need to + compensate for invisible characters in the new line. Do + this only if there is not more than one new line (which + implies that we completely overwrite the old visible line) + and the new line is shorter than the old. Make sure we are + at the end of the new line before clearing. */ + if (linenum == 0 && + inv_botlin == 0 && _rl_last_c_pos == out && + (wrap_offset > visible_wrap_offset) && + (_rl_last_c_pos < visible_first_line_len)) + { + if (mb_cur_max > 1 && rl_byte_oriented == 0) + nleft = _rl_screenwidth - _rl_last_c_pos; + else + nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos; + if (nleft) + _rl_clear_to_eol (nleft); + } +#if 0 + /* This segment is intended to handle the case where the old + visible prompt has invisible characters and the new line + to be displayed needs to clear the rest of the old characters + out (e.g., when printing the i-search prompt): in general, + the case of the new line being shorter than the old. We need + to be at the end of the new line and the old line needs to be + longer than the current cursor position. It's not perfect, + since it uses the byte length of the first line, but this will + at worst result in some extra clear-to-end-of-lines. We can't + use the prompt length variables because they may not + correspond to the visible line (see printing the i-search + prompt above). The tests for differing numbers of invisible + characters may not matter and can probably be removed. */ + else if (linenum == 0 && + linenum == prompt_last_screen_line && + _rl_last_c_pos == out && + _rl_last_c_pos < visible_first_line_len && + visible_wrap_offset && + visible_wrap_offset != wrap_offset) + { + if (mb_cur_max > 1 && rl_byte_oriented == 0) + nleft = _rl_screenwidth - _rl_last_c_pos; + else + nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos; + if (nleft) + _rl_clear_to_eol (nleft); + } +#endif + + /* 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, VIS_FACE(linenum)); + _rl_clear_to_eol + ((linenum == _rl_vis_botlin) ? strlen (tt) : _rl_screenwidth); + } + } + _rl_vis_botlin = inv_botlin; + + /* CHANGED_SCREEN_LINE is set to 1 if we have moved to a + different screen line during this redisplay. */ + changed_screen_line = _rl_last_v_pos != cursor_linenum; + if (changed_screen_line) + { + _rl_move_vert (cursor_linenum); + /* If we moved up to the line with the prompt using _rl_term_up, + the physical cursor position on the screen stays the same, + but the buffer position needs to be adjusted to account + for invisible characters. */ + if ((mb_cur_max == 1 || rl_byte_oriented) && cursor_linenum == 0 && wrap_offset) + _rl_last_c_pos += wrap_offset; + } + + /* Now we move the cursor to where it needs to be. First, make + sure we are on the correct line (cursor_linenum). */ + + /* 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. */ + /* XXX - why not use local_prompt_len? */ + nleft = prompt_visible_length + wrap_offset; + if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 && + _rl_last_c_pos < PROMPT_ENDING_INDEX && local_prompt) + { + _rl_cr (); + if (modmark) + _rl_output_some_chars ("*", 1); + + _rl_output_some_chars (local_prompt, nleft); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft, 1) - wrap_offset + modmark; + else + _rl_last_c_pos = nleft + modmark; + } + + /* Where on that line? And where does that line start + in the buffer? */ + pos = inv_lbreaks[cursor_linenum]; + /* nleft == number of characters (bytes) in the line buffer between + the start of the line and the desired cursor position. */ + nleft = cpos_buffer_position - pos; + + /* NLEFT is now a number of characters in a buffer. When in a + multibyte locale, however, _rl_last_c_pos is an absolute cursor + position that doesn't take invisible characters in the prompt + into account. We use a fudge factor to compensate. */ + + /* Since _rl_backspace() doesn't know about invisible characters in + the prompt, and there's no good way to tell it, we compensate for + those characters here and call _rl_backspace() directly if + necessary */ + if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos) + { + /* TX == new physical cursor position in multibyte locale. */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + tx = _rl_col_width (&visible_line[pos], 0, nleft, 1) - visible_wrap_offset; + else + tx = nleft; + if (tx >= 0 && _rl_last_c_pos > tx) + { + _rl_backspace (_rl_last_c_pos - tx); /* XXX */ + _rl_last_c_pos = tx; + } + } + + /* We need to note that in a multibyte locale we are dealing with + _rl_last_c_pos as an absolute cursor position, but moving to a + point specified by a buffer position (NLEFT) that doesn't take + invisible characters into account. */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + _rl_move_cursor_relative (nleft, &invisible_line[pos], &inv_face[pos]); + else if (nleft != _rl_last_c_pos) + _rl_move_cursor_relative (nleft, &invisible_line[pos], &inv_face[pos]); + } + } + else /* Do horizontal scrolling. Much simpler */ + { +#define M_OFFSET(margin, offset) ((margin) == 0 ? offset : 0) + int lmargin, ndisp, nleft, phys_c_pos, t; + + /* Always at top line. */ + _rl_last_v_pos = 0; + + /* Compute where in the buffer the displayed line should start. This + will be LMARGIN. */ + + /* The number of characters that will be displayed before the cursor. */ + ndisp = cpos_buffer_position - wrap_offset; + nleft = prompt_visible_length + wrap_offset; + /* Where the new cursor position will be on the screen. This can be + longer than SCREENWIDTH; if it is, lmargin will be adjusted. */ + phys_c_pos = cpos_buffer_position - (last_lmargin ? last_lmargin : wrap_offset); + t = _rl_screenwidth / 3; + + /* If the number of characters had already exceeded the screenwidth, + last_lmargin will be > 0. */ + + /* If the number of characters to be displayed is more than the screen + width, compute the starting offset so that the cursor is about + two-thirds of the way across the screen. */ + if (phys_c_pos > _rl_screenwidth - 2) + { + lmargin = cpos_buffer_position - (2 * t); + if (lmargin < 0) + lmargin = 0; + /* If the left margin would be in the middle of a prompt with + invisible characters, don't display the prompt at all. */ + if (wrap_offset && lmargin > 0 && lmargin < nleft) + lmargin = nleft; + } + else if (ndisp < _rl_screenwidth - 2) /* XXX - was -1 */ + lmargin = 0; + else if (phys_c_pos < 1) + { + /* If we are moving back towards the beginning of the line and + the last margin is no longer correct, compute a new one. */ + lmargin = ((cpos_buffer_position - 1) / t) * t; /* XXX */ + if (wrap_offset && lmargin > 0 && lmargin < nleft) + lmargin = nleft; + } + else + lmargin = last_lmargin; + + displaying_prompt_first_line = lmargin < nleft; + + /* 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) + invisible_line[lmargin] = '<'; + + /* If SCREENWIDTH characters starting at LMARGIN do not encompass + the whole line, indicate that with a special character at the + right edge of the screen. If LMARGIN is 0, we need to take the + wrap offset into account. */ + t = lmargin + M_OFFSET (lmargin, wrap_offset) + _rl_screenwidth; + if (t > 0 && t < out) + invisible_line[t - 1] = '>'; + + if (rl_display_fixed == 0 || forced_display || lmargin != last_lmargin) + { + forced_display = 0; + o_cpos = _rl_last_c_pos; + cpos_adjusted = 0; + update_line (&visible_line[last_lmargin], &vis_face[last_lmargin], + &invisible_line[lmargin], &inv_face[lmargin], + 0, + _rl_screenwidth + visible_wrap_offset, + _rl_screenwidth + (lmargin ? 0 : wrap_offset), + 0); + + if ((mb_cur_max > 1 && rl_byte_oriented == 0) && + displaying_prompt_first_line && OLD_CPOS_IN_PROMPT()) + _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */ + + /* 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) && displaying_prompt_first_line && + t < visible_first_line_len) + { + nleft = _rl_screenwidth - t; + _rl_clear_to_eol (nleft); + } + visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset); + if (visible_first_line_len > _rl_screenwidth) + visible_first_line_len = _rl_screenwidth; + + _rl_move_cursor_relative (cpos_buffer_position - lmargin, &invisible_line[lmargin], &inv_face[lmargin]); + last_lmargin = lmargin; + } + } + fflush (rl_outstream); + + /* Swap visible and non-visible lines. */ + { + struct line_state *vtemp = line_state_visible; + + line_state_visible = line_state_invisible; + line_state_invisible = vtemp; + + 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; + + _rl_quick_redisplay = 0; + } + + RL_UNSETSTATE (RL_STATE_REDISPLAYING); + _rl_release_sigint (); +} + +static void +putc_face (int c, int face, char *cur_face) +{ + char cf; + cf = *cur_face; + if (cf != face) + { + if (cf != FACE_NORMAL && cf != FACE_STANDOUT) + return; + if (face != FACE_NORMAL && face != FACE_STANDOUT) + return; + if (face == FACE_STANDOUT && cf == FACE_NORMAL) + _rl_region_color_on (); + if (face == FACE_NORMAL && cf == FACE_STANDOUT) + _rl_region_color_off (); + *cur_face = face; + } + if (c != EOF) + putc (c, rl_outstream); +} + +static void +puts_face (const char *str, const char *face, int n) +{ + int i; + char cur_face; + + for (cur_face = FACE_NORMAL, i = 0; i < n; i++) + putc_face ((unsigned char) str[i], face[i], &cur_face); + putc_face (EOF, FACE_NORMAL, &cur_face); +} + +static void +norm_face (char *face, int n) +{ + memset (face, FACE_NORMAL, n); +} + +#define ADJUST_CPOS(x) do { _rl_last_c_pos -= (x) ; cpos_adjusted = 1; } while (0) + +/* 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 (char *old, char *old_face, char *new, char *new_face, int current_line, int omax, int nmax, int inv_botlin) +{ + char *ofd, *ols, *oe, *nfd, *nls, *ne; + char *ofdf, *nfdf, *olsf, *nlsf; + int temp, lendiff, wsatend, od, nd, twidth, o_cpos; + int current_invis_chars; + int col_lendiff, col_temp; + int bytes_to_insert; + int mb_cur_max = MB_CUR_MAX; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps_new, ps_old; + int new_offset, old_offset; +#endif + + /* If we're at the right edge of a terminal that supports xn, we're + ready to wrap around, so do so. This fixes problems with knowing + the exact cursor position and cut-and-paste with certain terminal + emulators. In this calculation, TEMP is the physical screen + position of the cursor. */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + temp = _rl_last_c_pos; + else + temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset); + if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode + && _rl_last_v_pos == current_line - 1) + { + /* We're going to wrap around by writing the first character of NEW to + the screen and dealing with changes to what's visible by modifying + OLD to match it. Complicated by the presence of multi-width + characters at the end of the line or beginning of the new one. */ + /* old is always somewhere in visible_line; new is always somewhere in + invisible_line. These should always be null-terminated. */ +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + WCHAR_T wc; + mbstate_t ps; + int oldwidth, newwidth; + int oldbytes, newbytes; + size_t ret; + + /* This fixes only double-column characters, but if the wrapped + character consumes more than three columns, spaces will be + inserted in the string buffer. */ + /* XXX remember that we are working on the invisible line right now; + we don't swap visible and invisible until just before rl_redisplay + returns */ + /* This will remove the extra placeholder space we added with + _rl_wrapped_multicolumn */ + if (current_line < line_state_invisible->wbsize && line_state_invisible->wrapped_line[current_line] > 0) + _rl_clear_to_eol (line_state_invisible->wrapped_line[current_line]); + + /* 1. how many screen positions does first char in old consume? */ + memset (&ps, 0, sizeof (mbstate_t)); + ret = MBRTOWC (&wc, old, mb_cur_max, &ps); + oldbytes = ret; + if (MB_INVALIDCH (ret)) + { + oldwidth = 1; + oldbytes = 1; + } + else if (MB_NULLWCH (ret)) + oldwidth = 0; + else + oldwidth = WCWIDTH (wc); + if (oldwidth < 0) + oldwidth = 1; + + /* 2. how many screen positions does the first char in new consume? */ + memset (&ps, 0, sizeof (mbstate_t)); + ret = MBRTOWC (&wc, new, mb_cur_max, &ps); + newbytes = ret; + if (MB_INVALIDCH (ret)) + { + newwidth = 1; + newbytes = 1; + } + else if (MB_NULLWCH (ret)) + newwidth = 0; + else + newwidth = WCWIDTH (wc); + if (newwidth < 0) + newwidth = 1; + + /* 3. if the new width is less than the old width, we need to keep + going in new until we have consumed at least that many screen + positions, and figure out how many bytes that will take */ + while (newbytes < nmax && newwidth < oldwidth) + { + int t; + + ret = MBRTOWC (&wc, new+newbytes, mb_cur_max, &ps); + if (MB_INVALIDCH (ret)) + { + newwidth += 1; + newbytes += 1; + } + else if (MB_NULLWCH (ret)) + break; + else + { + t = WCWIDTH (wc); + newwidth += (t >= 0) ? t : 1; + newbytes += ret; + } + } + /* 4. If the new width is more than the old width, keep going in old + until we have consumed exactly that many screen positions, and + figure out how many bytes that will take. This is an optimization */ + while (oldbytes < omax && oldwidth < newwidth) + { + int t; + + ret = MBRTOWC (&wc, old+oldbytes, mb_cur_max, &ps); + if (MB_INVALIDCH (ret)) + { + oldwidth += 1; + oldbytes += 1; + } + else if (MB_NULLWCH (ret)) + break; + else + { + t = WCWIDTH (wc); + oldwidth += (t >= 0) ? t : 1; + oldbytes += ret; + } + } + /* 5. write the first newbytes of new, which takes newwidth. This is + where the screen wrapping takes place, and we are now writing + characters onto the new line. We need to fix up old so it + accurately reflects what is on the screen after the + _rl_output_some_chars below. */ + if (newwidth > 0) + { + int count, i, j; + char *optr; + + puts_face (new, new_face, newbytes); + _rl_last_c_pos = newwidth; + _rl_last_v_pos++; + + /* 5a. If the number of screen positions doesn't match, punt + and do a dumb update. + 5b. If the number of bytes is greater in the new line than + the old, do a dumb update, because there is no guarantee we + can extend the old line enough to fit the new bytes. */ + if (newwidth != oldwidth || newbytes > oldbytes) + { + oe = old + omax; + ne = new + nmax; + nd = newbytes; + nfd = new + nd; + ofdf = old_face + oldbytes; + nfdf = new_face + newbytes; + + goto dumb_update; + } + if (oldbytes != 0 && newbytes != 0) + { + /* We have written as many bytes from new as we need to + consume the first character of old. Fix up `old' so it + reflects the new screen contents. We use +1 in the + memmove call to copy the trailing NUL. */ + /* (strlen(old+oldbytes) == (omax - oldbytes - 1)) */ + + /* Don't bother trying to fit the bytes if the number of bytes + doesn't change. */ + if (oldbytes != newbytes) + { + memmove (old+newbytes, old+oldbytes, strlen (old+oldbytes) + 1); + memmove (old_face+newbytes, old_face+oldbytes, strlen (old+oldbytes) + 1); + } + memcpy (old, new, newbytes); + memcpy (old_face, new_face, newbytes); + j = newbytes - oldbytes; + omax += j; + /* Fix up indices if we copy data from one line to another */ + for (i = current_line+1; j != 0 && i <= inv_botlin+1 && i <=_rl_vis_botlin+1; i++) + vis_lbreaks[i] += j; + } + } + else + { + putc (' ', rl_outstream); + _rl_last_c_pos = 1; + _rl_last_v_pos++; + if (old[0] && new[0]) + { + old[0] = new[0]; + old_face[0] = new_face[0]; + } + } + } + else +#endif + { + if (new[0]) + puts_face (new, new_face, 1); + else + putc (' ', rl_outstream); + _rl_last_c_pos = 1; + _rl_last_v_pos++; + if (old[0] && new[0]) + { + old[0] = new[0]; + old_face[0] = new_face[0]; + } + } + } + + /* We know that we are dealing with a single screen line here */ + if (_rl_quick_redisplay) + { + nfd = new; + nfdf = new_face; + ofd = old; + ofdf = old_face; + for (od = 0, oe = ofd; od < omax && *oe; oe++, od++); + for (nd = 0, ne = nfd; nd < nmax && *ne; ne++, nd++); + od = nd = 0; + _rl_move_cursor_relative (0, old, old_face); + + bytes_to_insert = ne - nfd; + if (bytes_to_insert < local_prompt_len) /* ??? */ + goto dumb_update; + + /* output the prompt, output the line contents, clear the rest */ + _rl_output_some_chars (nfd, local_prompt_len); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + _rl_last_c_pos = prompt_physical_chars; + else + _rl_last_c_pos = local_prompt_len; + + bytes_to_insert -= local_prompt_len; + if (bytes_to_insert > 0) + { + puts_face (new+local_prompt_len, nfdf+local_prompt_len, bytes_to_insert); + if (mb_cur_max > 1 && rl_byte_oriented) + _rl_last_c_pos += _rl_col_width (new, local_prompt_len, ne-new, 1); + else + _rl_last_c_pos += bytes_to_insert; + } + + /* See comments at dumb_update: for an explanation of this heuristic */ + if (nmax < omax) + goto clear_rest_of_line; + else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset))) + goto clear_rest_of_line; + else + return; + } + + /* Find first difference. */ +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + /* See if the old line is a subset of the new line, so that the + only change is adding characters. */ + temp = (omax < nmax) ? omax : nmax; + if (memcmp (old, new, temp) == 0 && memcmp (old_face, new_face, temp) == 0) + { + new_offset = old_offset = temp; /* adding at the end */ + ofd = old + temp; + ofdf = old_face + temp; + nfd = new + temp; + nfdf = new_face + temp; + } + else + { + memset (&ps_new, 0, sizeof(mbstate_t)); + memset (&ps_old, 0, sizeof(mbstate_t)); + + /* Are the old and new lines the same? */ + if (omax == nmax && memcmp (new, old, omax) == 0 && memcmp (new_face, old_face, omax) == 0) + { + old_offset = omax; + new_offset = nmax; + ofd = old + omax; + ofdf = old_face + omax; + nfd = new + nmax; + nfdf = new_face + nmax; + } + else + { + /* Go through the line from the beginning and find the first + difference. We assume that faces change at (possibly multi- + byte) character boundaries. */ + new_offset = old_offset = 0; + for (ofd = old, ofdf = old_face, nfd = new, nfdf = new_face; + (ofd - old < omax) && *ofd && + _rl_compare_chars(old, old_offset, &ps_old, new, new_offset, &ps_new) && + *ofdf == *nfdf; ) + { + old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY); + new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY); + + ofd = old + old_offset; + ofdf = old_face + old_offset; + nfd = new + new_offset; + nfdf = new_face + new_offset; + } + } + } + } + else +#endif + for (ofd = old, ofdf = old_face, nfd = new, nfdf = new_face; + (ofd - old < omax) && *ofd && (*ofd == *nfd) && (*ofdf == *nfdf); + ofd++, nfd++, ofdf++, nfdf++) + ; + + /* 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; + +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0 && _rl_utf8locale) + { + WCHAR_T wc; + mbstate_t ps = { 0 }; + int t; + + /* If the first character in the difference is a zero-width character, + assume it's a combining character and back one up so the two base + characters no longer compare equivalently. */ + t = MBRTOWC (&wc, ofd, mb_cur_max, &ps); + if (t > 0 && UNICODE_COMBINING_CHAR (wc) && WCWIDTH (wc) == 0) + { + old_offset = _rl_find_prev_mbchar (old, ofd - old, MB_FIND_ANY); + new_offset = _rl_find_prev_mbchar (new, nfd - new, MB_FIND_ANY); + ofd = old + old_offset; /* equal by definition */ + ofdf = old_face + old_offset; + nfd = new + new_offset; + nfdf = new_face + new_offset; + } + } +#endif + + wsatend = 1; /* flag for trailing whitespace */ + +#if defined (HANDLE_MULTIBYTE) + /* Find the last character that is the same between the two lines. This + bounds the region that needs to change. */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY); + olsf = old_face + (ols - old); + nls = new + _rl_find_prev_mbchar (new, ne - new, MB_FIND_ANY); + nlsf = new_face + (nls - new); + + while ((ols > ofd) && (nls > nfd)) + { + memset (&ps_old, 0, sizeof (mbstate_t)); + memset (&ps_new, 0, sizeof (mbstate_t)); + + if (_rl_compare_chars (old, ols - old, &ps_old, new, nls - new, &ps_new) == 0 || + *olsf != *nlsf) + break; + + if (*ols == ' ') + wsatend = 0; + + ols = old + _rl_find_prev_mbchar (old, ols - old, MB_FIND_ANY); + olsf = old_face + (ols - old); + nls = new + _rl_find_prev_mbchar (new, nls - new, MB_FIND_ANY); + nlsf = new_face + (nls - new); + } + } + else + { +#endif /* HANDLE_MULTIBYTE */ + ols = oe - 1; /* find last same */ + olsf = old_face + (ols - old); + nls = ne - 1; + nlsf = new_face + (nls - new); + while ((ols > ofd) && (nls > nfd) && (*ols == *nls) && (*olsf == *nlsf)) + { + if (*ols != ' ') + wsatend = 0; + ols--; olsf--; + nls--; nlsf--; + } +#if defined (HANDLE_MULTIBYTE) + } +#endif + + if (wsatend) + { + ols = oe; + olsf = old_face + (ols - old); + nls = ne; + nlsf = new_face + (nls - new); + } +#if defined (HANDLE_MULTIBYTE) + /* This may not work for stateful encoding, but who cares? To handle + stateful encoding properly, we have to scan each string from the + beginning and compare. */ + else if (_rl_compare_chars (ols, 0, NULL, nls, 0, NULL) == 0 || *olsf != *nlsf) +#else + else if (*ols != *nls || *olsf != *nlsf) +#endif + { + if (*ols) /* don't step past the NUL */ + { + if (mb_cur_max > 1 && rl_byte_oriented == 0) + ols = old + _rl_find_next_mbchar (old, ols - old, 1, MB_FIND_ANY); + else + ols++; + } + if (*nls) + { + if (mb_cur_max > 1 && rl_byte_oriented == 0) + nls = new + _rl_find_next_mbchar (new, nls - new, 1, MB_FIND_ANY); + else + nls++; + } + olsf = old_face + (ols - old); + nlsf = new_face + (nls - new); + } + + /* 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); + /* We have moved up to a new screen line. This line may or may not have + invisible characters on it, but we do our best to recalculate + visible_wrap_offset based on what we know. */ + if (current_line == 0) + visible_wrap_offset = prompt_invis_chars_first_line; /* XXX */ +#if 0 /* XXX - not yet */ + else if (current_line == prompt_last_screen_line && wrap_offset > prompt_invis_chars_first_line) + visible_wrap_offset = wrap_offset - prompt_invis_chars_first_line +#endif + if ((mb_cur_max == 1 || rl_byte_oriented) && current_line == 0 && visible_wrap_offset) + _rl_last_c_pos += visible_wrap_offset; + } + + /* If this is the first line and there are invisible characters in the + prompt string, and the prompt string has not changed, and the current + cursor position is before the last invisible character in the prompt, + and the index of the character to move to is past the end of the prompt + string, then redraw the entire prompt string. We can only do this + reliably if the terminal supports a `cr' capability. + + This can also happen if the prompt string has changed, and the first + difference in the line is in the middle of the prompt string, after a + sequence of invisible characters (worst case) and before the end of + the prompt. In this case, we have to redraw the entire prompt string + so that the entire sequence of invisible characters is drawn. We need + to handle the worst case, when the difference is after (or in the middle + of) a sequence of invisible characters that changes the text color and + before the sequence that restores the text color to normal. Then we have + to make sure that the lines still differ -- if they don't, we can + return immediately. + + This is not an efficiency hack -- there is a problem with redrawing + portions of the prompt string if they contain terminal escape + sequences (like drawing the `unbold' sequence without a corresponding + `bold') that manifests itself on certain terminals. */ + + lendiff = local_prompt_len; + if (lendiff > nmax) + lendiff = nmax; + od = ofd - old; /* index of first difference in visible line */ + nd = nfd - new; /* nd, od are buffer indexes */ + if (current_line == 0 && !_rl_horizontal_scroll_mode && + _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 && + (((od > 0 || nd > 0) && (od <= prompt_last_invisible || nd <= prompt_last_invisible)) || + ((od >= lendiff) && _rl_last_c_pos < PROMPT_ENDING_INDEX))) + { + _rl_cr (); + if (modmark) + _rl_output_some_chars ("*", 1); + _rl_output_some_chars (local_prompt, lendiff); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + /* If we just output the entire prompt string we can take advantage + of knowing the number of physical characters in the prompt. If + the prompt wraps lines (lendiff clamped at nmax), we can't. */ + if (lendiff == local_prompt_len) + _rl_last_c_pos = prompt_physical_chars + modmark; + else + /* We take wrap_offset into account here so we can pass correct + information to _rl_move_cursor_relative. */ + _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff, 1) - wrap_offset + modmark; + cpos_adjusted = 1; + } + else + _rl_last_c_pos = lendiff + modmark; + + /* Now if we have printed the prompt string because the first difference + was within the prompt, see if we need to recompute where the lines + differ. Check whether where we are now is past the last place where + the old and new lines are the same and short-circuit now if we are. */ + if ((od <= prompt_last_invisible || nd <= prompt_last_invisible) && + omax == nmax && + lendiff > (ols-old) && lendiff > (nls-new)) + return; + + /* XXX - we need to fix up our calculations if we are now past the + old ofd/nfd and the prompt length (or line length) has changed. + We punt on the problem and do a dumb update. We'd like to be able + to just output the prompt from the beginning of the line up to the + first difference, but you don't know the number of invisible + characters in that case. + This needs a lot of work to be efficient, but it usually doesn't matter. */ + if ((od <= prompt_last_invisible || nd <= prompt_last_invisible)) + { + nfd = new + lendiff; /* number of characters we output above */ + nfdf = new_face + lendiff; + nd = lendiff; + + /* Do a dumb update and return */ +dumb_update: + temp = ne - nfd; + if (temp > 0) + { + puts_face (nfd, nfdf, temp); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + _rl_last_c_pos += _rl_col_width (new, nd, ne - new, 1); + /* Need to adjust here based on wrap_offset. Guess that if + this is the line containing the last line of the prompt + we need to adjust by + wrap_offset-prompt_invis_chars_first_line + on the assumption that this is the number of invisible + characters in the last line of the prompt. */ + if (wrap_offset > prompt_invis_chars_first_line && + current_line == prompt_last_screen_line && + prompt_physical_chars > _rl_screenwidth && + _rl_horizontal_scroll_mode == 0) + ADJUST_CPOS (wrap_offset - prompt_invis_chars_first_line); + + /* If we just output a new line including the prompt, and + the prompt includes invisible characters, we need to + account for them in the _rl_last_c_pos calculation, since + _rl_col_width does not. This happens when other code does + a goto dumb_update; */ + else if (current_line == 0 && + nfd == new && + prompt_invis_chars_first_line && + local_prompt_len <= temp && + wrap_offset >= prompt_invis_chars_first_line && + _rl_horizontal_scroll_mode == 0) + ADJUST_CPOS (prompt_invis_chars_first_line); + } + else + _rl_last_c_pos += temp; + } + /* This is a useful heuristic, but what we really want is to clear + if the new number of visible screen characters is less than the + old number of visible screen characters. If the prompt has changed, + we don't really have enough information about the visible line to + know for sure, so we use another heuristic calclulation below. */ + if (nmax < omax) + goto clear_rest_of_line; /* XXX */ + else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset))) + goto clear_rest_of_line; + else + return; + } + } + + o_cpos = _rl_last_c_pos; + + /* When this function returns, _rl_last_c_pos is correct, and an absolute + cursor position in multibyte mode, but a buffer index when not in a + multibyte locale. */ + _rl_move_cursor_relative (od, old, old_face); + +#if defined (HANDLE_MULTIBYTE) + /* We need to indicate that the cursor position is correct in the presence of + invisible characters in the prompt string. Let's see if setting this when + we make sure we're at the end of the drawn prompt string works. */ + if (current_line == 0 && mb_cur_max > 1 && rl_byte_oriented == 0 && + (_rl_last_c_pos > 0 || o_cpos > 0) && + _rl_last_c_pos == prompt_physical_chars) + cpos_adjusted = 1; +#endif + + /* if (len (new) > len (old)) + lendiff == difference in buffer (bytes) + col_lendiff == difference on screen (columns) + When not using multibyte characters, these are equal */ + lendiff = (nls - nfd) - (ols - ofd); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + int newchars, newwidth, newind; + int oldchars, oldwidth, oldind; + + newchars = nls - new; + oldchars = ols - old; + + /* If we can do it, try to adjust nls and ols so that nls-new will + contain the entire new prompt string. That way we can use + prompt_physical_chars and not have to recompute column widths. + _rl_col_width adds wrap_offset and expects the caller to compensate, + which we do below, so we do the same thing if we don't call + _rl_col_width. + We don't have to compare, since we know the characters are the same. + The check of differing numbers of invisible chars may be extraneous. + XXX - experimental */ + if (current_line == 0 && nfd == new && newchars > prompt_last_invisible && + newchars <= local_prompt_len && + local_prompt_len <= nmax && + current_invis_chars != visible_wrap_offset) + { + while (newchars < nmax && oldchars < omax && newchars < local_prompt_len) + { +#if defined (HANDLE_MULTIBYTE) + newind = _rl_find_next_mbchar (new, newchars, 1, MB_FIND_NONZERO); + oldind = _rl_find_next_mbchar (old, oldchars, 1, MB_FIND_NONZERO); + + nls += newind - newchars; + ols += oldind - oldchars; + + newchars = newind; + oldchars = oldind; +#else + nls++; ols++; + newchars++; oldchars++; +#endif + } + newwidth = (newchars == local_prompt_len) ? prompt_physical_chars + wrap_offset + : _rl_col_width (new, 0, nls - new, 1); + /* if we changed nls and ols, we need to recompute lendiff */ + lendiff = (nls - nfd) - (ols - ofd); + + nlsf = new_face + (nls - new); + olsf = old_face + (ols - old); + } + else + newwidth = _rl_col_width (new, nfd - new, nls - new, 1); + + oldwidth = _rl_col_width (old, ofd - old, ols - old, 1); + + col_lendiff = newwidth - oldwidth; + } + else + col_lendiff = lendiff; + + /* col_lendiff uses _rl_col_width(), which doesn't know about whether or not + the multibyte characters it counts are invisible, so unless we're printing + the entire prompt string (in which case we can use prompt_physical_chars) + the count is short by the number of bytes in the invisible multibyte + characters - the number of multibyte characters. + + We don't have a good way to solve this without moving to something like + a bitmap that indicates which characters are visible and which are + invisible. We fix it up (imperfectly) in the caller and by trying to use + the entire prompt string wherever we can. */ + + /* 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 && current_invis_chars != visible_wrap_offset) + { + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + lendiff += visible_wrap_offset - current_invis_chars; + col_lendiff += visible_wrap_offset - current_invis_chars; + } + else + { + lendiff += visible_wrap_offset - current_invis_chars; + col_lendiff = lendiff; + } + } + + /* We use temp as a count of the number of bytes from the first difference + to the end of the new line. col_temp is the corresponding number of + screen columns. A `dumb' update moves to the spot of first difference + and writes TEMP bytes. */ + /* Insert (diff (len (old), len (new)) ch. */ + temp = ne - nfd; + if (mb_cur_max > 1 && rl_byte_oriented == 0) + col_temp = _rl_col_width (new, nfd - new, ne - new, 1); + else + col_temp = temp; + + /* how many bytes from the new line buffer to write to the display */ + bytes_to_insert = nls - nfd; + + /* col_lendiff > 0 if we are adding characters to the line */ + if (col_lendiff > 0) /* XXX - was lendiff */ + { + /* Non-zero if we're increasing the number of lines. */ + int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin; + + /* If col_lendiff is > 0, implying that the new string takes up more + screen real estate than the old, but lendiff is < 0, meaning that it + takes fewer bytes, we need to just output the characters starting + from the first difference. These will overwrite what is on the + display, so there's no reason to do a smart update. This can really + only happen in a multibyte environment. */ + if (lendiff < 0) + { + puts_face (nfd, nfdf, temp); + _rl_last_c_pos += col_temp; + /* If nfd begins before any invisible characters in the prompt, + adjust _rl_last_c_pos to account for wrap_offset and set + cpos_adjusted to let the caller know. */ + if (current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible)) + ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ + return; + } + /* Sometimes it is cheaper to print the characters rather than + use the terminal's capabilities. If we're growing the number + of lines, make sure we actually cause the new line to wrap + around on auto-wrapping terminals. */ + else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl)) + { + /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and + _rl_horizontal_scroll_mode == 1, inserting the characters with + _rl_term_IC or _rl_term_ic will screw up the screen because of the + invisible characters. We need to just draw them. */ + /* The same thing happens if we're trying to draw before the last + invisible character in the prompt string or we're increasing the + number of invisible characters in the line and we're not drawing + the entire prompt string. */ + if (*ols && ((_rl_horizontal_scroll_mode && + _rl_last_c_pos == 0 && + lendiff > prompt_visible_length && + current_invis_chars > 0) == 0) && + (((mb_cur_max > 1 && rl_byte_oriented == 0) && + current_line == 0 && wrap_offset && + ((nfd - new) <= prompt_last_invisible) && + (col_lendiff < prompt_visible_length)) == 0) && + (visible_wrap_offset >= current_invis_chars)) + { + open_some_spaces (col_lendiff); + puts_face (nfd, nfdf, bytes_to_insert); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + _rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1); + else + _rl_last_c_pos += bytes_to_insert; + } + else if ((mb_cur_max == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0) + { + /* At the end of a line the characters do not have to + be "inserted". They can just be placed on the screen. */ + puts_face (nfd, nfdf, temp); + _rl_last_c_pos += col_temp; + return; + } + else /* just write from first difference to end of new line */ + { + puts_face (nfd, nfdf, temp); + _rl_last_c_pos += col_temp; + /* If nfd begins before the last invisible character in the + prompt, adjust _rl_last_c_pos to account for wrap_offset + and set cpos_adjusted to let the caller know. */ + if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible)) + ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ + return; + } + + if (bytes_to_insert > lendiff) + { + /* If nfd begins before the last invisible character in the + prompt, adjust _rl_last_c_pos to account for wrap_offset + and set cpos_adjusted to let the caller know. */ + if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible)) + ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ + } + } + else + { + /* cannot insert chars, write to EOL */ + puts_face (nfd, nfdf, temp); + _rl_last_c_pos += col_temp; + /* If we're in a multibyte locale and were before the last invisible + char in the current line (which implies we just output some invisible + characters) we need to adjust _rl_last_c_pos, since it represents + a physical character position. */ + /* The current_line*rl_screenwidth+prompt_invis_chars_first_line is a + crude attempt to compute how far into the new line buffer we are. + It doesn't work well in the face of multibyte characters and needs + to be rethought. XXX */ + if ((mb_cur_max > 1 && rl_byte_oriented == 0) && + current_line == prompt_last_screen_line && wrap_offset && + displaying_prompt_first_line && + wrap_offset != prompt_invis_chars_first_line && + ((nfd-new) < (prompt_last_invisible-(current_line*_rl_screenwidth+prompt_invis_chars_first_line)))) + ADJUST_CPOS (wrap_offset - prompt_invis_chars_first_line); + + /* What happens if wrap_offset == prompt_invis_chars_first_line + and we are drawing the first line (current_line == 0), or if we + are drawing the first line and changing the number of invisible + characters in the line? If we're starting to draw before the last + invisible character in the prompt, we need to adjust by + _rl_last_c_pos -= prompt_invis_chars_first_line. This can happen + when we finish reading a digit argument (with the "(arg: N)" + prompt) and are switching back to displaying a line with a prompt + containing invisible characters, since we have to redraw the + entire prompt string. */ + if ((mb_cur_max > 1 && rl_byte_oriented == 0) && + current_line == 0 && wrap_offset && + displaying_prompt_first_line && + wrap_offset == prompt_invis_chars_first_line && + visible_wrap_offset != current_invis_chars && + visible_wrap_offset != prompt_invis_chars_first_line && + ((nfd-new) < prompt_last_invisible)) + ADJUST_CPOS (prompt_invis_chars_first_line); + } + } + else /* Delete characters from line. */ + { + /* If possible and inexpensive to use terminal deletion, then do so. */ + if (_rl_term_dc && (2 * col_temp) >= -col_lendiff) + { + /* If all we're doing is erasing the invisible characters in the + prompt string, don't bother. It screws up the assumptions + about what's on the screen. */ + if (_rl_horizontal_scroll_mode && _rl_last_c_pos == 0 && + displaying_prompt_first_line && + -lendiff == visible_wrap_offset) + col_lendiff = 0; + + /* If we have moved lmargin and we're shrinking the line, we've + already moved the cursor to the first character of the new line, + so deleting -col_lendiff characters will mess up the cursor + position calculation */ + if (_rl_horizontal_scroll_mode && displaying_prompt_first_line == 0 && + col_lendiff && _rl_last_c_pos < -col_lendiff) + col_lendiff = 0; + + if (col_lendiff) + delete_chars (-col_lendiff); /* delete (diff) characters */ + + /* Copy (new) chars to screen from first diff to last match, + overwriting what is there. */ + if (bytes_to_insert > 0) + { + /* If nfd begins at the prompt, or before the invisible + characters in the prompt, we need to adjust _rl_last_c_pos + in a multibyte locale to account for the wrap offset and + set cpos_adjusted accordingly. */ + puts_face (nfd, nfdf, bytes_to_insert); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + /* This still doesn't take into account whether or not the + characters that this counts are invisible. */ + _rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1); + if (current_line == 0 && wrap_offset && + displaying_prompt_first_line && + prompt_invis_chars_first_line && + _rl_last_c_pos >= prompt_invis_chars_first_line && + ((nfd - new) <= prompt_last_invisible)) + ADJUST_CPOS (prompt_invis_chars_first_line); + +#if 1 +#ifdef HANDLE_MULTIBYTE + /* If we write a non-space into the last screen column, + remove the note that we added a space to compensate for + a multibyte double-width character that didn't fit, since + it's only valid for what was previously there. */ + /* XXX - watch this */ + if (_rl_last_c_pos == _rl_screenwidth && + line_state_invisible->wrapped_line[current_line+1] && + nfd[bytes_to_insert-1] != ' ') + line_state_invisible->wrapped_line[current_line+1] = 0; +#endif +#endif + } + else + _rl_last_c_pos += bytes_to_insert; + + /* XXX - we only want to do this if we are at the end of the line + so we move there with _rl_move_cursor_relative */ + if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new))) + { + _rl_move_cursor_relative (ne-new, new, new_face); + goto clear_rest_of_line; + } + } + } + /* Otherwise, print over the existing material. */ + else + { + if (temp > 0) + { + /* If nfd begins at the prompt, or before the invisible + characters in the prompt, we need to adjust _rl_last_c_pos + in a multibyte locale to account for the wrap offset and + set cpos_adjusted accordingly. */ + puts_face (nfd, nfdf, temp); + _rl_last_c_pos += col_temp; /* XXX */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + if (current_line == 0 && wrap_offset && + displaying_prompt_first_line && + _rl_last_c_pos > wrap_offset && + ((nfd - new) <= prompt_last_invisible)) + ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ + } + } +clear_rest_of_line: + lendiff = (oe - old) - (ne - new); + if (mb_cur_max > 1 && rl_byte_oriented == 0) + col_lendiff = _rl_col_width (old, 0, oe - old, 1) - _rl_col_width (new, 0, ne - new, 1); + else + col_lendiff = lendiff; + + /* If we've already printed over the entire width of the screen, + including the old material, then col_lendiff doesn't matter and + space_to_eol will insert too many spaces. XXX - maybe we should + adjust col_lendiff based on the difference between _rl_last_c_pos + and _rl_screenwidth */ + if (col_lendiff && ((mb_cur_max == 1 || rl_byte_oriented) || (_rl_last_c_pos < _rl_screenwidth))) + { + if (_rl_term_autowrap && current_line < inv_botlin) + space_to_eol (col_lendiff); + else + _rl_clear_to_eol (col_lendiff); + } + } + } +} + +/* Tell the update routines that we have moved onto a new (empty) line. */ +int +rl_on_new_line (void) +{ + 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; +} + +/* Clear all screen lines occupied by the current readline line buffer + (visible line) */ +int +rl_clear_visible_line (void) +{ + int curr_line; + + /* Make sure we move to column 0 so we clear the entire line */ + _rl_cr (); + _rl_last_c_pos = 0; + + /* Move to the last screen line of the current visible line */ + _rl_move_vert (_rl_vis_botlin); + + /* And erase screen lines going up to line 0 (first visible line) */ + for (curr_line = _rl_last_v_pos; curr_line >= 0; curr_line--) + { + _rl_move_vert (curr_line); + _rl_clear_to_eol (_rl_screenwidth); + _rl_cr (); /* in case we use space_to_eol() */ + } + + return 0; +} + +/* Tell the update routines that we have moved onto a new line with the + prompt already displayed. Code originally from the version of readline + distributed with CLISP. rl_expand_prompt must have already been called + (explicitly or implicitly). This still doesn't work exactly right; it + should use expand_prompt() */ +int +rl_on_new_line_with_prompt (void) +{ + int prompt_size, i, l, real_screenwidth, newlines; + char *prompt_last_line, *lprompt; + + /* Initialize visible_line and invisible_line to ensure that they can hold + the already-displayed prompt. */ + prompt_size = strlen (rl_prompt) + 1; + init_line_structures (prompt_size); + + /* Make sure the line structures hold the already-displayed prompt for + redisplay. */ + lprompt = local_prompt ? local_prompt : rl_prompt; + strcpy (visible_line, lprompt); + strcpy (invisible_line, lprompt); + + /* If the prompt contains newlines, take the last tail. */ + prompt_last_line = strrchr (rl_prompt, '\n'); + if (!prompt_last_line) + prompt_last_line = rl_prompt; + + l = strlen (prompt_last_line); + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l, 1); /* XXX */ + else + _rl_last_c_pos = l; + + /* Dissect prompt_last_line into screen lines. Note that here we have + to use the real screenwidth. Readline's notion of screenwidth might be + one less, see terminal.c. */ + real_screenwidth = _rl_screenwidth + (_rl_term_autowrap ? 0 : 1); + _rl_last_v_pos = l / real_screenwidth; + /* If the prompt length is a multiple of real_screenwidth, we don't know + whether the cursor is at the end of the last line, or already at the + beginning of the next line. Output a newline just to be safe. */ + if (l > 0 && (l % real_screenwidth) == 0) + _rl_output_some_chars ("\n", 1); + last_lmargin = 0; + + newlines = 0; i = 0; + while (i <= l) + { + _rl_vis_botlin = newlines; + vis_lbreaks[newlines++] = i; + i += real_screenwidth; + } + vis_lbreaks[newlines] = l; + visible_wrap_offset = 0; + + rl_display_prompt = rl_prompt; /* XXX - make sure it's set */ + + return 0; +} + +/* Actually update the display, period. */ +int +rl_forced_update_display (void) +{ + register char *temp; + + if (visible_line) + { + temp = visible_line; + while (*temp) + *temp++ = '\0'; + } + rl_on_new_line (); + forced_display++; + (*rl_redisplay_function) (); + return 0; +} + +/* Redraw only the last line of a multi-line prompt. */ +void +rl_redraw_prompt_last_line (void) +{ + char *t; + + t = strrchr (rl_display_prompt, '\n'); + if (t) + redraw_prompt (++t); + else + rl_forced_update_display (); +} + +/* Move the cursor from _rl_last_c_pos to NEW, which are buffer indices. + (Well, when we don't have multibyte characters, _rl_last_c_pos is a + buffer index.) + DATA is the contents of the screen line of interest; i.e., where + the movement is being done. + DATA is always the visible line or the invisible line */ +static void +_rl_move_cursor_relative (int new, const char *data, const char *dataf) +{ + register int i; + int woff; /* number of invisible chars on current line */ + int cpos, dpos; /* current and desired cursor positions */ + int adjust; + int in_invisline; + int mb_cur_max = MB_CUR_MAX; + + woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset); + cpos = _rl_last_c_pos; + + if (cpos == 0 && cpos == new) + return; + +#if defined (HANDLE_MULTIBYTE) + /* If we have multibyte characters, NEW is indexed by the buffer point in + a multibyte string, but _rl_last_c_pos is the display position. In + this case, NEW's display position is not obvious and must be + calculated. We need to account for invisible characters in this line, + as long as we are past them and they are counted by _rl_col_width. */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + adjust = 1; + /* Try to short-circuit common cases and eliminate a bunch of multibyte + character function calls. */ + /* 1. prompt string */ + if (new == local_prompt_len && memcmp (data, local_prompt, new) == 0) + { + dpos = prompt_physical_chars; + cpos_adjusted = 1; + adjust = 0; + } + /* 2. prompt_string + line contents */ + else if (new > local_prompt_len && local_prompt && memcmp (data, local_prompt, local_prompt_len) == 0) + { + dpos = prompt_physical_chars + _rl_col_width (data, local_prompt_len, new, 1); + cpos_adjusted = 1; + adjust = 0; + } + else + dpos = _rl_col_width (data, 0, new, 1); + + if (displaying_prompt_first_line == 0) + adjust = 0; + + /* yet another special case: printing the last line of a prompt with + multibyte characters and invisible characters whose printable length + exceeds the screen width with the last invisible character + (prompt_last_invisible) in the last line. IN_INVISLINE is the + offset of DATA in invisible_line */ + in_invisline = 0; + if (data > invisible_line && data < invisible_line+inv_lbreaks[_rl_inv_botlin+1]) + in_invisline = data - invisible_line; + + /* Use NEW when comparing against the last invisible character in the + prompt string, since they're both buffer indices and DPOS is a + desired display position. */ + /* NEW is relative to the current displayed line, while + PROMPT_LAST_INVISIBLE is relative to the entire (wrapped) line. + Need a way to reconcile these two variables by turning NEW into a + buffer position relative to the start of the line */ + if (adjust && ((new > prompt_last_invisible) || /* XXX - don't use woff here */ + (new+in_invisline > prompt_last_invisible) || /* invisible line */ + (prompt_physical_chars >= _rl_screenwidth && /* visible line */ + _rl_last_v_pos == prompt_last_screen_line && + wrap_offset >= woff && dpos >= woff && + new > (prompt_last_invisible-(vis_lbreaks[_rl_last_v_pos])-wrap_offset)))) + /* XXX last comparison might need to be >= */ + { + dpos -= woff; + /* Since this will be assigned to _rl_last_c_pos at the end (more + precisely, _rl_last_c_pos == dpos when this function returns), + let the caller know. */ + cpos_adjusted = 1; + } + } + else +#endif + dpos = new; + + /* If we don't have to do anything, then return. */ + if (cpos == dpos) + return; + + /* It may be faster to output a CR, and then move forwards instead + of moving backwards. */ + /* i == current physical cursor position. */ +#if defined (HANDLE_MULTIBYTE) + if (mb_cur_max > 1 && rl_byte_oriented == 0) + i = _rl_last_c_pos; + else +#endif + i = _rl_last_c_pos - woff; + if (dpos == 0 || CR_FASTER (dpos, _rl_last_c_pos) || + (_rl_term_autowrap && i == _rl_screenwidth)) + { + _rl_cr (); + cpos = _rl_last_c_pos = 0; + } + + if (cpos < dpos) + { + /* Move the cursor forward. We do it by printing the command + to move the cursor forward if there is one, else print that + portion of the output buffer again. Which is cheaper? */ + + /* The above comment is left here for posterity. It is faster + to print one character (non-control) than to print a control + sequence telling the terminal to move forward one character. + That kind of control is for people who don't know what the + data is underneath the cursor. */ + + /* However, we need a handle on where the current display position is + in the buffer for the immediately preceding comment to be true. + In multibyte locales, we don't currently have that info available. + Without it, we don't know where the data we have to display begins + in the buffer and we have to go back to the beginning of the screen + line. In this case, we can use the terminal sequence to move forward + if it's available. */ + if (mb_cur_max > 1 && rl_byte_oriented == 0) + { + if (_rl_term_forward_char) + { + for (i = cpos; i < dpos; i++) + tputs (_rl_term_forward_char, 1, _rl_output_character_function); + } + else + { + _rl_cr (); + puts_face (data, dataf, new); + } + } + else + puts_face (data + cpos, dataf + cpos, new - cpos); + } + +#if defined (HANDLE_MULTIBYTE) + /* NEW points to the buffer point, but _rl_last_c_pos is the display point. + The byte length of the string is probably bigger than the column width + of the string, which means that if NEW == _rl_last_c_pos, then NEW's + display point is less than _rl_last_c_pos. */ +#endif + else if (cpos > dpos) + _rl_backspace (cpos - dpos); + + _rl_last_c_pos = dpos; +} + +/* PWP: move the cursor up or down. */ +void +_rl_move_vert (int to) +{ + register int delta, i; + + if (_rl_last_v_pos == to || to > _rl_screenheight) + return; + + if ((delta = to - _rl_last_v_pos) > 0) + { + for (i = 0; i < delta; i++) + putc ('\n', rl_outstream); + _rl_cr (); + _rl_last_c_pos = 0; + } + else + { /* delta < 0 */ +#ifdef __DJGPP__ + int row, col; + + fflush (rl_outstream); + ScreenGetCursor (&row, &col); + ScreenSetCursor (row + delta, col); + i = -delta; +#else + if (_rl_term_up && *_rl_term_up) + for (i = 0; i < -delta; i++) + tputs (_rl_term_up, 1, _rl_output_character_function); +#endif /* !__DJGPP__ */ + } + + _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 (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 (int c, int pos) +{ + unsigned char uc; + + uc = (unsigned char)c; + + if (META_CHAR (uc)) + return ((_rl_output_meta_chars == 0) ? 4 : 1); + + if (uc == '\t') + { +#if defined (DISPLAY_TABS) + return (((pos | 7) + 1) - pos); +#else + return (2); +#endif /* !DISPLAY_TABS */ + } + + if (CTRL_CHAR (c) || c == RUBOUT) + return (2); + + return ((ISPRINT (uc)) ? 1 : 2); +} +/* How to print things in the "echo-area". The prompt is treated as a + mini-modeline. */ +static int msg_saved_prompt = 0; + +#if defined (USE_VARARGS) +int +#if defined (PREFER_STDARG) +rl_message (const char *format, ...) +#else +rl_message (va_alist) + va_dcl +#endif +{ + va_list args; +#if defined (PREFER_VARARGS) + char *format; +#endif +#if defined (HAVE_VSNPRINTF) + int bneed; +#endif + +#if defined (PREFER_STDARG) + va_start (args, format); +#else + va_start (args); + format = va_arg (args, char *); +#endif + + if (msg_buf == 0) + msg_buf = xmalloc (msg_bufsiz = 128); + +#if defined (HAVE_VSNPRINTF) + bneed = vsnprintf (msg_buf, msg_bufsiz, format, args); + if (bneed >= msg_bufsiz - 1) + { + msg_bufsiz = bneed + 1; + msg_buf = xrealloc (msg_buf, msg_bufsiz); + va_end (args); + +#if defined (PREFER_STDARG) + va_start (args, format); +#else + va_start (args); + format = va_arg (args, char *); +#endif + vsnprintf (msg_buf, msg_bufsiz - 1, format, args); + } +#else + vsprintf (msg_buf, format, args); + msg_buf[msg_bufsiz - 1] = '\0'; /* overflow? */ +#endif + va_end (args); + + if (saved_local_prompt == 0) + { + rl_save_prompt (); + msg_saved_prompt = 1; + } + else if (local_prompt != saved_local_prompt) + { + FREE (local_prompt); + FREE (local_prompt_prefix); + local_prompt = (char *)NULL; + } + rl_display_prompt = msg_buf; + local_prompt = expand_prompt (msg_buf, 0, &prompt_visible_length, + &prompt_last_invisible, + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)NULL; + local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + (*rl_redisplay_function) (); + + return 0; +} +#else /* !USE_VARARGS */ +int +rl_message (format, arg1, arg2) + char *format; +{ + if (msg_buf == 0) + msg_buf = xmalloc (msg_bufsiz = 128); + + sprintf (msg_buf, format, arg1, arg2); + msg_buf[msg_bufsiz - 1] = '\0'; /* overflow? */ + + rl_display_prompt = msg_buf; + if (saved_local_prompt == 0) + { + rl_save_prompt (); + msg_saved_prompt = 1; + } + else if (local_prompt != saved_local_prompt) + { + FREE (local_prompt); + FREE (local_prompt_prefix); + local_prompt = (char *)NULL; + } + local_prompt = expand_prompt (msg_buf, 0, &prompt_visible_length, + &prompt_last_invisible, + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)NULL; + local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + (*rl_redisplay_function) (); + + return 0; +} +#endif /* !USE_VARARGS */ + +/* How to clear things from the "echo-area". */ +int +rl_clear_message (void) +{ + rl_display_prompt = rl_prompt; + if (msg_saved_prompt) + { + rl_restore_prompt (); + msg_saved_prompt = 0; + } + (*rl_redisplay_function) (); + return 0; +} + +int +rl_reset_line_state (void) +{ + rl_on_new_line (); + + rl_display_prompt = rl_prompt ? rl_prompt : ""; + forced_display = 1; + return 0; +} + +/* Save all of the variables associated with the prompt and its display. Most + of the complexity is dealing with the invisible characters in the prompt + string and where they are. There are enough of these that I should consider + a struct. */ +void +rl_save_prompt (void) +{ + saved_local_prompt = local_prompt; + saved_local_prefix = local_prompt_prefix; + saved_prefix_length = prompt_prefix_length; + saved_local_length = local_prompt_len; + saved_last_invisible = prompt_last_invisible; + saved_visible_length = prompt_visible_length; + saved_invis_chars_first_line = prompt_invis_chars_first_line; + saved_physical_chars = prompt_physical_chars; + saved_local_prompt_newlines = local_prompt_newlines; + + local_prompt = local_prompt_prefix = (char *)0; + local_prompt_len = 0; + local_prompt_newlines = (int *)0; + + prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0; + prompt_invis_chars_first_line = prompt_physical_chars = 0; +} + +void +rl_restore_prompt (void) +{ + FREE (local_prompt); + FREE (local_prompt_prefix); + FREE (local_prompt_newlines); + + local_prompt = saved_local_prompt; + local_prompt_prefix = saved_local_prefix; + local_prompt_len = saved_local_length; + local_prompt_newlines = saved_local_prompt_newlines; + + prompt_prefix_length = saved_prefix_length; + prompt_last_invisible = saved_last_invisible; + prompt_visible_length = saved_visible_length; + prompt_invis_chars_first_line = saved_invis_chars_first_line; + prompt_physical_chars = saved_physical_chars; + + /* can test saved_local_prompt to see if prompt info has been saved. */ + saved_local_prompt = saved_local_prefix = (char *)0; + saved_local_length = 0; + saved_last_invisible = saved_visible_length = saved_prefix_length = 0; + saved_invis_chars_first_line = saved_physical_chars = 0; + saved_local_prompt_newlines = 0; +} + +char * +_rl_make_prompt_for_search (int pchar) +{ + int len; + char *pmt, *p; + + rl_save_prompt (); + + /* We've saved the prompt, and can do anything with the various prompt + strings we need before they're restored. We want the unexpanded + portion of the prompt string after any final newline. */ + p = rl_prompt ? strrchr (rl_prompt, '\n') : 0; + if (p == 0) + { + len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0; + pmt = (char *)xmalloc (len + 2); + if (len) + strcpy (pmt, rl_prompt); + pmt[len] = pchar; + pmt[len+1] = '\0'; + } + else + { + p++; + len = strlen (p); + pmt = (char *)xmalloc (len + 2); + if (len) + strcpy (pmt, p); + pmt[len] = pchar; + pmt[len+1] = '\0'; + } + + /* will be overwritten by expand_prompt, called from rl_message */ + prompt_physical_chars = saved_physical_chars + 1; + return pmt; +} + +/* Quick redisplay hack when erasing characters at the end of the line. */ +void +_rl_erase_at_end_of_line (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, but we use a terminal escape + sequence if available. */ +void +_rl_clear_to_eol (int count) +{ +#ifndef __MSDOS__ + if (_rl_term_clreol) + tputs (_rl_term_clreol, 1, _rl_output_character_function); + else +#endif + 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 (int count) +{ + register int i; + + for (i = 0; i < count; i++) + putc (' ', rl_outstream); + + _rl_last_c_pos += count; +} + +void +_rl_clear_screen (int clrscr) +{ +#if defined (__DJGPP__) + ScreenClear (); + ScreenSetCursor (0, 0); +#else + if (_rl_term_clrpag) + { + tputs (_rl_term_clrpag, 1, _rl_output_character_function); + if (clrscr && _rl_term_clrscroll) + tputs (_rl_term_clrscroll, 1, _rl_output_character_function); + } + else + rl_crlf (); +#endif /* __DJGPP__ */ +} + +/* Insert COUNT characters from STRING to the output stream at column COL. */ +static void +insert_some_chars (char *string, int count, int col) +{ + open_some_spaces (col); + _rl_output_some_chars (string, count); +} + +/* Insert COL spaces, keeping the cursor at the same position. We follow the + ncurses documentation and use either im/ei with explicit spaces, or IC/ic + by itself. We assume there will either be ei or we don't need to use it. */ +static void +open_some_spaces (int col) +{ +#if !defined (__MSDOS__) && (!defined (__MINGW32__) || defined (NCURSES_VERSION)) + char *buffer; + register int i; + + /* If IC is defined, then we do not have to "enter" insert mode. */ + if (_rl_term_IC) + { + buffer = tgoto (_rl_term_IC, 0, col); + tputs (buffer, 1, _rl_output_character_function); + } + else if (_rl_term_im && *_rl_term_im) + { + tputs (_rl_term_im, 1, _rl_output_character_function); + /* just output the desired number of spaces */ + for (i = col; i--; ) + _rl_output_character_function (' '); + /* If there is a string to turn off insert mode, use it now. */ + if (_rl_term_ei && *_rl_term_ei) + tputs (_rl_term_ei, 1, _rl_output_character_function); + /* and move back the right number of spaces */ + _rl_backspace (col); + } + else if (_rl_term_ic && *_rl_term_ic) + { + /* If there is a special command for inserting characters, then + use that first to open up the space. */ + for (i = col; i--; ) + tputs (_rl_term_ic, 1, _rl_output_character_function); + } +#endif /* !__MSDOS__ && (!__MINGW32__ || NCURSES_VERSION)*/ +} + +/* Delete COUNT characters from the display line. */ +static void +delete_chars (int count) +{ + if (count > _rl_screenwidth) /* XXX */ + return; + +#if !defined (__MSDOS__) && (!defined (__MINGW32__) || defined (NCURSES_VERSION)) + if (_rl_term_DC && *_rl_term_DC) + { + char *buffer; + buffer = tgoto (_rl_term_DC, count, count); + tputs (buffer, count, _rl_output_character_function); + } + else + { + if (_rl_term_dc && *_rl_term_dc) + while (count--) + tputs (_rl_term_dc, 1, _rl_output_character_function); + } +#endif /* !__MSDOS__ && (!__MINGW32__ || NCURSES_VERSION)*/ +} + +void +_rl_update_final (void) +{ + int full_lines, woff, botline_length; + + if (line_structures_initialized == 0) + return; + + 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); + woff = W_OFFSET(_rl_vis_botlin, wrap_offset); + botline_length = VIS_LLEN(_rl_vis_botlin) - woff; + /* If we've wrapped lines, remove the final xterm line-wrap flag. */ + if (full_lines && _rl_term_autowrap && botline_length == _rl_screenwidth) + { + char *last_line, *last_face; + + /* LAST_LINE includes invisible characters, so if you want to get the + last character of the first line, you have to take WOFF into account. + This needs to be done for both calls to _rl_move_cursor_relative, + which takes a buffer position as the first argument, and any direct + subscripts of LAST_LINE. */ + last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]]; /* = VIS_CHARS(_rl_vis_botlin); */ + last_face = &vis_face[vis_lbreaks[_rl_vis_botlin]]; /* = VIS_CHARS(_rl_vis_botlin); */ + cpos_buffer_position = -1; /* don't know where we are in buffer */ + _rl_move_cursor_relative (_rl_screenwidth - 1 + woff, last_line, last_face); /* XXX */ + _rl_clear_to_eol (0); + puts_face (&last_line[_rl_screenwidth - 1 + woff], + &last_face[_rl_screenwidth - 1 + woff], 1); + } + _rl_vis_botlin = 0; + if (botline_length > 0 || _rl_last_c_pos > 0) + rl_crlf (); + fflush (rl_outstream); + rl_display_fixed++; +} + +/* Move to the start of the current line. */ +static void +cr (void) +{ + _rl_cr (); + _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 (char *t) +{ + char *oldp; + + oldp = rl_display_prompt; + rl_save_prompt (); + + rl_display_prompt = t; + local_prompt = expand_prompt (t, PMT_MULTILINE, + &prompt_visible_length, + &prompt_last_invisible, + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)NULL; + local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + + rl_forced_update_display (); + + rl_display_prompt = oldp; + rl_restore_prompt(); +} + +/* Redisplay the current line after a SIGWINCH is received. */ +void +_rl_redisplay_after_sigwinch (void) +{ + char *t; + + /* Clear the last line (assuming that the screen size change will result in + either more or fewer characters on that line only) and put the cursor at + column 0. Make sure the right thing happens if we have wrapped to a new + screen line. */ + if (_rl_term_cr) + { + rl_clear_visible_line (); + if (_rl_last_v_pos > 0) + _rl_move_vert (0); + } + else + rl_crlf (); + + if (_rl_screenwidth < prompt_visible_length) + _rl_reset_prompt (); /* update local_prompt_newlines array */ + + /* 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 (void) +{ + if (_rl_echoing_p) + { + if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */ + _rl_move_vert (_rl_vis_botlin); + _rl_vis_botlin = 0; + fflush (rl_outstream); + rl_restart_output (1, 0); + } +} + +void +_rl_erase_entire_line (void) +{ + cr (); + _rl_clear_to_eol (0); + cr (); + fflush (rl_outstream); +} + +void +_rl_ttyflush (void) +{ + 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 (void) +{ + int ret, nleft; + + /* Find out whether or not there might be invisible characters in the + editing buffer. */ + if (rl_display_prompt == rl_prompt) + nleft = _rl_last_c_pos - _rl_screenwidth - rl_visible_prompt_length; + else + nleft = _rl_last_c_pos - _rl_screenwidth; + + if (nleft > 0) + ret = 1 + nleft / _rl_screenwidth; + else + ret = 0; + + return ret; +} + +void +_rl_refresh_line (void) +{ + rl_clear_visible_line (); + rl_redraw_prompt_last_line (); + rl_keep_mark_active (); +} + +#if defined (HANDLE_MULTIBYTE) +/* Calculate the number of screen columns occupied by STR from START to END. + In the case of multibyte characters with stateful encoding, we have to + scan from the beginning of the string to take the state into account. */ +static int +_rl_col_width (const char *str, int start, int end, int flags) +{ + WCHAR_T wc; + mbstate_t ps; + int tmp, point, width, max; + + if (end <= start) + return 0; + if (MB_CUR_MAX == 1 || rl_byte_oriented) + /* this can happen in some cases where it's inconvenient to check */ + return (end - start); + + memset (&ps, 0, sizeof (mbstate_t)); + + point = 0; + max = end; + + /* Try to short-circuit common cases. The adjustment to remove wrap_offset + is done by the caller. */ + /* 1. prompt string */ + if (flags && start == 0 && end == local_prompt_len && memcmp (str, local_prompt, local_prompt_len) == 0) + return (prompt_physical_chars + wrap_offset); + /* 2. prompt string + line contents */ + else if (flags && start == 0 && local_prompt_len > 0 && end > local_prompt_len && local_prompt && memcmp (str, local_prompt, local_prompt_len) == 0) + { + tmp = prompt_physical_chars + wrap_offset; + /* XXX - try to call ourselves recursively with non-prompt portion */ + tmp += _rl_col_width (str, local_prompt_len, end, flags); + return (tmp); + } + + while (point < start) + { + if (_rl_utf8locale && UTF8_SINGLEBYTE(str[point])) + { + memset (&ps, 0, sizeof (mbstate_t)); + tmp = 1; + } + else + tmp = mbrlen (str + point, max, &ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* In this case, the bytes are invalid or too short to compose a + multibyte character, so we assume that the first byte represents + a single character. */ + point++; + max--; + + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (MB_NULLWCH (tmp)) + break; /* Found '\0' */ + else + { + point += tmp; + max -= tmp; + } + } + + /* If START is not a byte that starts a character, then POINT will be + greater than START. In this case, assume that (POINT - START) gives + a byte count that is the number of columns of difference. */ + width = point - start; + + while (point < end) + { + if (_rl_utf8locale && UTF8_SINGLEBYTE(str[point])) + { + tmp = 1; + wc = (WCHAR_T) str[point]; + } + else + tmp = MBRTOWC (&wc, str + point, max, &ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* In this case, the bytes are invalid or too short to compose a + multibyte character, so we assume that the first byte represents + a single character. */ + point++; + max--; + + /* and assume that the byte occupies a single column. */ + width++; + + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (MB_NULLWCH (tmp)) + break; /* Found '\0' */ + else + { + point += tmp; + max -= tmp; + tmp = WCWIDTH(wc); + width += (tmp >= 0) ? tmp : 1; + } + } + + width += point - end; + + return width; +} +#endif /* HANDLE_MULTIBYTE */ diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..20a3618 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,272 @@ +# This makefile for Readline library documentation is in -*- text -*- mode. +# Emacs likes it that way. + +# Copyright (C) 1996-2009 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 3 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, see . + +PACKAGE_TARNAME = @PACKAGE_TARNAME@ + +topdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ + +datarootdir = @datarootdir@ + +docdir = @docdir@ +infodir = @infodir@ + +mandir = @mandir@ +manpfx = man + +man1ext = .1 +man1dir = $(mandir)/$(manpfx)1 +man3ext = .3 +man3dir = $(mandir)/$(manpfx)3 + +# set this to a value to have the HTML documentation installed +htmldir = + +# Support an alternate destination root directory for package building +DESTDIR = + +SHELL = @MAKE_SHELL@ +RM = rm -f + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +BUILD_DIR = @BUILD_DIR@ +TEXINPUTDIR = $(srcdir) + +MAKEINFO = LANGUAGE= makeinfo +TEXI2DVI = $(srcdir)/texi2dvi +TEXI2HTML = $(srcdir)/texi2html +QUIETPS = #set this to -q to shut up dvips +PAPERSIZE = letter +PSDPI = 600 +DVIPS = dvips -D ${PSDPI} $(QUIETPS) -t ${PAPERSIZE} -o $@ # tricky +# experimental; uses external texi2dvi for now; this needs pdftex to be present +TEXI2PDF = texi2dvi --pdf + +# These tools might not be available; they're not required +DVIPDF = dvipdfm -o $@ -p ${PAPERSIZE} +PSPDF = gs -sPAPERSIZE=${PAPERSIZE} -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=$@ + +RLSRC = $(srcdir)/rlman.texi $(srcdir)/rluser.texi \ + $(srcdir)/rltech.texi $(srcdir)/version.texi \ + $(srcdir)/rluserman.texi $(srcdir)/fdl.texi +HISTSRC = $(srcdir)/history.texi $(srcdir)/hsuser.texi \ + $(srcdir)/hstech.texi $(srcdir)/version.texi $(srcdir)/fdl.texi + +# This should be a program that converts troff to an ascii-readable format +NROFF = groff -Tascii + +# This should be a program that converts troff to postscript +GROFF = groff + +DVIOBJ = readline.dvi history.dvi rluserman.dvi +INFOOBJ = readline.info history.info rluserman.info +PSOBJ = readline.ps history.ps rluserman.ps readline_3.ps history_3.ps +HTMLOBJ = readline.html history.html rluserman.html +TEXTOBJ = readline.0 history.0 +PDFOBJ = readline.pdf history.pdf rluserman.pdf + +INTERMEDIATE_OBJ = rlman.dvi + +DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) $(PDFOBJ) + +.SUFFIXES: .0 .3 .ps .txt .dvi .html .pdf + +.3.0: + $(RM) $@ + -${NROFF} -man $< > $@ + +.ps.pdf: + $(RM) $@ + -${PSPDF} $< + +.dvi.pdf: + $(RM) $@ + -${DVIPDF} $< + +#.texi.pdf: +# $(RM) $@ +# -${TEXI2PDF} $< + +all: info dvi html ps text pdf +nodvi: info html text + +xdist: $(DIST_DOCS) + +info: $(INFOOBJ) +dvi: $(DVIOBJ) +ps: $(PSOBJ) +html: $(HTMLOBJ) +text: $(TEXTOBJ) +pdf: $(PDFOBJ) + +readline.dvi: $(RLSRC) + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texi + mv rlman.dvi readline.dvi + +readline.info: $(RLSRC) + $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texi + +rluserman.dvi: $(RLSRC) + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rluserman.texi + +rluserman.info: $(RLSRC) + $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rluserman.texi + +history.dvi: ${HISTSRC} + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/history.texi + +history.info: ${HISTSRC} + $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/history.texi + +readline.ps: readline.dvi + $(RM) $@ + $(DVIPS) readline.dvi + +rluserman.ps: rluserman.dvi + $(RM) $@ + $(DVIPS) rluserman.dvi + +history.ps: history.dvi + $(RM) $@ + $(DVIPS) history.dvi + +# +# This leaves readline.html and rlman.html -- rlman.html is for www.gnu.org +# +readline.html: ${RLSRC} + $(MAKEINFO) -o $@ --html --no-split -I$(TEXINPUTDIR) $(srcdir)/rlman.texi + +rlman.html: ${RLSRC} + $(MAKEINFO) -o $@ --html --no-split -I$(TEXINPUTDIR) $(srcdir)/rlman.texi + +rluserman.html: ${RLSRC} + $(MAKEINFO) --html --no-split -I$(TEXINPUTDIR) $(srcdir)/rluserman.texi + +history.html: ${HISTSRC} + $(MAKEINFO) --html --no-split -I$(TEXINPUTDIR) $(srcdir)/history.texi + +readline.0: readline.3 + +readline_3.ps: $(srcdir)/readline.3 + ${RM} $@ + ${GROFF} -man < $(srcdir)/readline.3 > $@ + +history.0: history.3 + +history_3.ps: $(srcdir)/history.3 + ${RM} $@ + ${GROFF} -man < $(srcdir)/history.3 > $@ + +readline.pdf: $(RLSRC) + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/rlman.texi + mv rlman.pdf $@ + +history.pdf: $(HISTSRC) + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/history.texi + +rluserman.pdf: $(RLSRC) + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/rluserman.texi + +clean: + $(RM) *.aux *.bak *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \ + *.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o \ + core *.core + +mostlyclean: clean + +distclean: clean maybe-clean + $(RM) $(INTERMEDIATE_OBJ) + $(RM) Makefile + +maybe-clean: + -if test "X$(topdir)" != "X.." && test "X$(topdir)" != "X$(BUILD_DIR)"; then \ + $(RM) $(DIST_DOCS); \ + fi + +maintainer-clean: clean + $(RM) $(DIST_DOCS) + $(RM) $(INTERMEDIATE_OBJ) + $(RM) $(PDFOBJ) + $(RM) Makefile + +installdirs: $(topdir)/support/mkdirs + -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir) + -if test -n "${htmldir}" ; then \ + $(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(htmldir) ; \ + fi + +install: installdirs + if test -f readline.info; then \ + ${INSTALL_DATA} readline.info $(DESTDIR)$(infodir)/readline.info; \ + else \ + ${INSTALL_DATA} $(srcdir)/readline.info $(DESTDIR)$(infodir)/readline.info; \ + fi + if test -f rluserman.info; then \ + ${INSTALL_DATA} rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \ + else \ + ${INSTALL_DATA} $(srcdir)/rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \ + fi + if test -f history.info; then \ + ${INSTALL_DATA} history.info $(DESTDIR)$(infodir)/history.info; \ + else \ + ${INSTALL_DATA} $(srcdir)/history.info $(DESTDIR)$(infodir)/history.info; \ + fi + -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ + install-info --dir-file=$(DESTDIR)$(infodir)/dir \ + $(DESTDIR)$(infodir)/readline.info ; \ + install-info --dir-file=$(DESTDIR)$(infodir)/dir \ + $(DESTDIR)$(infodir)/history.info ; \ + install-info --dir-file=$(DESTDIR)$(infodir)/dir \ + $(DESTDIR)$(infodir)/rluserman.info ; \ + else true; fi + -${INSTALL_DATA} $(srcdir)/readline.3 $(DESTDIR)$(man3dir)/readline$(man3ext) + -${INSTALL_DATA} $(srcdir)/history.3 $(DESTDIR)$(man3dir)/history$(man3ext) + -if test -n "${htmldir}" ; then \ + if test -f readline.html; then \ + ${INSTALL_DATA} readline.html $(DESTDIR)$(htmldir)/readline.html; \ + else \ + ${INSTALL_DATA} $(srcdir)/readline.html $(DESTDIR)$(htmldir)/readline.html; \ + fi ; \ + if test -f history.html; then \ + ${INSTALL_DATA} history.html $(DESTDIR)$(htmldir)/history.html; \ + else \ + ${INSTALL_DATA} $(srcdir)/history.html $(DESTDIR)$(htmldir)/history.html; \ + fi ; \ + if test -f rluserman.html; then \ + ${INSTALL_DATA} rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \ + else \ + ${INSTALL_DATA} $(srcdir)/rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \ + fi ; \ + fi + +uninstall: + $(RM) $(DESTDIR)$(infodir)/readline.info + $(RM) $(DESTDIR)$(infodir)/rluserman.info + $(RM) $(DESTDIR)$(infodir)/history.info + $(RM) $(DESTDIR)$(man3dir)/readline$(man3ext) + $(RM) $(DESTDIR)$(man3dir)/history$(man3ext) + -if test -n "${htmldir}" ; then \ + $(RM) $(DESTDIR)$(htmldir)/readline.html ; \ + $(RM) $(DESTDIR)$(htmldir)/rluserman.html ; \ + $(RM) $(DESTDIR)$(htmldir)/history.html ; \ + fi diff --git a/doc/fdl.texi b/doc/fdl.texi new file mode 100644 index 0000000..8805f1a --- /dev/null +++ b/doc/fdl.texi @@ -0,0 +1,506 @@ +@c The GNU Free Documentation License. +@center Version 1.3, 3 November 2008 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +@uref{http://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input +format, @acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML}, +PostScript or @acronym{PDF} designed for human modification. Examples +of transparent image formats include @acronym{PNG}, @acronym{XCF} and +@acronym{JPG}. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, @acronym{SGML} or +@acronym{XML} for which the @acronym{DTD} and/or processing tools are +not generally available, and the machine-generated @acronym{HTML}, +PostScript or @acronym{PDF} produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The ``publisher'' means any person or entity that distributes copies +of the Document to the public. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +@item +RELICENSING + +``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the +site means any set of copyrightable works thus published on the MMC +site. + +``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +``Incorporate'' means to publish or republish a Document, in whole or +in part, as part of another Document. + +An MMC is ``eligible for relicensing'' if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + +@end enumerate + +@page +@heading ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.'' line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + diff --git a/doc/history.0 b/doc/history.0 new file mode 100644 index 0000000..2bf3b1a --- /dev/null +++ b/doc/history.0 @@ -0,0 +1,505 @@ +HISTORY(3) Library Functions Manual HISTORY(3) + + + +NAME + history - GNU History Library + +COPYRIGHT + The GNU History Library is Copyright (C) 1989-2020 by the Free Software + Foundation, Inc. + +DESCRIPTION + Many programs read input from the user a line at a time. The GNU His- + tory library is able to keep track of those lines, associate arbitrary + data with each line, and utilize information from previous lines in + composing new ones. + +HISTORY EXPANSION + The history library supports a history expansion feature that is iden- + tical to the history expansion in bash. This section describes what + syntax features are available. + + History expansions introduce words from the history list into the input + stream, making it easy to repeat commands, insert the arguments to a + previous command into the current input line, or fix errors in previous + commands quickly. + + History expansion is usually performed immediately after a complete + line is read. It takes place in two parts. The first is to determine + which line from the history list to use during substitution. The sec- + ond is to select portions of that line for inclusion into the current + one. The line selected from the history is the event, and the portions + of that line that are acted upon are words. Various modifiers are + available to manipulate the selected words. The line is broken into + words in the same fashion as bash does when reading input, so that sev- + eral words that would otherwise be separated are considered one word + when surrounded by quotes (see the description of history_tokenize() + below). History expansions are introduced by the appearance of the + history expansion character, which is ! by default. Only backslash (\) + and single quotes can quote the history expansion character. + + Event Designators + An event designator is a reference to a command line entry in the his- + tory list. Unless the reference is absolute, events are relative to + the current position in the history list. + + ! Start a history substitution, except when followed by a blank, + newline, = or (. + !n Refer to command line n. + !-n Refer to the current command minus n. + !! Refer to the previous command. This is a synonym for `!-1'. + !string + Refer to the most recent command preceding the current position + in the history list starting with string. + !?string[?] + Refer to the most recent command preceding the current position + in the history list containing string. The trailing ? may be + omitted if string is followed immediately by a newline. If + string is missing, the string from the most recent search is + used; it is an error if there is no previous search string. + ^string1^string2^ + Quick substitution. Repeat the last command, replacing string1 + with string2. Equivalent to ``!!:s^string1^string2^'' (see Mod- + ifiers below). + !# The entire command line typed so far. + + 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 sepa- + rated by single spaces. + + 0 (zero) + The zeroth word. For the shell, this is the command word. + n The nth word. + ^ The first argument. That is, word 1. + $ The last word. This is usually the last argument, but will ex- + pand to the zeroth word if there is only one word in the line. + % The first word matched by the most recent `?string?' search, if + the search string begins with a character that is part of a + word. + x-y A range of words; `-y' abbreviates `0-y'. + * All of the words but the zeroth. 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 x is miss- + ing, it defaults to 0. + + If a word designator is supplied without an event specification, the + previous command is used as the event. + + Modifiers + After the optional word designator, there may appear a sequence of one + or more of the following modifiers, each preceded by a `:'. These mod- + ify, or edit, the word or words selected from the history event. + + h Remove a trailing file name component, leaving only the head. + t Remove all leading file name components, leaving the tail. + r Remove a trailing suffix of the form .xxx, leaving the basename. + e Remove all but the trailing suffix. + p Print the new command but do not execute it. + q Quote the substituted words, escaping further substitutions. + x Quote the substituted words as with q, but break into words at + blanks and newlines. The q and x modifiers are mutually exclu- + sive; the last one supplied is used. + s/old/new/ + Substitute new for the first occurrence of old in the event + line. Any character may be used as the delimiter in place of /. + The final delimiter is optional if it is the last character of + the event line. 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 &. If old is null, it is set + to the last old substituted, or, if no previous history substi- + tutions took place, the last string in a !?string[?] search. + If new is null, each matching old is deleted. + & Repeat the previous substitution. + g Cause changes to be applied over the entire event line. This is + used in conjunction with `:s' (e.g., `:gs/old/new/') or `:&'. + If used with `:s', any delimiter can be used in place of /, and + the final delimiter is optional if it is the last character of + the event line. An a may be used as a synonym for g. + G Apply the following `s' or `&' modifier once to each word in the + event line. + +PROGRAMMING WITH HISTORY FUNCTIONS + This section describes how to use the History library in other pro- + grams. + + Introduction to History + A programmer using the History library has available functions for re- + membering 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 avail- + able which provides for a consistent user interface across different + programs. + + The user using programs written with the History library has the bene- + fit of a consistent user interface with a set of well-known commands + for manipulating the text of previous lines and using that text in new + commands. The basic history manipulation commands are identical to the + history substitution provided by bash. + + The programmer can also 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 li- + brary provides in other code, an application writer should include the + file  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. + + History Storage + The history list is an array of history entries. A history entry is + declared as follows: + + typedef void * histdata_t; + + typedef struct _hist_entry { + char *line; + char *timestamp; + histdata_t data; + } HIST_ENTRY; + + The history list itself might therefore be declared as + + HIST_ENTRY ** the_history_list; + + The state of the History library is encapsulated into a single struc- + ture: + + /* + * A structure used to pass around the current state of the history. + */ + typedef struct _hist_state { + HIST_ENTRY **entries; /* Pointer to the entries themselves. */ + int offset; /* The location pointer within this array. */ + int length; /* Number of elements within this array. */ + int size; /* Number of slots allocated to this array. */ + int flags; + } HISTORY_STATE; + + If the flags member includes HS_STIFLED, the history has been stifled. + +History Functions + This section describes the calling sequence for the various functions + exported by the GNU History library. + + 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. + + void using_history (void) + Begin a session in which the history functions might be used. This + initializes the interactive variables. + + HISTORY_STATE * history_get_history_state (void) + Return a structure describing the current state of the input history. + + void history_set_history_state (HISTORY_STATE *state) + Set the state of the history list according to state. + + + History List Management + These functions manage individual entries on the history list, or set + parameters managing the list itself. + + void add_history (const char *string) + Place string at the end of the history list. The associated data field + (if any) is set to NULL. If the maximum number of history entries has + been set using stifle_history(), and the new number of history entries + would exceed that maximum, the oldest history entry is removed. + + void add_history_time (const char *string) + Change the time stamp associated with the most recent history entry to + string. + + HIST_ENTRY * remove_history (int which) + Remove history entry at offset which from the history. The removed el- + ement is returned so you can free the line, data, and containing struc- + ture. + + histdata_t free_history_entry (HIST_ENTRY *histent) + Free the history entry histent and any history library private data as- + sociated with it. Returns the application-specific data so the caller + can dispose of it. + + HIST_ENTRY * replace_history_entry (int which, const char *line, hist- + data_t data) + Make the history entry at offset which have line and data. This re- + turns the old entry so the caller can dispose of any application-spe- + cific data. In the case of an invalid which, a NULL pointer is re- + turned. + + void clear_history (void) + Clear the history list by deleting all the entries. + + void stifle_history (int max) + Stifle the history list, remembering only the last max entries. The + history list will contain only max entries at a time. + + int unstifle_history (void) + Stop stifling the history. This returns the previously-set maximum + number of history entries (as set by stifle_history()). history was + stifled. The value is positive if the history was stifled, negative if + it wasn't. + + int history_is_stifled (void) + Returns non-zero if the history is stifled, zero if it is not. + + + Information About the History List + These functions return information about the entire history list or in- + dividual list entries. + + HIST_ENTRY ** history_list (void) + Return a NULL terminated array of HIST_ENTRY * which is the current in- + put history. Element 0 of this list is the beginning of time. If + there is no history, return NULL. + + int where_history (void) + Returns the offset of the current history element. + + HIST_ENTRY * current_history (void) + Return the history entry at the current position, as determined by + where_history(). If there is no entry there, return a NULL pointer. + + HIST_ENTRY * history_get (int offset) + Return the history entry at position offset. The range of valid values + of offset starts at history_base and ends at history_length - 1. If + there is no entry there, or if offset is outside the valid range, re- + turn a NULL pointer. + + time_t history_get_time (HIST_ENTRY *) + Return the time stamp associated with the history entry passed as the + argument. + + int history_total_bytes (void) + Return the number of bytes that the primary history entries are using. + This function returns the sum of the lengths of all the lines in the + history. + + + Moving Around the History List + These functions allow the current index into the history list to be set + or changed. + + int history_set_pos (int pos) + Set the current history offset to pos, an absolute index into the list. + Returns 1 on success, 0 if pos is less than zero or greater than the + number of history entries. + + HIST_ENTRY * previous_history (void) + Back up the current history offset to the previous history entry, and + return a pointer to that entry. If there is no previous entry, return + a NULL pointer. + + HIST_ENTRY * next_history (void) + If the current history offset refers to a valid history entry, incre- + ment the current history offset. If the possibly-incremented history + offset refers to a valid history entry, return a pointer to that entry; + otherwise, return a NULL pointer. + + + Searching the History List + These functions allow searching of the history list for entries con- + taining a specific string. Searching may be performed both forward and + backward from the current history position. The search may be an- + chored, meaning that the string must match at the beginning of the his- + tory entry. + + int history_search (const char *string, int direction) + Search the history for string, starting at the current history offset. + If direction is less than 0, then the search is through previous en- + tries, otherwise through subsequent entries. If string is found, then + the current history index is set to that history entry, and the value + returned is the offset in the line of the entry where string was found. + Otherwise, nothing is changed, and a -1 is returned. + + int history_search_prefix (const char *string, int direction) + Search the history for string, starting at the current history offset. + The search is anchored: matching lines must begin with string. If di- + rection is less than 0, then the search is through previous entries, + otherwise through subsequent entries. If string is found, then the + current history index is set to that entry, and the return value is 0. + Otherwise, nothing is changed, and a -1 is returned. + + int history_search_pos (const char *string, int direction, int pos) + Search for string in the history list, starting at pos, an absolute in- + dex into the list. If direction is negative, the search proceeds back- + ward from pos, otherwise forward. Returns the absolute index of the + history element where string was found, or -1 otherwise. + + + 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. + + int read_history (const char *filename) + Add the contents of filename to the history list, a line at a time. If + filename is NULL, then read from ~/.history. Returns 0 if successful, + or errno if not. + + int read_history_range (const char *filename, int from, int to) + Read a range of lines from filename, adding them to the history list. + Start reading at line from and end at to. If from is zero, start at + the beginning. If to is less than from, then read until the end of the + file. If filename is NULL, then read from ~/.history. Returns 0 if + successful, or errno if not. + + int write_history (const char *filename) + Write the current history to filename, overwriting filename if neces- + sary. If filename is NULL, then write the history list to ~/.history. + Returns 0 on success, or errno on a read or write error. + + + int append_history (int nelements, const char *filename) + Append the last nelements of the history list to filename. If filename + is NULL, then append to ~/.history. Returns 0 on success, or errno on + a read or write error. + + int history_truncate_file (const char *filename, int nlines) + Truncate the history file filename, leaving only the last nlines lines. + If filename is NULL, then ~/.history is truncated. Returns 0 on suc- + cess, or errno on failure. + + + History Expansion + These functions implement history expansion. + + int history_expand (char *string, char **output) + Expand 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 removal of escape characters preceding + the history expansion character); + 1 if expansions did take place; + -1 if there was an error in expansion; + 2 if the returned line should be displayed, but not exe- + cuted, as with the :p modifier. + If an error occurred in expansion, then output contains a descriptive + error message. + + char * get_history_event (const char *string, int *cindex, int qchar) + Returns the text of the history event beginning at string + *cindex. + *cindex is modified to point to after the event specifier. At function + entry, cindex points to the index into string where the history event + specification begins. qchar is a character that is allowed to end the + event specification in addition to the ``normal'' terminating charac- + ters. + + char ** history_tokenize (const char *string) + Return an array of tokens parsed out of string, much as the shell + might. The tokens are split on the characters in the history_word_de- + limiters variable, and shell quoting conventions are obeyed. + + char * history_arg_extract (int first, int last, const char *string) + Extract a string segment consisting of the first through last arguments + present in string. Arguments are split using history_tokenize(). + + + History Variables + This section describes the externally-visible variables exported by the + GNU History Library. + + int history_base + The logical offset of the first entry in the history list. + + int history_length + The number of entries currently stored in the history list. + + int history_max_entries + The maximum number of history entries. This must be changed using sti- + fle_history(). + + int history_write_timestamps + If non-zero, timestamps are written to the history file, so they can be + preserved between sessions. The default value is 0, meaning that time- + stamps are not saved. The current timestamp format uses the value of + history_comment_char to delimit timestamp entries in the history file. + If that variable does not have a value (the default), timestamps will + not be written. + + char history_expansion_char + The character that introduces a history event. The default is !. Set- + ting this to 0 inhibits history expansion. + + char history_subst_char + The character that invokes word substitution if found at the start of a + line. The default is ^. + + 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. + + char * history_word_delimiters + The characters that separate tokens for history_tokenize(). The de- + fault value is " \t\n()<>;&|". + + char * history_no_expand_chars + The list of characters which inhibit history expansion if found immedi- + ately following history_expansion_char. The default is space, tab, + newline, \r, and =. + + char * history_search_delimiter_chars + The list of additional characters which can delimit a history search + string, in addition to space, tab, : and ? in the case of a substring + search. The default is empty. + + int history_quotes_inhibit_expansion + If non-zero, double-quoted words are not scanned for the history expan- + sion character or the history comment character. The default value is + 0. + + rl_linebuf_func_t * history_inhibit_expansion_function + This should be set to the address of a function that takes two argu- + ments: a char * (string) and an int index into that string (i). It + should return a non-zero value if the history expansion starting at + string[i] should not be performed; zero if the expansion should be + done. It is intended for use by applications like bash that use the + history expansion character for additional purposes. By default, this + variable is set to NULL. + +FILES + ~/.history + Default filename for reading and writing saved history + +SEE ALSO + The Gnu Readline Library, Brian Fox and Chet Ramey + The Gnu History Library, Brian Fox and Chet Ramey + bash(1) + readline(3) + +AUTHORS + Brian Fox, Free Software Foundation + bfox@gnu.org + + Chet Ramey, Case Western Reserve University + chet.ramey@case.edu + +BUG REPORTS + If you find a bug in the history library, you should report it. But + first, you should make sure that it really is a bug, and that it ap- + pears in the latest version of the history library that you have. + + Once you have determined that a bug actually exists, mail a bug report + to bug-readline@gnu.org. If you have a fix, you are welcome to mail + that as well! Suggestions and `philosophical' bug reports may be + mailed to bug-readline@gnu.org or posted to the Usenet newsgroup + gnu.bash.bug. + + Comments and bug reports concerning this manual page should be directed + to chet.ramey@case.edu. + + + +GNU History 8.1 2020 July 17 HISTORY(3) diff --git a/doc/history.3 b/doc/history.3 new file mode 100644 index 0000000..06419cf --- /dev/null +++ b/doc/history.3 @@ -0,0 +1,687 @@ +.\" +.\" MAN PAGE COMMENTS to +.\" +.\" Chet Ramey +.\" Information Network Services +.\" Case Western Reserve University +.\" chet.ramey@case.edu +.\" +.\" Last Change: Fri Jul 17 09:43:01 EDT 2020 +.\" +.TH HISTORY 3 "2020 July 17" "GNU History 8.1" +.\" +.\" File Name macro. This used to be `.PN', for Path Name, +.\" but Sun doesn't seem to like that very much. +.\" +.de FN +\fI\|\\$1\|\fP +.. +.ds lp \fR\|(\fP +.ds rp \fR\|)\fP +.\" FnN return-value fun-name N arguments +.de Fn1 +\fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3\fP\\*(rp +.br +.. +.de Fn2 +.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4\fP\\*(rp +.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4\fP\\*(rp +.br +.. +.de Fn3 +.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4,\|\\$5\fP\|\\*(rp +.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4, \\$5\fP\\*(rp +.br +.. +.de Vb +\fI\\$1\fP \fB\\$2\fP +.br +.. +.SH NAME +history \- GNU History Library +.SH COPYRIGHT +.if t The GNU History Library is Copyright \(co 1989-2020 by the Free Software Foundation, Inc. +.if n The GNU History Library is Copyright (C) 1989-2020 by the Free Software Foundation, Inc. +.SH DESCRIPTION +Many programs read input from the user a line at a time. The GNU +History library is able to keep track of those lines, associate arbitrary +data with each line, and utilize information from previous lines in +composing new ones. +.PP +.SH "HISTORY EXPANSION" +The history library supports a history expansion feature that +is identical to the history expansion in +.BR bash. +This section describes what syntax features are available. +.PP +History expansions introduce words from the history list into +the input stream, making it easy to repeat commands, insert the +arguments to a previous command into the current input line, or +fix errors in previous commands quickly. +.PP +History expansion is usually performed immediately after a complete line +is read. +It takes place in two parts. +The first is to determine which line from the history list +to use during substitution. +The second is to select portions of that line for inclusion into +the current one. +The line selected from the history is the \fIevent\fP, +and the portions of that line that are acted upon are \fIwords\fP. +Various \fImodifiers\fP are available to manipulate the selected words. +The line is broken into words in the same fashion as \fBbash\fP +does when reading input, +so that several words that would otherwise be separated +are considered one word when surrounded by quotes (see the +description of \fBhistory_tokenize()\fP below). +History expansions are introduced by the appearance of the +history expansion character, which is \^\fB!\fP\^ by default. +Only backslash (\^\fB\e\fP\^) and single quotes can quote +the history expansion character. +.SS Event Designators +An event designator is a reference to a command line entry in the +history list. +Unless the reference is absolute, events are relative to the current +position in the history list. +.PP +.PD 0 +.TP +.B ! +Start a history substitution, except when followed by a +.BR blank , +newline, = or (. +.TP +.B !\fIn\fR +Refer to command line +.IR n . +.TP +.B !\-\fIn\fR +Refer to the current command minus +.IR n . +.TP +.B !! +Refer to the previous command. This is a synonym for `!\-1'. +.TP +.B !\fIstring\fR +Refer to the most recent command +preceding the current position in the history list +starting with +.IR string . +.TP +.B !?\fIstring\fR\fB[?]\fR +Refer to the most recent command +preceding the current position in the history list +containing +.IR string . +The trailing \fB?\fP may be omitted if +.I string +is followed immediately by a newline. +If \fIstring\fP is missing, the string from the most recent search is used; +it is an error if there is no previous search string. +.TP +.B \d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u +Quick substitution. Repeat the last command, replacing +.I string1 +with +.IR string2 . +Equivalent to +``!!:s\d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u'' +(see \fBModifiers\fP below). +.TP +.B !# +The entire command line typed so far. +.PD +.SS Word Designators +Word designators are used to select desired words from the event. +A +.B : +separates the event specification from the word designator. +It may be omitted if the word designator begins with a +.BR ^ , +.BR $ , +.BR * , +.BR \- , +or +.BR % . +Words are numbered from the beginning of the line, +with the first word being denoted by 0 (zero). +Words are inserted into the current line separated by single spaces. +.PP +.PD 0 +.TP +.B 0 (zero) +The zeroth word. For the shell, this is the command +word. +.TP +.I n +The \fIn\fRth word. +.TP +.B ^ +The first argument. That is, word 1. +.TP +.B $ +The last word. This is usually the last argument, but will expand to the +zeroth word if there is only one word in the line. +.TP +.B % +The first word matched by the most recent `?\fIstring\fR?' search, +if the search string begins with a character that is part of a word. +.TP +.I x\fB\-\fPy +A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'. +.TP +.B * +All of the words but the zeroth. This is a synonym +for `\fI1\-$\fP'. It is not an error to use +.B * +if there is just one +word in the event; the empty string is returned in that case. +.TP +.B x* +Abbreviates \fIx\-$\fP. +.TP +.B x\- +Abbreviates \fIx\-$\fP like \fBx*\fP, but omits the last word. +If \fBx\fP is missing, it defaults to 0. +.PD +.PP +If a word designator is supplied without an event specification, the +previous command is used as the event. +.SS Modifiers +After the optional word designator, there may appear a sequence of +one or more of the following modifiers, each preceded by a `:'. +These modify, or edit, the word or words selected from the history event. +.PP +.PD 0 +.PP +.TP +.B h +Remove a trailing file name component, leaving only the head. +.TP +.B t +Remove all leading file name components, leaving the tail. +.TP +.B r +Remove a trailing suffix of the form \fI.xxx\fP, leaving the +basename. +.TP +.B e +Remove all but the trailing suffix. +.TP +.B p +Print the new command but do not execute it. +.TP +.B q +Quote the substituted words, escaping further substitutions. +.TP +.B x +Quote the substituted words as with +.BR q , +but break into words at +.B blanks +and newlines. +The \fBq\fP and \fBx\fP modifiers are mutually exclusive; the last one +supplied is used. +.TP +.B s/\fIold\fP/\fInew\fP/ +Substitute +.I new +for the first occurrence of +.I old +in the event line. +Any character may be used as the delimiter in place of /. +The final delimiter is optional if it is the last character of the +event line. +The delimiter may be quoted in +.I old +and +.I new +with a single backslash. If & appears in +.IR new , +it is replaced by +.IR old . +A single backslash will quote the &. +If +.I old +is null, it is set to the last +.I old +substituted, or, if no previous history substitutions took place, +the last +.I string +in a +.B !?\fIstring\fR\fB[?]\fR +search. +If +.I new +is null, each matching +.I old +is deleted. +.TP +.B & +Repeat the previous substitution. +.TP +.B g +Cause changes to be applied over the entire event line. This is +used in conjunction with `\fB:s\fP' (e.g., `\fB:gs/\fIold\fP/\fInew\fP/\fR') +or `\fB:&\fP'. If used with +`\fB:s\fP', any delimiter can be used +in place of /, and the final delimiter is optional +if it is the last character of the event line. +An \fBa\fP may be used as a synonym for \fBg\fP. +.TP +.B G +Apply the following `\fBs\fP' or `\fB&\fP' modifier once to each word +in the event line. +.PD +.SH "PROGRAMMING WITH HISTORY FUNCTIONS" +This section describes how to use the History library in other programs. +.SS Introduction to History +A programmer using the History library has available functions +for remembering lines on a history list, associating arbitrary data +with a line, removing lines from the list, searching through the list +for a line containing an arbitrary text string, and referencing any line +in the list directly. In addition, a history \fIexpansion\fP function +is available which provides for a consistent user interface across +different programs. +.PP +The user using programs written with the History library has the +benefit of a consistent user interface with a set of well-known +commands for manipulating the text of previous lines and using that text +in new commands. The basic history manipulation commands are +identical to +the history substitution provided by \fBbash\fP. +.PP +The programmer can also use the readline library, which +includes some history manipulation by default, and has the added +advantage of command line editing. +.PP +Before declaring any functions using any functionality the History +library provides in other code, an application writer should include +the file +.FN +in any file that uses the +History library's features. It supplies extern declarations for all +of the library's public functions and variables, and declares all of +the public data structures. +.SS History Storage +The history list is an array of history entries. A history entry is +declared as follows: +.PP +.Vb "typedef void *" histdata_t; +.PP +.nf +typedef struct _hist_entry { + char *line; + char *timestamp; + histdata_t data; +} HIST_ENTRY; +.fi +.PP +The history list itself might therefore be declared as +.PP +.Vb "HIST_ENTRY **" the_history_list; +.PP +The state of the History library is encapsulated into a single structure: +.PP +.nf +/* + * A structure used to pass around the current state of the history. + */ +typedef struct _hist_state { + HIST_ENTRY **entries; /* Pointer to the entries themselves. */ + int offset; /* The location pointer within this array. */ + int length; /* Number of elements within this array. */ + int size; /* Number of slots allocated to this array. */ + int flags; +} HISTORY_STATE; +.fi +.PP +If the flags member includes \fBHS_STIFLED\fP, the history has been +stifled. +.SH "History Functions" +This section describes the calling sequence for the various functions +exported by the GNU History library. +.SS Initializing History and State Management +This section describes functions used to initialize and manage +the state of the History library when you want to use the history +functions in your program. + +.Fn1 void using_history void +Begin a session in which the history functions might be used. This +initializes the interactive variables. + +.Fn1 "HISTORY_STATE *" history_get_history_state void +Return a structure describing the current state of the input history. + +.Fn1 void history_set_history_state "HISTORY_STATE *state" +Set the state of the history list according to \fIstate\fP. + +.SS History List Management +These functions manage individual entries on the history list, or set +parameters managing the list itself. + +.Fn1 void add_history "const char *string" +Place \fIstring\fP at the end of the history list. The associated data +field (if any) is set to \fBNULL\fP. +If the maximum number of history entries has been set using +\fBstifle_history()\fP, and the new number of history entries would exceed +that maximum, the oldest history entry is removed. + +.Fn1 void add_history_time "const char *string" +Change the time stamp associated with the most recent history entry to +\fIstring\fP. + +.Fn1 "HIST_ENTRY *" remove_history "int which" +Remove history entry at offset \fIwhich\fP from the history. The +removed element is returned so you can free the line, data, +and containing structure. + +.Fn1 "histdata_t" free_history_entry "HIST_ENTRY *histent" +Free the history entry \fIhistent\fP and any history library private +data associated with it. Returns the application-specific data +so the caller can dispose of it. + +.Fn3 "HIST_ENTRY *" replace_history_entry "int which" "const char *line" "histdata_t data" +Make the history entry at offset \fIwhich\fP have \fIline\fP and \fIdata\fP. +This returns the old entry so the caller can dispose of any +application-specific data. In the case +of an invalid \fIwhich\fP, a \fBNULL\fP pointer is returned. + +.Fn1 void clear_history "void" +Clear the history list by deleting all the entries. + +.Fn1 void stifle_history "int max" +Stifle the history list, remembering only the last \fImax\fP entries. +The history list will contain only \fImax\fP entries at a time. + +.Fn1 int unstifle_history "void" +Stop stifling the history. This returns the previously-set +maximum number of history entries (as set by \fBstifle_history()\fP). +history was stifled. The value is positive if the history was +stifled, negative if it wasn't. + +.Fn1 int history_is_stifled "void" +Returns non-zero if the history is stifled, zero if it is not. + +.SS Information About the History List + +These functions return information about the entire history list or +individual list entries. + +.Fn1 "HIST_ENTRY **" history_list "void" +Return a \fBNULL\fP terminated array of \fIHIST_ENTRY *\fP which is the +current input history. Element 0 of this list is the beginning of time. +If there is no history, return \fBNULL\fP. + +.Fn1 int where_history "void" +Returns the offset of the current history element. + +.Fn1 "HIST_ENTRY *" current_history "void" +Return the history entry at the current position, as determined by +\fBwhere_history()\fP. If there is no entry there, return a \fBNULL\fP +pointer. + +.Fn1 "HIST_ENTRY *" history_get "int offset" +Return the history entry at position \fIoffset\fP. +The range of valid values of \fIoffset\fP starts at \fBhistory_base\fP +and ends at \fBhistory_length\fP \- 1. +If there is no entry there, or if \fIoffset\fP is outside the valid +range, return a \fBNULL\fP pointer. + +.Fn1 "time_t" history_get_time "HIST_ENTRY *" +Return the time stamp associated with the history entry passed as the argument. + +.Fn1 int history_total_bytes "void" +Return the number of bytes that the primary history entries are using. +This function returns the sum of the lengths of all the lines in the +history. + +.SS Moving Around the History List + +These functions allow the current index into the history list to be +set or changed. + +.Fn1 int history_set_pos "int pos" +Set the current history offset to \fIpos\fP, an absolute index +into the list. +Returns 1 on success, 0 if \fIpos\fP is less than zero or greater +than the number of history entries. + +.Fn1 "HIST_ENTRY *" previous_history "void" +Back up the current history offset to the previous history entry, and +return a pointer to that entry. If there is no previous entry, return +a \fBNULL\fP pointer. + +.Fn1 "HIST_ENTRY *" next_history "void" +If the current history offset refers to a valid history entry, +increment the current history offset. +If the possibly-incremented history offset refers to a valid history +entry, return a pointer to that entry; +otherwise, return a \fBNULL\fP pointer. + +.SS Searching the History List + +These functions allow searching of the history list for entries containing +a specific string. Searching may be performed both forward and backward +from the current history position. The search may be \fIanchored\fP, +meaning that the string must match at the beginning of the history entry. + +.Fn2 int history_search "const char *string" "int direction" +Search the history for \fIstring\fP, starting at the current history offset. +If \fIdirection\fP is less than 0, then the search is through +previous entries, otherwise through subsequent entries. +If \fIstring\fP is found, then +the current history index is set to that history entry, and the value +returned is the offset in the line of the entry where +\fIstring\fP was found. Otherwise, nothing is changed, and a -1 is +returned. + +.Fn2 int history_search_prefix "const char *string" "int direction" +Search the history for \fIstring\fP, starting at the current history +offset. The search is anchored: matching lines must begin with +\fIstring\fP. If \fIdirection\fP is less than 0, then the search is +through previous entries, otherwise through subsequent entries. +If \fIstring\fP is found, then the +current history index is set to that entry, and the return value is 0. +Otherwise, nothing is changed, and a -1 is returned. + +.Fn3 int history_search_pos "const char *string" "int direction" "int pos" +Search for \fIstring\fP in the history list, starting at \fIpos\fP, an +absolute index into the list. If \fIdirection\fP is negative, the search +proceeds backward from \fIpos\fP, otherwise forward. Returns the absolute +index of the history element where \fIstring\fP was found, or -1 otherwise. + +.SS Managing the History File +The History library can read the history from and write it to a file. +This section documents the functions for managing a history file. + +.Fn1 int read_history "const char *filename" +Add the contents of \fIfilename\fP to the history list, a line at a time. +If \fIfilename\fP is \fBNULL\fP, then read from \fI~/.history\fP. +Returns 0 if successful, or \fBerrno\fP if not. + +.Fn3 int read_history_range "const char *filename" "int from" "int to" +Read a range of lines from \fIfilename\fP, adding them to the history list. +Start reading at line \fIfrom\fP and end at \fIto\fP. +If \fIfrom\fP is zero, start at the beginning. If \fIto\fP is less than +\fIfrom\fP, then read until the end of the file. If \fIfilename\fP is +\fBNULL\fP, then read from \fI~/.history\fP. Returns 0 if successful, +or \fBerrno\fP if not. + +.Fn1 int write_history "const char *filename" +Write the current history to \fIfilename\fP, overwriting \fIfilename\fP +if necessary. +If \fIfilename\fP is \fBNULL\fP, then write the history list to \fI~/.history\fP. +Returns 0 on success, or \fBerrno\fP on a read or write error. + + +.Fn2 int append_history "int nelements" "const char *filename" +Append the last \fInelements\fP of the history list to \fIfilename\fP. +If \fIfilename\fP is \fBNULL\fP, then append to \fI~/.history\fP. +Returns 0 on success, or \fBerrno\fP on a read or write error. + +.Fn2 int history_truncate_file "const char *filename" "int nlines" +Truncate the history file \fIfilename\fP, leaving only the last +\fInlines\fP lines. +If \fIfilename\fP is \fBNULL\fP, then \fI~/.history\fP is truncated. +Returns 0 on success, or \fBerrno\fP on failure. + +.SS History Expansion + +These functions implement history expansion. + +.Fn2 int history_expand "char *string" "char **output" +Expand \fIstring\fP, placing the result into \fIoutput\fP, a pointer +to a string. Returns: +.RS +.PD 0 +.TP +0 +If no expansions took place (or, if the only change in +the text was the removal of escape characters preceding the history expansion +character); +.TP +1 +if expansions did take place; +.TP +-1 +if there was an error in expansion; +.TP +2 +if the returned line should be displayed, but not executed, +as with the \fB:p\fP modifier. +.PD +.RE +If an error occurred in expansion, then \fIoutput\fP contains a descriptive +error message. + +.Fn3 "char *" get_history_event "const char *string" "int *cindex" "int qchar" +Returns the text of the history event beginning at \fIstring\fP + +\fI*cindex\fP. \fI*cindex\fP is modified to point to after the event +specifier. At function entry, \fIcindex\fP points to the index into +\fIstring\fP where the history event specification begins. \fIqchar\fP +is a character that is allowed to end the event specification in addition +to the ``normal'' terminating characters. + +.Fn1 "char **" history_tokenize "const char *string" +Return an array of tokens parsed out of \fIstring\fP, much as the +shell might. +The tokens are split on the characters in the +\fBhistory_word_delimiters\fP variable, +and shell quoting conventions are obeyed. + +.Fn3 "char *" history_arg_extract "int first" "int last" "const char *string" +Extract a string segment consisting of the \fIfirst\fP through \fIlast\fP +arguments present in \fIstring\fP. Arguments are split using +\fBhistory_tokenize()\fP. + +.SS History Variables + +This section describes the externally-visible variables exported by +the GNU History Library. + +.Vb int history_base +The logical offset of the first entry in the history list. + +.Vb int history_length +The number of entries currently stored in the history list. + +.Vb int history_max_entries +The maximum number of history entries. This must be changed using +\fBstifle_history()\fP. + +.Vb int history_write_timestamps +If non-zero, timestamps are written to the history file, so they can be +preserved between sessions. The default value is 0, meaning that +timestamps are not saved. +The current timestamp format uses the value of \fIhistory_comment_char\fP +to delimit timestamp entries in the history file. If that variable does +not have a value (the default), timestamps will not be written. + +.Vb char history_expansion_char +The character that introduces a history event. The default is \fB!\fP. +Setting this to 0 inhibits history expansion. + +.Vb char history_subst_char +The character that invokes word substitution if found at the start of +a line. The default is \fB^\fP. + +.Vb char history_comment_char +During tokenization, if this character is seen as the first character +of a word, then it and all subsequent characters up to a newline are +ignored, suppressing history expansion for the remainder of the line. +This is disabled by default. + +.Vb "char *" history_word_delimiters +The characters that separate tokens for \fBhistory_tokenize()\fP. +The default value is \fB"\ \et\en()<>;&|"\fP. + +.Vb "char *" history_no_expand_chars +The list of characters which inhibit history expansion if found immediately +following \fBhistory_expansion_char\fP. The default is space, tab, newline, +\fB\er\fP, and \fB=\fP. + +.Vb "char *" history_search_delimiter_chars +The list of additional characters which can delimit a history search +string, in addition to space, tab, \fI:\fP and \fI?\fP in the case of +a substring search. The default is empty. + +.Vb int history_quotes_inhibit_expansion +If non-zero, double-quoted words are not scanned for the history expansion +character or the history comment character. The default value is 0. + +.Vb "rl_linebuf_func_t *" history_inhibit_expansion_function +This should be set to the address of a function that takes two arguments: +a \fBchar *\fP (\fIstring\fP) +and an \fBint\fP index into that string (\fIi\fP). +It should return a non-zero value if the history expansion starting at +\fIstring[i]\fP should not be performed; zero if the expansion should +be done. +It is intended for use by applications like \fBbash\fP that use the history +expansion character for additional purposes. +By default, this variable is set to \fBNULL\fP. +.SH FILES +.PD 0 +.TP +.FN ~/.history +Default filename for reading and writing saved history +.PD +.SH "SEE ALSO" +.PD 0 +.TP +\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey +.TP +\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey +.TP +\fIbash\fP(1) +.TP +\fIreadline\fP(3) +.PD +.SH AUTHORS +Brian Fox, Free Software Foundation +.br +bfox@gnu.org +.PP +Chet Ramey, Case Western Reserve University +.br +chet.ramey@case.edu +.SH BUG REPORTS +If you find a bug in the +.B history +library, you should report it. But first, you should +make sure that it really is a bug, and that it appears in the latest +version of the +.B history +library that you have. +.PP +Once you have determined that a bug actually exists, mail a +bug report to \fIbug\-readline\fP@\fIgnu.org\fP. +If you have a fix, you are welcome to mail that +as well! Suggestions and `philosophical' bug reports may be mailed +to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet +newsgroup +.BR gnu.bash.bug . +.PP +Comments and bug reports concerning +this manual page should be directed to +.IR chet.ramey@case.edu . diff --git a/doc/history.dvi b/doc/history.dvi new file mode 100644 index 0000000..bf33fe4 Binary files /dev/null and b/doc/history.dvi differ diff --git a/doc/history.html b/doc/history.html new file mode 100644 index 0000000..3c258f4 --- /dev/null +++ b/doc/history.html @@ -0,0 +1,1751 @@ + + + + + + +GNU History Library + + + + + + + + + + + + + + + + + + +

GNU History Library

+ + + + + + + + + +
+ +

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. +

+ + + + +
+
+ +

1 Using History Interactively

+ + +

This chapter describes how to use the GNU History Library interactively, +from a user’s standpoint. It should be considered a user’s guide. For +information on using the GNU History Library in your own programs, +see Programming with GNU History. +

+ + + +
+
+ +

1.1 History Expansion

+ + +

The History library provides a history expansion feature that is similar +to the history expansion provided by csh. This section +describes the syntax used to manipulate the history information. +

+

History expansions introduce words from the history list into +the input stream, making it easy to repeat commands, insert the +arguments to a previous command into the current input line, or +fix errors in previous commands quickly. +

+ +

History expansion takes place in two parts. The first is to determine +which line from the history list should be used during substitution. +The second is to select portions of that line for inclusion into the +current one. The line selected from the history is called the +event, and the portions of that line that are acted upon are +called words. Various modifiers are available to manipulate +the selected words. The line is broken into words in the same fashion +that Bash does, so that several words +surrounded by quotes are considered one word. +History expansions are introduced by the appearance of the +history expansion character, which is ‘!’ by default. +

+

History expansion implements shell-like quoting conventions: +a backslash can be used to remove the special handling for the next character; +single quotes enclose verbatim sequences of characters, and can be used to +inhibit history expansion; +and characters enclosed within double quotes may be subject to history +expansion, since backslash can escape the history expansion character, +but single quotes may not, since they are not treated specially within +double quotes. +

+ + + + +
+
+ +

1.1.1 Event Designators

+ + +

An event designator is a reference to a command line entry in the +history list. +Unless the reference is absolute, events are relative to the current +position 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 +preceding the current position in the history list +starting with string. +

+
+
!?string[?]
+

Refer to the most recent command +preceding the current position in the history list +containing string. +The trailing +‘?’ may be omitted if the string is followed immediately by +a newline. +If string is missing, the string from the most recent search is used; +it is an error if there is no previous search string. +

+
+
^string1^string2^
+

Quick Substitution. Repeat the last command, replacing string1 +with string2. Equivalent to +!!:s^string1^string2^. +

+
+
!#
+

The entire command line typed so far. +

+
+
+ +
+
+
+
+

+Next: , Previous: , Up: History Expansion   [Contents][Index]

+
+

1.1.2 Word Designators

+ +

Word designators are used to select desired words from the event. +A ‘:’ separates the event specification from the word designator. It +may be omitted if the word designator begins with a ‘^’, ‘$’, +‘*’, ‘-’, or ‘%’. Words are numbered from the beginning +of the line, with the first word being denoted by 0 (zero). Words are +inserted into the current line separated by single spaces. +

+

For example, +

+
+
!!
+

designates the preceding command. When you type this, the preceding +command is repeated in toto. +

+
+
!!:$
+

designates the last argument of the preceding command. This may be +shortened to !$. +

+
+
!fi:2
+

designates the second argument of the most recent command starting with +the letters fi. +

+
+ +

Here are the word designators: +

+
+
0 (zero)
+

The 0th word. For many applications, this is the command word. +

+
+
n
+

The nth word. +

+
+
^
+

The first argument; that is, word 1. +

+
+
$
+

The last argument. +

+
+
%
+

The first word matched by the most recent ‘?string?’ search, +if the search string begins with a character that is part of a word. +

+
+
x-y
+

A range of words; ‘-y’ abbreviates ‘0-y’. +

+
+
*
+

All of the words, except the 0th. 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 ‘x’ is missing, it defaults to 0. +

+
+
+ +

If a word designator is supplied without an event specification, the +previous command is used as the event. +

+
+
+
+ +

1.1.3 Modifiers

+ +

After the optional word designator, you can add a sequence of one or more +of the following modifiers, each preceded by a ‘:’. +These modify, or edit, the word or words selected from the history event. +

+
+
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 character may be used as the delimiter 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 ‘&’. +If old is null, it is set to the last old +substituted, or, if no previous history substitutions took place, +the last string +in a !?string[?] +search. +If new is null, each matching old is deleted. +The final delimiter is optional if it is the last +character on the input line. +

+
+
&
+

Repeat the previous substitution. +

+
+
g
+
a
+

Cause changes to be applied over the entire event line. Used in +conjunction with ‘s’, as in gs/old/new/, +or with ‘&’. +

+
+
G
+

Apply the following ‘s’ or ‘&’ modifier once to each word +in the event. +

+
+
+ +
+
+
+
+
+ +

2 Programming with GNU History

+ +

This chapter describes how to interface programs that you write +with the GNU History Library. +It should be considered a technical guide. +For information on the interactive use of GNU History, see Using History Interactively. +

+ + +
+
+ +

2.1 Introduction to History

+ +

Many programs read input from the user a line at a time. The GNU +History library is able to keep track of those lines, associate arbitrary +data with each line, and utilize information from previous lines in +composing new ones. +

+

A 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. +

+

The programmer can also 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. +

+
+
+
+ +

2.2 History Storage

+ +

The history list is an array of history entries. A history entry is +declared as follows: +

+
+
typedef void *histdata_t;
+
+typedef struct _hist_entry {
+  char *line;
+  char *timestamp;
+  histdata_t data;
+} HIST_ENTRY;
+
+ +

The history list itself might therefore be declared as +

+
+
HIST_ENTRY **the_history_list;
+
+ +

The state of the History library is encapsulated into a single structure: +

+
+
/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state {
+  HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+  int offset;           /* The location pointer within this array. */
+  int length;           /* Number of elements within this array. */
+  int size;             /* Number of slots allocated to this array. */
+  int flags;
+} HISTORY_STATE;
+
+ +

If the flags member includes HS_STIFLED, the history has been +stifled. +

+
+
+
+ +

2.3 History Functions

+ +

This section describes the calling sequence for the various functions +exported by the GNU History library. +

+ + +
+
+ +

2.3.1 Initializing History and State Management

+ +

This section describes functions used to initialize and manage +the state of the History library when you want to use the history +functions in your program. +

+
+
Function: void using_history (void)
+

Begin a session in which the history functions might be used. This +initializes the interactive variables. +

+ +
+
Function: HISTORY_STATE * history_get_history_state (void)
+

Return a structure describing the current state of the input history. +

+ +
+
Function: void history_set_history_state (HISTORY_STATE *state)
+

Set the state of the history list according to state. +

+ +
+
+
+ +

2.3.2 History List Management

+ +

These functions manage individual entries on the history list, or set +parameters managing the list itself. +

+
+
Function: void add_history (const char *string)
+

Place string at the end of the history list. The associated data +field (if any) is set to NULL. +If the maximum number of history entries has been set using +stifle_history(), and the new number of history entries would exceed +that maximum, the oldest history entry is removed. +

+ +
+
Function: void add_history_time (const char *string)
+

Change the time stamp associated with the most recent history entry to +string. +

+ +
+
Function: HIST_ENTRY * remove_history (int which)
+

Remove history entry at offset which from the history. The +removed element is returned so you can free the line, data, +and containing structure. +

+ +
+
Function: histdata_t free_history_entry (HIST_ENTRY *histent)
+

Free the history entry histent and any history library private +data associated with it. Returns the application-specific data +so the caller can dispose of it. +

+ +
+
Function: HIST_ENTRY * replace_history_entry (int which, const char *line, histdata_t data)
+

Make the history entry at offset which have line and data. +This returns the old entry so the caller can dispose of any +application-specific data. In the case +of an invalid which, a NULL pointer is returned. +

+ +
+
Function: void clear_history (void)
+

Clear the history list by deleting all the entries. +

+ +
+
Function: void stifle_history (int max)
+

Stifle the history list, remembering only the last max entries. +The history list will contain only max entries at a time. +

+ +
+
Function: int unstifle_history (void)
+

Stop stifling the history. This returns the previously-set +maximum number of history entries (as set by stifle_history()). +The value is positive if the history was +stifled, negative if it wasn’t. +

+ +
+
Function: int history_is_stifled (void)
+

Returns non-zero if the history is stifled, zero if it is not. +

+ +
+
+
+ +

2.3.3 Information About the History List

+ +

These functions return information about the entire history list or +individual list entries. +

+
+
Function: HIST_ENTRY ** history_list (void)
+

Return a NULL terminated array of HIST_ENTRY * which is the +current input history. Element 0 of this list is the beginning of time. +If there is no history, return NULL. +

+ +
+
Function: int where_history (void)
+

Returns the offset of the current history element. +

+ +
+
Function: HIST_ENTRY * current_history (void)
+

Return the history entry at the current position, as determined by +where_history(). If there is no entry there, return a NULL +pointer. +

+ +
+
Function: HIST_ENTRY * history_get (int offset)
+

Return the history entry at position offset. +The range of valid +values of offset starts at history_base and ends at +history_length - 1 (see History Variables). +If there is no entry there, or if offset is outside the valid +range, return a NULL pointer. +

+ +
+
Function: time_t history_get_time (HIST_ENTRY *entry)
+

Return the time stamp associated with the history entry entry. +If the timestamp is missing or invalid, return 0. +

+ +
+
Function: int history_total_bytes (void)
+

Return the number of bytes that the primary history entries are using. +This function returns the sum of the lengths of all the lines in the +history. +

+ +
+
+
+ +

2.3.4 Moving Around the History List

+ +

These functions allow the current index into the history list to be +set or changed. +

+
+
Function: int history_set_pos (int pos)
+

Set the current history offset to pos, an absolute index +into the list. +Returns 1 on success, 0 if pos is less than zero or greater +than the number of history entries. +

+ +
+
Function: HIST_ENTRY * previous_history (void)
+

Back up the current history offset to the previous history entry, and +return a pointer to that entry. If there is no previous entry, return +a NULL pointer. +

+ +
+
Function: HIST_ENTRY * next_history (void)
+

If the current history offset refers to a valid history entry, +increment the current history offset. +If the possibly-incremented history offset refers to a valid history +entry, return a pointer to that entry; +otherwise, return a BNULL pointer. +

+ +
+
+
+ +

2.3.5 Searching the History List

+ + +

These functions allow searching of the history list for entries containing +a specific string. Searching may be performed both forward and backward +from the current history position. The search may be anchored, +meaning that the string must match at the beginning of the history entry. + +

+
+
Function: int history_search (const char *string, int direction)
+

Search the history for string, starting at the current history offset. +If direction is less than 0, then the search is through +previous entries, otherwise through subsequent entries. +If string is found, then +the current history index is set to that history entry, and the value +returned is the offset in the line of the entry where +string was found. Otherwise, nothing is changed, and a -1 is +returned. +

+ +
+
Function: int history_search_prefix (const char *string, int direction)
+

Search the history for string, starting at the current history +offset. The search is anchored: matching lines must begin with +string. If direction is less than 0, then the search is +through previous entries, otherwise through subsequent entries. +If string is found, then the +current history index is set to that entry, and the return value is 0. +Otherwise, nothing is changed, and a -1 is returned. +

+ +
+
Function: int history_search_pos (const char *string, int direction, int pos)
+

Search for string in the history list, starting at pos, an +absolute index into the list. If direction is negative, the search +proceeds backward from pos, otherwise forward. Returns the absolute +index of the history element where string was found, or -1 otherwise. +

+ +
+
+
+ +

2.3.6 Managing the History File

+ +

The History library can read the history from and write it to a file. +This section documents the functions for managing a history file. +

+
+
Function: int read_history (const char *filename)
+

Add the contents of filename to the history list, a line at a time. +If filename is NULL, then read from ~/.history. +Returns 0 if successful, or errno if not. +

+ +
+
Function: int read_history_range (const char *filename, int from, int to)
+

Read a range of lines from filename, adding them to the history list. +Start reading at line from and end at to. +If from is zero, start at the beginning. If to is less than +from, then read until the end of the file. If filename is +NULL, then read from ~/.history. Returns 0 if successful, +or errno if not. +

+ +
+
Function: int write_history (const char *filename)
+

Write the current history to filename, overwriting filename +if necessary. +If filename is NULL, then write the history list to +~/.history. +Returns 0 on success, or errno on a read or write error. +

+ +
+
Function: int append_history (int nelements, const char *filename)
+

Append the last nelements of the history list to filename. +If filename is NULL, then append to ~/.history. +Returns 0 on success, or errno on a read or write error. +

+ +
+
Function: int history_truncate_file (const char *filename, int nlines)
+

Truncate the history file filename, leaving only the last +nlines lines. +If filename is NULL, then ~/.history is truncated. +Returns 0 on success, or errno on failure. +

+ +
+
+
+ +

2.3.7 History Expansion

+ +

These functions implement history expansion. +

+
+
Function: int history_expand (char *string, char **output)
+

Expand string, placing the result into output, a pointer +to a string (see History Expansion). Returns: +

+
0
+

If no expansions took place (or, if the only change in +the text was the removal of escape characters preceding the history expansion +character); +

+
1
+

if expansions did take place; +

+
-1
+

if there was an error in expansion; +

+
2
+

if the returned line should be displayed, but not executed, +as with the :p modifier (see Modifiers). +

+
+ +

If an error occurred in expansion, then output contains a descriptive +error message. +

+ +
+
Function: char * get_history_event (const char *string, int *cindex, int qchar)
+

Returns the text of the history event beginning at string + +*cindex. *cindex is modified to point to after the event +specifier. At function entry, cindex points to the index into +string where the history event specification begins. qchar +is a character that is allowed to end the event specification in addition +to the “normal” terminating characters. +

+ +
+
Function: char ** history_tokenize (const char *string)
+

Return an array of tokens parsed out of string, much as the +shell might. The tokens are split on the characters in the +history_word_delimiters variable, +and shell quoting conventions are obeyed as described below. +

+ +
+
Function: char * history_arg_extract (int first, int last, const char *string)
+

Extract a string segment consisting of the first through last +arguments present in string. Arguments are split using +history_tokenize. +

+ +
+
+
+
+ +

2.4 History Variables

+ +

This section describes the externally-visible variables exported by +the GNU History Library. +

+
+
Variable: int history_base
+

The logical offset of the first entry in the history list. +

+ +
+
Variable: int history_length
+

The number of entries currently stored in the history list. +

+ +
+
Variable: int history_max_entries
+

The maximum number of history entries. This must be changed using +stifle_history(). +

+ +
+
Variable: int history_write_timestamps
+

If non-zero, timestamps are written to the history file, so they can be +preserved between sessions. The default value is 0, meaning that +timestamps are not saved. +

+

The current timestamp format uses the value of history_comment_char +to delimit timestamp entries in the history file. If that variable does +not have a value (the default), timestamps will not be written. +

+ +
+
Variable: char history_expansion_char
+

The character that introduces a history event. The default is ‘!’. +Setting this to 0 inhibits history expansion. +

+ +
+
Variable: char history_subst_char
+

The character that invokes word substitution if found at the start of +a line. The default is ‘^’. +

+ +
+
Variable: char history_comment_char
+

During tokenization, if this character is seen as the first character +of a word, then it and all subsequent characters up to a newline are +ignored, suppressing history expansion for the remainder of the line. +This is disabled by default. +

+ +
+
Variable: char * history_word_delimiters
+

The characters that separate tokens for history_tokenize(). +The default value is " \t\n()<>;&|". +

+ +
+
Variable: char * history_search_delimiter_chars
+

The list of additional characters which can delimit a history search +string, in addition to space, TAB, ‘:’ and ‘?’ in the case of +a substring search. The default is empty. +

+ +
+
Variable: char * history_no_expand_chars
+

The list of characters which inhibit history expansion if found immediately +following history_expansion_char. The default is space, tab, newline, +carriage return, and ‘=’. +

+ +
+
Variable: int history_quotes_inhibit_expansion
+

If non-zero, the history expansion code implements shell-like quoting: +single-quoted words are not scanned for the history expansion +character or the history comment character, and double-quoted words may +have history expansion performed, since single quotes are not special +within double quotes. +The default value is 0. +

+ +
+
Variable: int history_quoting_state
+

An application may set this variable to indicate that the current line +being expanded is subject to existing quoting. If set to ‘'’, the +history expansion function will assume that the line is single-quoted and +inhibit expansion until it reads an unquoted closing single quote; if set +to ‘"’, history expansion will assume the line is double quoted until +it reads an unquoted closing double quote. If set to zero, the default, +the history expansion function will assume the line is not quoted and +treat quote characters within the line as described above. +This is only effective if history_quotes_inhibit_expansion is set. +

+ +
+
Variable: rl_linebuf_func_t * history_inhibit_expansion_function
+

This should be set to the address of a function that takes two arguments: +a char * (string) +and an int index into that string (i). +It should return a non-zero value if the history expansion starting at +string[i] should not be performed; zero if the expansion should +be done. +It is intended for use by applications like Bash that use the history +expansion character for additional purposes. +By default, this variable is set to NULL. +

+ +
+
+
+ +

2.5 History Programming Example

+ +

The following program demonstrates simple use of the GNU History Library. +

+
+
#include <stdio.h>
+#include <readline/history.h>
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char line[1024], *t;
+  int len, done = 0;
+
+  line[0] = 0;
+
+  using_history ();
+  while (!done)
+    {
+      printf ("history$ ");
+      fflush (stdout);
+      t = fgets (line, sizeof (line) - 1, stdin);
+      if (t && *t)
+        {
+          len = strlen (t);
+          if (t[len - 1] == '\n')
+            t[len - 1] = '\0';
+        }
+
+      if (!t)
+        strcpy (line, "quit");
+
+      if (line[0])
+        {
+          char *expansion;
+          int result;
+
+          result = history_expand (line, &expansion);
+          if (result)
+            fprintf (stderr, "%s\n", expansion);
+
+          if (result < 0 || result == 2)
+            {
+              free (expansion);
+              continue;
+            }
+
+          add_history (expansion);
+          strncpy (line, expansion, sizeof (line) - 1);
+          free (expansion);
+        }
+
+      if (strcmp (line, "quit") == 0)
+        done = 1;
+      else if (strcmp (line, "save") == 0)
+        write_history ("history_file");
+      else if (strcmp (line, "read") == 0)
+        read_history ("history_file");
+      else if (strcmp (line, "list") == 0)
+        {
+          register HIST_ENTRY **the_list;
+          register int i;
+
+          the_list = history_list ();
+          if (the_list)
+            for (i = 0; the_list[i]; i++)
+              printf ("%d: %s\n", i + history_base, the_list[i]->line);
+        }
+      else if (strncmp (line, "delete", 6) == 0)
+        {
+          int which;
+          if ((sscanf (line + 6, "%d", &which)) == 1)
+            {
+              HIST_ENTRY *entry = remove_history (which);
+              if (!entry)
+                fprintf (stderr, "No such entry %d\n", which);
+              else
+                {
+                  free (entry->line);
+                  free (entry);
+                }
+            }
+          else
+            {
+              fprintf (stderr, "non-numeric arg given to `delete'\n");
+            }
+        }
+    }
+}
+
+ +
+
+
+
+ +

Appendix A GNU Free Documentation License

+ +
Version 1.3, 3 November 2008 +
+ +
+
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+http://fsf.org/
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+ +
    +
  1. PREAMBLE + +

    The purpose of this License is to make a manual, textbook, or other +functional and useful document free in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. +

    +

    This License is a kind of “copyleft”, which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. +

    +

    We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. +

    +
  2. APPLICABILITY AND DEFINITIONS + +

    This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The “Document”, below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as “you”. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. +

    +

    A “Modified Version” of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. +

    +

    A “Secondary Section” is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document’s overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. +

    +

    The “Invariant Sections” are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. +

    +

    The “Cover Texts” are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. +

    +

    A “Transparent” copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not “Transparent” is called “Opaque”. +

    +

    Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. +

    +

    The “Title Page” means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, “Title Page” means +the text near the most prominent appearance of the work’s title, +preceding the beginning of the body of the text. +

    +

    The “publisher” means any person or entity that distributes copies +of the Document to the public. +

    +

    A section “Entitled XYZ” means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as “Acknowledgements”, +“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” +of such a section when you modify the Document means that it remains a +section “Entitled XYZ” according to this definition. +

    +

    The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. +

    +
  3. VERBATIM COPYING + +

    You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. +

    +

    You may also lend copies, under the same conditions stated above, and +you may publicly display copies. +

    +
  4. COPYING IN QUANTITY + +

    If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document’s license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. +

    +

    If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. +

    +

    If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. +

    +

    It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. +

    +
  5. MODIFICATIONS + +

    You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: +

    +
      +
    1. Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
    2. List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +
    3. State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
    4. Preserve all the copyright notices of the Document. + +
    5. Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
    6. Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
    7. Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document’s license notice. + +
    8. Include an unaltered copy of this License. + +
    9. Preserve the section Entitled “History”, Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled “History” in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
    10. Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the “History” section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +
    12. Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
    13. Delete any section Entitled “Endorsements”. Such a section +may not be included in the Modified Version. + +
    14. Do not retitle any existing section to be Entitled “Endorsements” or +to conflict in title with any Invariant Section. + +
    15. Preserve any Warranty Disclaimers. +
    + +

    If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version’s license notice. +These titles must be distinct from any other section titles. +

    +

    You may add a section Entitled “Endorsements”, provided it contains +nothing but endorsements of your Modified Version by various +parties—for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. +

    +

    You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. +

    +

    The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. +

    +
  6. COMBINING DOCUMENTS + +

    You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. +

    +

    The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. +

    +

    In the combination, you must combine any sections Entitled “History” +in the various original documents, forming one section Entitled +“History”; likewise combine any sections Entitled “Acknowledgements”, +and any sections Entitled “Dedications”. You must delete all +sections Entitled “Endorsements.” +

    +
  7. COLLECTIONS OF DOCUMENTS + +

    You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. +

    +

    You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. +

    +
  8. AGGREGATION WITH INDEPENDENT WORKS + +

    A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an “aggregate” if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation’s users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. +

    +

    If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document’s Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. +

    +
  9. TRANSLATION + +

    Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. +

    +

    If a section in the Document is Entitled “Acknowledgements”, +“Dedications”, or “History”, the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. +

    +
  10. TERMINATION + +

    You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. +

    +

    However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. +

    +

    Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. +

    +

    Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. +

    +
  11. FUTURE REVISIONS OF THIS LICENSE + +

    The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. +

    +

    Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License “or any later version” applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy’s public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. +

    +
  12. RELICENSING + +

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +“Massive Multiauthor Collaboration” (or “MMC”) contained in the +site means any set of copyrightable works thus published on the MMC +site. +

    +

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. +

    +

    “Incorporate” means to publish or republish a Document, in whole or +in part, as part of another Document. +

    +

    An MMC is “eligible for relicensing” if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. +

    +

    The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. +

    +
+ +

ADDENDUM: How to use this License for your documents

+ +

To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: +

+
+
  Copyright (C)  year  your name.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+
+ +

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the “with…Texts.” line with this: +

+
+
    with the Invariant Sections being list their titles, with
+    the Front-Cover Texts being list, and with the Back-Cover Texts
+    being list.
+
+ +

If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. +

+

If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. +

+ + +
+
+
+ +

Appendix B Concept Index

+
Jump to:   A +   +E +   +H +   +
+ + + + + + + + + + + + + + +
Index Entry  Section

A
anchored search: Searching the History List

E
event designators: Event Designators

H
history events: Event Designators
history expansion: History Interaction
History Searching: Searching the History List

+
Jump to:   A +   +E +   +H +   +
+ +
+
+
+
+

+Previous: , Up: GNU History Library   [Contents][Index]

+
+

Appendix C Function and Variable Index

+
Jump to:   A +   +C +   +F +   +G +   +H +   +N +   +P +   +R +   +S +   +U +   +W +   +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index Entry  Section

A
add_history: History List Management
add_history_time: History List Management
append_history: Managing the History File

C
clear_history: History List Management
current_history: Information About the History List

F
free_history_entry: History List Management

G
get_history_event: History Expansion

H
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_get_time: Information About the History List
history_inhibit_expansion_function: History Variables
history_is_stifled: History List Management
history_length: History Variables
history_list: Information About the History List
history_max_entries: History Variables
history_no_expand_chars: History Variables
history_quotes_inhibit_expansion: History Variables
history_quoting_state: 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
history_word_delimiters: History Variables
history_write_timestamps: History Variables

N
next_history: Moving Around the History List

P
previous_history: Moving Around the History List

R
read_history: Managing the History File
read_history_range: Managing the History File
remove_history: History List Management
replace_history_entry: History List Management

S
stifle_history: History List Management

U
unstifle_history: History List Management
using_history: Initializing History and State Management

W
where_history: Information About the History List
write_history: Managing the History File

+
Jump to:   A +   +C +   +F +   +G +   +H +   +N +   +P +   +R +   +S +   +U +   +W +   +
+ +
+
+ + + + + diff --git a/doc/history.info b/doc/history.info new file mode 100644 index 0000000..a6799c3 --- /dev/null +++ b/doc/history.info @@ -0,0 +1,1426 @@ +This is history.info, produced by makeinfo version 6.8 from +history.texi. + +This document describes the GNU History library (version 8.2, 19 +September 2022), a programming tool that provides a consistent user +interface for recalling lines of previously typed input. + + Copyright (C) 1988-2022 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". + +INFO-DIR-SECTION Libraries +START-INFO-DIR-ENTRY +* History: (history). The GNU history library API. +END-INFO-DIR-ENTRY + + +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. +* GNU Free Documentation License:: License for copying this 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 + +1 Using History Interactively +***************************** + +This chapter describes how to use the GNU History Library interactively, +from a user's standpoint. It should be considered a user's guide. For +information on using the GNU History Library in your own programs, *note +Programming with GNU History::. + +* Menu: + +* History Interaction:: What it feels like using History as a user. + + +File: history.info, Node: History Interaction, Up: Using History Interactively + +1.1 History Expansion +===================== + +The History library provides a history expansion feature that is similar +to the history expansion provided by 'csh'. This section describes the +syntax used to manipulate the history information. + + History expansions introduce words from the history list into the +input stream, making it easy to repeat commands, insert the arguments to +a previous command into the current input line, or fix errors in +previous commands quickly. + + History expansion takes place in two parts. The first is to +determine which line from the history list should be used during +substitution. The second is to select portions of that line for +inclusion into the current one. The line selected from the history is +called the "event", and the portions of that line that are acted upon +are called "words". Various "modifiers" are available to manipulate the +selected words. The line is broken into words in the same fashion that +Bash does, so that several words surrounded by quotes are considered one +word. History expansions are introduced by the appearance of the +history expansion character, which is '!' by default. + + History expansion implements shell-like quoting conventions: a +backslash can be used to remove the special handling for the next +character; single quotes enclose verbatim sequences of characters, and +can be used to inhibit history expansion; and characters enclosed within +double quotes may be subject to history expansion, since backslash can +escape the history expansion character, but single quotes may not, since +they are not treated specially within double quotes. + +* 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 + +1.1.1 Event Designators +----------------------- + +An event designator is a reference to a command line entry in the +history list. Unless the reference is absolute, events are relative to +the current position 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 preceding the current position in + the history list starting with STRING. + +'!?STRING[?]' + Refer to the most recent command preceding the current position in + the history list containing STRING. The trailing '?' may be + omitted if the STRING is followed immediately by a newline. If + STRING is missing, the string from the most recent search is used; + it is an error if there is no previous search string. + +'^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 + +1.1.2 Word Designators +---------------------- + +Word designators are used to select desired words from the event. A ':' +separates the event specification from the word designator. It may be +omitted if the word designator begins with a '^', '$', '*', '-', or '%'. +Words are numbered from the beginning of the line, with the first word +being denoted by 0 (zero). Words are inserted into the current line +separated by single spaces. + + For example, + +'!!' + designates the preceding command. When you type this, the + preceding command is repeated in toto. + +'!!:$' + designates the last argument of the preceding command. This may be + shortened to '!$'. + +'!fi:2' + designates the second argument of the most recent command starting + with the letters 'fi'. + + Here are the word designators: + +'0 (zero)' + The '0'th word. For many applications, this is the command word. + +'N' + The Nth word. + +'^' + The first argument; that is, word 1. + +'$' + The last argument. + +'%' + The first word matched by the most recent '?STRING?' search, if the + search string begins with a character that is part of a word. + +'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 'x' is + missing, it defaults to 0. + + 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 + +1.1.3 Modifiers +--------------- + +After the optional word designator, you can add a sequence of one or +more of the following modifiers, each preceded by a ':'. These modify, +or edit, the word or words selected from the history event. + +'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 character may be used as the delimiter 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 '&'. If OLD is null, it is set to the last OLD + substituted, or, if no previous history substitutions took place, + the last STRING in a !?STRING'[?]' search. If NEW is null, each + matching OLD is deleted. The final delimiter is optional if it is + the last character on the input line. + +'&' + Repeat the previous substitution. + +'g' +'a' + Cause changes to be applied over the entire event line. Used in + conjunction with 's', as in 'gs/OLD/NEW/', or with '&'. + +'G' + Apply the following 's' or '&' modifier once to each word in the + event. + + +File: history.info, Node: Programming with GNU History, Next: GNU Free Documentation License, Prev: Using History Interactively, Up: Top + +2 Programming with GNU History +****************************** + +This chapter describes how to interface programs that you write with the +GNU History Library. It should be considered a technical guide. For +information on the interactive use of GNU History, *note Using History +Interactively::. + +* Menu: + +* Introduction to History:: What is the GNU History library for? +* History Storage:: How information is stored. +* History Functions:: Functions that you can use. +* History Variables:: Variables that control behaviour. +* History Programming Example:: Example of using the GNU History Library. + + +File: history.info, Node: Introduction to History, Next: History Storage, Up: Programming with GNU History + +2.1 Introduction to History +=========================== + +Many programs read input from the user a line at a time. The GNU +History library is able to keep track of those lines, associate +arbitrary data with each line, and utilize information from previous +lines in composing new ones. + + A 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'. + + The programmer can also 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 '' 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 + +2.2 History Storage +=================== + +The history list is an array of history entries. A history entry is +declared as follows: + + typedef void *histdata_t; + + typedef struct _hist_entry { + char *line; + char *timestamp; + histdata_t data; + } HIST_ENTRY; + + The history list itself might therefore be declared as + + HIST_ENTRY **the_history_list; + + The state of the History library is encapsulated into a single +structure: + + /* + * A structure used to pass around the current state of the history. + */ + typedef struct _hist_state { + HIST_ENTRY **entries; /* Pointer to the entries themselves. */ + int offset; /* The location pointer within this array. */ + int length; /* Number of elements within this array. */ + int size; /* Number of slots allocated to this array. */ + int flags; + } HISTORY_STATE; + + If the flags member includes 'HS_STIFLED', the history has been +stifled. + + +File: history.info, Node: History Functions, Next: History Variables, Prev: History Storage, Up: Programming with GNU History + +2.3 History Functions +===================== + +This section describes the calling sequence for the various functions +exported by the GNU History library. + +* Menu: + +* Initializing History and State Management:: Functions to call when you + want to use history in a + program. +* History List Management:: Functions used to manage the list + of history entries. +* Information About the History List:: Functions returning information about + the history list. +* Moving Around the History List:: Functions used to change the position + in the history list. +* Searching the History List:: Functions to search the history list + for entries containing a string. +* Managing the History File:: Functions that read and write a file + containing the history list. +* History Expansion:: Functions to perform csh-like history + expansion. + + +File: history.info, Node: Initializing History and State Management, Next: History List Management, Up: History Functions + +2.3.1 Initializing History and State Management +----------------------------------------------- + +This section describes functions used to initialize and manage the state +of the History library when you want to use the history functions in +your program. + + -- Function: void using_history (void) + Begin a session in which the history functions might be used. This + initializes the interactive variables. + + -- Function: HISTORY_STATE * history_get_history_state (void) + Return a structure describing the current state of the input + history. + + -- Function: void history_set_history_state (HISTORY_STATE *state) + Set the state of the history list according to STATE. + + +File: history.info, Node: History List Management, Next: Information About the History List, Prev: Initializing History and State Management, Up: History Functions + +2.3.2 History List Management +----------------------------- + +These functions manage individual entries on the history list, or set +parameters managing the list itself. + + -- Function: void add_history (const char *string) + Place STRING at the end of the history list. The associated data + field (if any) is set to 'NULL'. If the maximum number of history + entries has been set using 'stifle_history()', and the new number + of history entries would exceed that maximum, the oldest history + entry is removed. + + -- Function: void add_history_time (const char *string) + Change the time stamp associated with the most recent history entry + to STRING. + + -- Function: HIST_ENTRY * remove_history (int which) + Remove history entry at offset WHICH from the history. The removed + element is returned so you can free the line, data, and containing + structure. + + -- Function: histdata_t free_history_entry (HIST_ENTRY *histent) + Free the history entry HISTENT and any history library private data + associated with it. Returns the application-specific data so the + caller can dispose of it. + + -- Function: HIST_ENTRY * replace_history_entry (int which, const char + *line, histdata_t data) + Make the history entry at offset WHICH have LINE and DATA. This + returns the old entry so the caller can dispose of any + application-specific data. In the case of an invalid WHICH, a + 'NULL' pointer is returned. + + -- Function: void clear_history (void) + Clear the history list by deleting all the entries. + + -- Function: void stifle_history (int max) + Stifle the history list, remembering only the last MAX entries. + The history list will contain only MAX entries at a time. + + -- Function: int unstifle_history (void) + Stop stifling the history. This returns the previously-set maximum + number of history entries (as set by 'stifle_history()'). The + value is positive if the history was stifled, negative if it + wasn't. + + -- Function: int history_is_stifled (void) + Returns non-zero if the history is stifled, zero if it is not. + + +File: history.info, Node: Information About the History List, Next: Moving Around the History List, Prev: History List Management, Up: History Functions + +2.3.3 Information About the History List +---------------------------------------- + +These functions return information about the entire history list or +individual list entries. + + -- Function: HIST_ENTRY ** history_list (void) + Return a 'NULL' terminated array of 'HIST_ENTRY *' which is the + current input history. Element 0 of this list is the beginning of + time. If there is no history, return 'NULL'. + + -- Function: int where_history (void) + Returns the offset of the current history element. + + -- Function: HIST_ENTRY * current_history (void) + Return the history entry at the current position, as determined by + 'where_history()'. If there is no entry there, return a 'NULL' + pointer. + + -- Function: HIST_ENTRY * history_get (int offset) + Return the history entry at position OFFSET. The range of valid + values of OFFSET starts at 'history_base' and ends at + HISTORY_LENGTH - 1 (*note History Variables::). If there is no + entry there, or if OFFSET is outside the valid range, return a + 'NULL' pointer. + + -- Function: time_t history_get_time (HIST_ENTRY *entry) + Return the time stamp associated with the history entry ENTRY. If + the timestamp is missing or invalid, return 0. + + -- Function: int history_total_bytes (void) + Return the number of bytes that the primary history entries are + using. This function returns the sum of the lengths of all the + lines in the history. + + +File: history.info, Node: Moving Around the History List, Next: Searching the History List, Prev: Information About the History List, Up: History Functions + +2.3.4 Moving Around the History List +------------------------------------ + +These functions allow the current index into the history list to be set +or changed. + + -- Function: int history_set_pos (int pos) + Set the current history offset to POS, an absolute index into the + list. Returns 1 on success, 0 if POS is less than zero or greater + than the number of history entries. + + -- Function: HIST_ENTRY * previous_history (void) + Back up the current history offset to the previous history entry, + and return a pointer to that entry. If there is no previous entry, + return a 'NULL' pointer. + + -- Function: HIST_ENTRY * next_history (void) + If the current history offset refers to a valid history entry, + increment the current history offset. If the possibly-incremented + history offset refers to a valid history entry, return a pointer to + that entry; otherwise, return a 'BNULL' pointer. + + +File: history.info, Node: Searching the History List, Next: Managing the History File, Prev: Moving Around the History List, Up: History Functions + +2.3.5 Searching the History List +-------------------------------- + +These functions allow searching of the history list for entries +containing a specific string. Searching may be performed both forward +and backward from the current history position. The search may be +"anchored", meaning that the string must match at the beginning of the +history entry. + + -- Function: int history_search (const char *string, int direction) + Search the history for STRING, starting at the current history + offset. If DIRECTION is less than 0, then the search is through + previous entries, otherwise through subsequent entries. If STRING + is found, then the current history index is set to that history + entry, and the value returned is the offset in the line of the + entry where STRING was found. Otherwise, nothing is changed, and a + -1 is returned. + + -- Function: int history_search_prefix (const char *string, int + direction) + Search the history for STRING, starting at the current history + offset. The search is anchored: matching lines must begin with + STRING. If DIRECTION is less than 0, then the search is through + previous entries, otherwise through subsequent entries. If STRING + is found, then the current history index is set to that entry, and + the return value is 0. Otherwise, nothing is changed, and a -1 is + returned. + + -- Function: int history_search_pos (const char *string, int direction, + int pos) + Search for STRING in the history list, starting at POS, an absolute + index into the list. If DIRECTION is negative, the search proceeds + backward from POS, otherwise forward. Returns the absolute index + of the history element where STRING was found, or -1 otherwise. + + +File: history.info, Node: Managing the History File, Next: History Expansion, Prev: Searching the History List, Up: History Functions + +2.3.6 Managing the History File +------------------------------- + +The History library can read the history from and write it to a file. +This section documents the functions for managing a history file. + + -- Function: int read_history (const char *filename) + Add the contents of FILENAME to the history list, a line at a time. + If FILENAME is 'NULL', then read from '~/.history'. Returns 0 if + successful, or 'errno' if not. + + -- Function: int read_history_range (const char *filename, int from, + int to) + Read a range of lines from FILENAME, adding them to the history + list. Start reading at line FROM and end at TO. If FROM is zero, + start at the beginning. If TO is less than FROM, then read until + the end of the file. If FILENAME is 'NULL', then read from + '~/.history'. Returns 0 if successful, or 'errno' if not. + + -- Function: int write_history (const char *filename) + Write the current history to FILENAME, overwriting FILENAME if + necessary. If FILENAME is 'NULL', then write the history list to + '~/.history'. Returns 0 on success, or 'errno' on a read or write + error. + + -- Function: int append_history (int nelements, const char *filename) + Append the last NELEMENTS of the history list to FILENAME. If + FILENAME is 'NULL', then append to '~/.history'. Returns 0 on + success, or 'errno' on a read or write error. + + -- Function: int history_truncate_file (const char *filename, int + nlines) + Truncate the history file FILENAME, leaving only the last NLINES + lines. If FILENAME is 'NULL', then '~/.history' is truncated. + Returns 0 on success, or 'errno' on failure. + + +File: history.info, Node: History Expansion, Prev: Managing the History File, Up: History Functions + +2.3.7 History Expansion +----------------------- + +These functions implement history expansion. + + -- Function: int history_expand (char *string, char **output) + Expand STRING, placing the result into OUTPUT, a pointer to a + string (*note History Interaction::). Returns: + '0' + If no expansions took place (or, if the only change in the + text was the removal of escape characters preceding the + history expansion character); + '1' + if expansions did take place; + '-1' + if there was an error in expansion; + '2' + if the returned line should be displayed, but not executed, as + with the ':p' modifier (*note Modifiers::). + + If an error occurred in expansion, then OUTPUT contains a + descriptive error message. + + -- Function: char * get_history_event (const char *string, int *cindex, + int qchar) + Returns the text of the history event beginning at STRING + + *CINDEX. *CINDEX is modified to point to after the event + specifier. At function entry, CINDEX points to the index into + STRING where the history event specification begins. QCHAR is a + character that is allowed to end the event specification in + addition to the "normal" terminating characters. + + -- Function: char ** history_tokenize (const char *string) + Return an array of tokens parsed out of STRING, much as the shell + might. The tokens are split on the characters in the + HISTORY_WORD_DELIMITERS variable, and shell quoting conventions are + obeyed as described below. + + -- Function: char * history_arg_extract (int first, int last, const + char *string) + Extract a string segment consisting of the FIRST through LAST + arguments present in STRING. Arguments are split using + 'history_tokenize'. + + +File: history.info, Node: History Variables, Next: History Programming Example, Prev: History Functions, Up: Programming with GNU History + +2.4 History Variables +===================== + +This section describes the externally-visible variables exported by the +GNU History Library. + + -- Variable: int history_base + The logical offset of the first entry in the history list. + + -- Variable: int history_length + The number of entries currently stored in the history list. + + -- Variable: int history_max_entries + The maximum number of history entries. This must be changed using + 'stifle_history()'. + + -- Variable: int history_write_timestamps + If non-zero, timestamps are written to the history file, so they + can be preserved between sessions. The default value is 0, meaning + that timestamps are not saved. + + The current timestamp format uses the value of HISTORY_COMMENT_CHAR + to delimit timestamp entries in the history file. If that variable + does not have a value (the default), timestamps will not be + written. + + -- Variable: char history_expansion_char + The character that introduces a history event. The default is '!'. + Setting this to 0 inhibits history expansion. + + -- Variable: char history_subst_char + The character that invokes word substitution if found at the start + of a line. The default is '^'. + + -- Variable: char history_comment_char + During tokenization, if this character is seen as the first + character of a word, then it and all subsequent characters up to a + newline are ignored, suppressing history expansion for the + remainder of the line. This is disabled by default. + + -- Variable: char * history_word_delimiters + The characters that separate tokens for 'history_tokenize()'. The + default value is '" \t\n()<>;&|"'. + + -- Variable: char * history_search_delimiter_chars + The list of additional characters which can delimit a history + search string, in addition to space, TAB, ':' and '?' in the case + of a substring search. The default is empty. + + -- Variable: char * history_no_expand_chars + The list of characters which inhibit history expansion if found + immediately following HISTORY_EXPANSION_CHAR. The default is + space, tab, newline, carriage return, and '='. + + -- Variable: int history_quotes_inhibit_expansion + If non-zero, the history expansion code implements shell-like + quoting: single-quoted words are not scanned for the history + expansion character or the history comment character, and + double-quoted words may have history expansion performed, since + single quotes are not special within double quotes. The default + value is 0. + + -- Variable: int history_quoting_state + An application may set this variable to indicate that the current + line being expanded is subject to existing quoting. If set to ''', + the history expansion function will assume that the line is + single-quoted and inhibit expansion until it reads an unquoted + closing single quote; if set to '"', history expansion will assume + the line is double quoted until it reads an unquoted closing double + quote. If set to zero, the default, the history expansion function + will assume the line is not quoted and treat quote characters + within the line as described above. This is only effective if + HISTORY_QUOTES_INHIBIT_EXPANSION is set. + + -- Variable: rl_linebuf_func_t * history_inhibit_expansion_function + This should be set to the address of a function that takes two + arguments: a 'char *' (STRING) and an 'int' index into that string + (I). It should return a non-zero value if the history expansion + starting at STRING[I] should not be performed; zero if the + expansion should be done. It is intended for use by applications + like Bash that use the history expansion character for additional + purposes. By default, this variable is set to 'NULL'. + + +File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History + +2.5 History Programming Example +=============================== + +The following program demonstrates simple use of the GNU History +Library. + + #include + #include + + main (argc, argv) + int argc; + char **argv; + { + char line[1024], *t; + int len, done = 0; + + line[0] = 0; + + using_history (); + while (!done) + { + printf ("history$ "); + fflush (stdout); + t = fgets (line, sizeof (line) - 1, stdin); + if (t && *t) + { + len = strlen (t); + if (t[len - 1] == '\n') + t[len - 1] = '\0'; + } + + if (!t) + strcpy (line, "quit"); + + if (line[0]) + { + char *expansion; + int result; + + result = history_expand (line, &expansion); + if (result) + fprintf (stderr, "%s\n", expansion); + + if (result < 0 || result == 2) + { + free (expansion); + continue; + } + + add_history (expansion); + strncpy (line, expansion, sizeof (line) - 1); + free (expansion); + } + + if (strcmp (line, "quit") == 0) + done = 1; + else if (strcmp (line, "save") == 0) + write_history ("history_file"); + else if (strcmp (line, "read") == 0) + read_history ("history_file"); + else if (strcmp (line, "list") == 0) + { + register HIST_ENTRY **the_list; + register int i; + + the_list = history_list (); + if (the_list) + for (i = 0; the_list[i]; i++) + printf ("%d: %s\n", i + history_base, the_list[i]->line); + } + else if (strncmp (line, "delete", 6) == 0) + { + int which; + if ((sscanf (line + 6, "%d", &which)) == 1) + { + HIST_ENTRY *entry = remove_history (which); + if (!entry) + fprintf (stderr, "No such entry %d\n", which); + else + { + free (entry->line); + free (entry); + } + } + else + { + fprintf (stderr, "non-numeric arg given to `delete'\n"); + } + } + } + } + + +File: history.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: Programming with GNU History, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + . + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: history.info, Node: Concept Index, Next: Function and Variable Index, Prev: GNU Free Documentation License, Up: Top + +Appendix B Concept Index +************************ + +[index] +* Menu: + +* anchored search: Searching the History List. + (line 10) +* event designators: Event Designators. (line 6) +* history events: Event Designators. (line 8) +* history expansion: History Interaction. (line 6) +* History Searching: Searching the History List. + (line 6) + + +File: history.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top + +Appendix C Function and Variable Index +************************************** + +[index] +* Menu: + +* add_history: History List Management. + (line 9) +* add_history_time: History List Management. + (line 16) +* append_history: Managing the History File. + (line 28) +* clear_history: History List Management. + (line 37) +* current_history: Information About the History List. + (line 17) +* free_history_entry: History List Management. + (line 25) +* get_history_event: History Expansion. (line 26) +* history_arg_extract: History Expansion. (line 41) +* history_base: History Variables. (line 9) +* history_comment_char: History Variables. (line 37) +* history_expand: History Expansion. (line 8) +* history_expansion_char: History Variables. (line 29) +* history_get: Information About the History List. + (line 22) +* history_get_history_state: Initializing History and State Management. + (line 14) +* history_get_time: Information About the History List. + (line 29) +* history_inhibit_expansion_function: History Variables. (line 77) +* history_is_stifled: History List Management. + (line 50) +* history_length: History Variables. (line 12) +* history_list: Information About the History List. + (line 9) +* history_max_entries: History Variables. (line 15) +* history_no_expand_chars: History Variables. (line 52) +* history_quotes_inhibit_expansion: History Variables. (line 57) +* history_quoting_state: History Variables. (line 65) +* history_search: Searching the History List. + (line 12) +* history_search_delimiter_chars: History Variables. (line 47) +* history_search_pos: Searching the History List. + (line 31) +* history_search_prefix: Searching the History List. + (line 21) +* history_set_history_state: Initializing History and State Management. + (line 18) +* history_set_pos: Moving Around the History List. + (line 9) +* history_subst_char: History Variables. (line 33) +* history_tokenize: History Expansion. (line 35) +* history_total_bytes: Information About the History List. + (line 33) +* history_truncate_file: Managing the History File. + (line 33) +* history_word_delimiters: History Variables. (line 43) +* history_write_timestamps: History Variables. (line 19) +* next_history: Moving Around the History List. + (line 19) +* previous_history: Moving Around the History List. + (line 14) +* read_history: Managing the History File. + (line 9) +* read_history_range: Managing the History File. + (line 14) +* remove_history: History List Management. + (line 20) +* replace_history_entry: History List Management. + (line 30) +* stifle_history: History List Management. + (line 40) +* unstifle_history: History List Management. + (line 44) +* using_history: Initializing History and State Management. + (line 10) +* where_history: Information About the History List. + (line 14) +* write_history: Managing the History File. + (line 22) + + + +Tag Table: +Node: Top850 +Node: Using History Interactively1495 +Node: History Interaction2003 +Node: Event Designators3901 +Node: Word Designators5175 +Node: Modifiers6935 +Node: Programming with GNU History8477 +Node: Introduction to History9221 +Node: History Storage10899 +Node: History Functions12034 +Node: Initializing History and State Management13023 +Node: History List Management13835 +Node: Information About the History List16129 +Node: Moving Around the History List17743 +Node: Searching the History List18836 +Node: Managing the History File20761 +Node: History Expansion22581 +Node: History Variables24510 +Node: History Programming Example28490 +Node: GNU Free Documentation License31167 +Node: Concept Index56339 +Node: Function and Variable Index57044 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/doc/history.pdf b/doc/history.pdf new file mode 100644 index 0000000..0732585 Binary files /dev/null and b/doc/history.pdf differ diff --git a/doc/history.ps b/doc/history.ps new file mode 100644 index 0000000..3776eab --- /dev/null +++ b/doc/history.ps @@ -0,0 +1,6666 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 2022.1 (TeX Live 2022) Copyright 2022 Radical Eye Software +%%Title: history.dvi +%%CreationDate: Tue Sep 20 14:17:06 2022 +%%Pages: 24 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMCSC10 CMSL10 CMSLTT10 +%%+ CMSS10 CMTT9 CMR9 CMMI9 +%%DocumentPaperSizes: Letter +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -D 600 -t letter -o history.ps history.dvi +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2022.09.20:1017 +%%BeginProcSet: tex.pro 0 0 +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/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]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 +def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 +rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 +N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop +false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A +length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} +forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ +BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat +{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch +round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 +rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B +/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} +B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p +-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ +0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginFont: CMMI9 +%!PS-AdobeFont-1.0: CMMI9 003.002 +%%Title: CMMI9 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI9. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI9 known{/CMMI9 findfont dup/UniqueID known{dup +/UniqueID get 5087384 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMMI9 def +/FontBBox {-29 -250 1075 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI9.) readonly def +/FullName (CMMI9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBD07FC5A8862A8DB +7E2B90C16137614CDAFB584A32E50C0935109679E31306B8BDD29F1756946A67 +7A7C2D9BA6FAB9B20A424AA0E6F4BA64C2801C2FB5A1156CBEED0ACB95F697B8 +BC2A6E6AA7EB1F9FD8E3C9B1A16697EE1F0E7400421A7765AB218FC837A49365 +82DC6B2C877A7DA84A81E6126EE96DB25C17A207D3020A045DCDAA064360DFFC +E3CD50E21ED239D2A6450D04F879A26443ADEB6A20ACC504989876476C7D1A74 +91564FEA1F4CC2C8C8FDF666DB537F315AE1886C73CB5B00E67E7B398A6C018E +540EAEE98BB8136C4F044EDD63C33431D2CF9740F051DF365A4045D9D8782112 +7BB5D494D9235BA98CF2F30CB119F5A904C32AD04C960C43FC1F5FD8DA7D90D8 +93AFB59F3FF4F796481AE2A7548F948FECFC6C127C4D3F159B08F206AE8C296D +EE470DB2F879EA79475E029D22D7A8535C09A18689DB0609CC233E5199C02756 +972CC9C94D9FCE264DEE5D75C8D651E4E2D1189AD9588CB815722BB5EE3C379A +6F31C2E6AE1AE4CCEB29766190AFA20EA937114978752189F1A9F42B39483149 +796FCFA123BA9CCD1D9BE28289660BCAE16C40B5B504058D55CFCBFB4F4E3D94 +DDBF39F157E63946534DA81C018B1C01B9F10DDB55E0A5C2B3985ED1977C039B +D6755EA42CD09E27751E159C30B93F376DBE61CD3AED34BA36A768F232EB3B80 +E3E6B77C4A48D408217818E398B83D995AB6BC871F20991DF57313D6EB0C793D +0F28088EBDB7F38DAF7E01AAB3476EC24D7BB38A9889A7D3038D930FF4289B83 +F54A7BE1E2D98A3822098D2E4D067A0D400C20C0B2B4BBD74C13ED1B827490F9 +ECF48F8C3994C1C5AAC9CF783BFA4F307528F51EAB55F961808A42ED53F00C97 +72A432EAEDCFCFB622389BDA707B6ACC9433B065CF29EBFE93AD14B8ECD5F47F +F073F11822C49B8BE924CDFA6348C3A75E9BB9BF3F31C41716B34794B28CDAC9 +4DB8B087E180A9B3B17680F73D9C12C8D86A922C948093629F5D7F542ED882A1 +692F4F6696865E53E3E2DD43B2D5E8C989CFAA5CA5C4C5999045E170BDE9921C +BACD6F2863F5553EAB2BA2D4A9034729EC0C4201DE90DA89B0A27C5A5C974109 +4E37BFB3F46B3A506169FB0C68E1CAFC844419A8D261A1FD86A3BB78E33D5FB1 +CFC687A5975987CE45155E5FDFAF0CC5FD5568CB1C26212F92E88255F0549F59 +41B33125946DE43436BEC00804063FBF03EC796E3361B1C852EC3038D107F80A +9198968265D5488B26D7670B22C2D75EDFFD1B7B4AAFA36DFD94640C9D0E2D20 +5BCA18683EFB91834A3939AB8EB60E2F09655BE003582634C52770DA9668C292 +2E02929D812EE2B0CC65F020064AD5BDAC5F5693B30508F40ED8E20E87149BD5 +8DD41AFF83FD1944804017DC5A04512E593549FFFAE501131CE2FDB65EFD0B8B +33809CBAEE411B3941C241550B9C30DD28088708F1C0CC3125CBEDCD985EAD28 +03313741F67DB5744A87B381147D5BA70AE1145C27F794854628D87D6C1ECCA1 +749E3465B950175D3C3F40E344297BD92D3190041A4392033A79BEAEAABB8DBE +CC14E39612F43721CFAE6F79074429221CA588AA2501DE520A464DE157A03AFE +3C082FAE7628FC0C57FFC61D0330AE6332D20FDBB09BF36848FE05E782D6379F +64F9C82C45402481B0A35989027F9756BF5A79DA2D96E10F39167ADB4305578F +90B509B6891338FA1D67DCFD61804AA6621526B2EE4769589A2646581712AC05 +DA6E98D16494F07D612743058F54FEE516BD89A8EC3E03F9D7F905175D3412C8 +F7329077FD6EB25213F3CAC94BA0C3363B759401B6EF7548C7D709F3241D030D +4EB46A1AE81863C412BDDAEA6084C37143A4C5E41BC646315B1CD09F934186CF +49D1D8239E363A435307030BD79536B50B723A39DD763DB539F24A10DDA12BD4 +E467339D2D6DB177D6FC539FA77D2DE4118EBAC161E928749F7C753ADEF86117 +58619F1155C563DF2E11ACA8347908B98113AED58FCD0394150EEC94B7F986EE +88BF7171D208D8F1774B1DD478F0C2958AE372D257E7EDF0F6B5D6059CC4D5D3 +B00FCBD2E9CBE79235B9A5A3E943CC27AABB58728C95C7DBD4F4A1F8A4DA99AE +7377B0CC0BFBD454794398AE0D5F7281771FFE87B25A819F36E692286A42D776 +01794A43CA9BB30FB8FFDAAF014F909A369E34C2F6C75B7D4EB9DB0580E33F46 +19654443AFF8384B95600B86FF8E41FEFD032355626D60C7507C058EF832DF41 +194B48A36F11082D1DCF4723E21401E0C7447AABFAB4639B26E3D2730E348F55 +53EBFF39CDD03E06E2FA5FB379603C879EDB7E1A10F89695C9C47DEEE52BE0A3 +F446F187AB9D7E93E6F9387F21129034F36DF40605D28FD526AF82CA9D232BE4 +412567F06B38ECCD496EF40A7B243E46C9FEBA4F1BF4B1ECA029C5EC239353D6 +C0B100BF7E7DB33BD1277DE104F15AA19F37340A777741AD1AD693BC76DA48CC +C6F83CD84591ECFEE375979972B0FAC4C10B625E4BFB261B9FFFA83C31DA0108 +4FFB6377466E9739E0EB64424BD9FC7239C7DD834EC6788A0F97FE714AF92831 +E1BA36A8A9E24739F1DC82DC26CC3CE28C210AA7C569B19E1784D663A0CA4E81 +AFF43E86D6F5F63778847700072CEB77A4EB946DC1F23DBC00BCE773203F76DF +00F0B085F31420672974DDC642D885E95BA6BBE43E1CA8ABF464D9881CDECC7A +E98E31B9754C9B72A8BD5CF6D4D214DBC3BA7A0CDF6635953F5AC1E7639C4A91 +C7AECE4C75CA3389C348F656FC2CC96C84C85A926237B6504DB51937C9CFCDAC +B75C31ED570D180757884E27757783DB2D5F35ECC48C496CDA342D49AA947BF8 +2FDAD2F19DFE8CD1C76A8FA08F33681F3E12E229D7DAB45BE3A3F258B5ED4980 +F15340CF20D965252843E026803E8AEE736EC41CCA82167401977AB719AA2F50 +0B791EEAA82027B3C712D2EB9D14BF8F94FBDE2227609BCAC41EC08DE2BAC023 +28352F913F7DF08D4E1C66E83F764578B22B4EB7191E852B91ADCCB1BCFDB1F4 +E63DFD152E86FA9DE9BC8908130EFDE29CC4401339C05B5B9764CF8EFF14951A +C6C13AF979546996BF22F2B96D3D585B90CD27DADEC78914DA48432C6ACBDD42 +20EF583FD41F2F6D6D10C3DF7DD077304B5940BB0462656E306CBD91EB9B756B +7014B1884A36201EC582FC9345C386043DD2818FC301EF78791C1D7854F8FACE +5DE9801DE9F59D5B4271E003AB897B2EF49501589D681D59CFFD9B03F722EEF4 +74ABD29997515DA3591496B62666744EA76DCA45504F8075C0652D6779DBEAE4 +90430C2945FBD60AD53B51DDBEFC7ED703C418B4B244C8FFA5A3C1B7600C5A55 +3EBDB93C16AC191C3A28EB2279BD3F0D67C826BC6A73D3C0AD02262368AB4621 +98A1605F2887BC5880E1AF2780330E0FD01D7CAACBB0F008A42C427F38236066 +54799594E515B289044BAC4DADF8B3686B4372C5110201221FDA923F131E07E7 +93C44BAD406838BA4D1C277EF74098B8C0EDC41EEDD58C195D7DFF5FEDBF96FC +19CEBC6C3006DD2CBF76916B4298BB915663C2F61AFD7747E03A03BD7280197A +9DA590E3D081C6F53DBF94E8D6FDDDD910A70AB18A0F6D48A590FFAB314D6CFD +E3FB20C1F3C91063F00726A2C13A3D48323F9854839405E5A29D66A43E6E2B84 +A8B3765F1D817071D4D6FF42BC785C2D11AB2B9452F141696CE19C6AFB9777DB +107D6E22D8CC6C26440BC48248AD8805C4329D46BF433741CB519B21663392DA +5DC7FC9BF37E5BC396BFADD7263D09F6B4D69594AB386B7BDFCF3BACB97A0E08 +22013E716E642592A20136CF9CFD61D4E515D80E06A4CB4FC9D9B916C93CEA95 +B83B98C48CF36C1D02291D4F5C0419338D64E33C90C90EDD2BA3B96D70FAFE0D +403A060CFF448D3E28A9B1E3916018465E86095BAAB4706CF7ED350D7C554789 +D7F4FE5F180767DE8739259E68CF142040BE1E2E8C6152DE3417C1FAEA7584B6 +20781DC4A9796431EE713DAC4E713C839D7A4FDC8AB6BFEFFE767AFD8B67FDA6 +943AD387E5D3BCB09039ADB64ECC2BE2620C6EC269E708DD06C311F450099E33 +AF46AEC644222E7DC4DBB9371EE12CFBC4F9B27AB46AD1DA96CE006E1DF8291F +A550A93026CBFFC1087B134EC6EA76F5E109CDA58FF47338A0039A786A575F70 +B8A03A4F9C8D07A4C856C77D9BCC8E3EAA740172D0C2D0A15BA35C9E5717D7FA +2691774DDE730BB9D7C70D7AE103DB8D35F3728470C76EBA0E670634E1A0BA84 +2FA102BAD7271DF2680D86A4CA6FC353869987700E5E3FD778165456033D624F +E9B3E80EBF431ACC934AA0357E824B8AD73E222B510DE8445C55C07C8E5DE46D +E478F832BDDECAF2EBB11941DCF84CCD887043FAED9AA90D12BC8CA9A0C8D94F +8D3BF1F80B14B6CAE6BB1C6AA405AA64BB94D5A82CFEA548BA070796A02F9642 +87326D066101435AB9EB40BA9EA9E61B363F5F5E3B924369796E8B78DE3414A4 +2B79C6A13ECB2F34E6299658D07D2B3DEF3D4383CE009A927F0EF5C196652842 +D96B857AB5E905201E7E8BA21A5EBED1FC6863BA9A1A6E5390407F75055E2EEC +512FBDB3E82CEA13663F1A1944DA072C765D8CED06AB461470C5723BDC1271D4 +4D1D049D3EB131743F1EC9A6ADDAA038ACA2C41D139DC6A84EC3C61AC7F1E559 +6155CC2F49171F6E07CF56D721D9728E87FC7DCBCAC46455A3694C765FE807E9 +9CBC2D304AF37E0F28CCB22F239541B53A4D24D09C662559267467EA487BD33A +0BEFD4899B581D20582930703A868655C31BE935364CA6A95FBCB22CB714C040 +9718824DFE97929D0482430726CCB5A5307957DD2432A9B6271E849148DEB76B +FAA290FF6D0B18DC5B76407852E81C105EC6CFAB0F620C6DC9DA555A33C167B1 +430A8BC338BFC7D75B7099CC906AD923FA107C74D3FBB719D77A4E5A685FF9D8 +56424EE4AA074434B809D894ED50F6A60A035C5223EA25DD8983B9B34210DABE +718D7B2BEB293FF1B63CFB1CBDAFC69552963D90F5E3FF533A3FDBB626E9FAA3 +F3C119E5E01C7BFF832A033C3515BF049E29558B1DAD652F2888E339E67D15AE +95F9BD14E3253DFE9072B24C0E7E85025B71096AF51C86AECB2921126A43156B +EC812B32B1164BD9B2B947D503C015616DBF2024F5C8CB3236C1DCA653D661FE +6B1C19A22D272A176B7F1B7F9E67AF40DB0EFD4940E58B2A050249CA4E55CAF7 +6ACFD84FB46FEF952D18552B3972D79D808B4C263B8C7E1BB647A2D03E102867 +630D5C3F2C917F765A4F6FB8106BA6A9D0093E27A4CB6049C2371287D94B5111 +6E7020776EBD744C6C920464BBBC0AC206033E8240017F8CCB112596ECD7CAFA +89950CF43FD87ACA750C03A778A37FBCE9C82C2F5ABB135BB02DA8E8C0D24475 +3BEA9D79372D0022FF1ABD378C151417DBC69FE5C9CA38D23A3900E34BF924A2 +90777ACDC37930B67DD44A2E76DDBD9B89598D5F626BFD325A978D277265DA47 +38CFAF16E7FF1946E15F41CA73F7B4B02E5AE8FC4C37B115BC567E4EEEFEFC34 +EC8974B1465AE57759EDDA28DD38A9210871D35D331AE1BE6097C3EC21C770C9 +B25D040B2ECCC3AEB1EA1BF99E0C2C0F192C13BB9152CFCF75332E03F9CEC376 +9B8C285A35F53655BE38713E09AE34BA2DA9C06FA42A6FD2D00CBF2AFD2BADB9 +1571629C65DA38A431710CF5B01FCA68E8B8569922FBC3F9B64A5509B6F677AF +1B97E91FFFEB6308AB68AC58F9BA43DB5E764021E75B56170EB44C2C0A7DB86C +62B8982256D3621EBE3DB3994DBF5C5A14CF34B4AF3BD5697F8E3203085DE9D5 +84B0598169760B925463E93DC87CE70AF4C2DF0F4287D2F2069847BCCF7A37A2 +AD451D5ACE4DBCCB2E14D5DF38B226952E7446BF87BEC736EF3D5AE793304618 +D66D3299AB9F9CA1D13F134FAEDF36750046E27706C7CBD8E0877BB6276E5196 +BC2A355D109C0253644918E1CC11B717DE6FBDA201E769812752888CD66268F6 +4ACF4A9449378F9F9923D584BA1B51F33663BE7A306887BC14A37E3C5A4654E6 +531D6EB63DE3946BD8BA95CFB037991174F36D61D842071E6625605CAA350A24 +FE551025D10871FE0E2599A63900C8520EF4911C53A03897C8BEE152451708E2 +43FCF4E700C583A5E8DBCC03BF9CAB864DBD19E1760945DEA0EC0BA38BEA8256 +D3A8D4F70F6685A99C6BD2BA8B412A26C002D76138CFCC7DF6802931E5D97BA6 +0151F6A4C572235B4196B22B7B2D14B32886DF0D2CA8A277ABAAC53B63F64CE4 +E4C088192AAB674497E8AF81961359C389B51F4A257373D907C615030BFBEF53 +DBD99058FD06E352450B658478C10454AC8FC0232B70D5CB916981978053E358 +99D322A07294748BA427FFD1E45C909171017B52B7C742FD77A8560852D819DD +8DD53211A14D7B2FD11E42941722FD3985D627FDAF87EB57326A0D290B5077D1 +8A4230BEB40523A8565F95E0D44F036A571DB698EDD9D94FEC9512369E5E5E73 +A3CA5C142617944F4F99C0697ED088ACAC007FCE06E5A6EDE7D0E03A3399DCE5 +362271BC31533866BA79FD1FB3F608B22CCD4111FFB1BA35D920A23AD157C6B3 +C3DAE11069D5E46DEDA7158C6478D8B8C0D9DC237CDF0CC6633911673C43FB79 +E4F9B7F27495201E5ADE66255BC2CBE9D9F237DECB62A19D62CB41A1C92432D2 +07F0629E913A71B3F1AAF8B8C5AC66D3C8605A48F8913E39C859E163DB1DBC8F +0ACFEE80A40B6172032E95A76B752B873FB4DF23CF3A655AF1A1B88C8DC156C6 +190DE72973950565454C0A188A33395FD3D529A88F2B578356DE8EBBC12F04C4 +5B899F667D9E6F3A4EC6DD8DE71FD4C2E2B6D56823EE4E0526679D71FF1B868D +F261489F06F97B010CCBE640E2F57BA3DC3332B329F7958394BA9777D833AB50 +005E8E9232547104065ACE33396772B0E0BD66D2C6CC54DEDD071E444D8C95F8 +6F88B31E20FDB80F77C83151B7E25BD3736B4F9BDC52EE78C41E9475E5A6D94C +D348AB42F5E36B4F167D29EBDFBD43B03F77EB296B06A36880FF17D412E77EA9 +F2E7C25FD05E16BEC6732681EA21AC3FF6893B93FC09316A370CDDB86D9E6087 +F6042C3F9ECD742778389170F5F041329782FB9F9702F7533E51F355F71825AE +2BF4F8FE50D413AC9A20C41B42537FDBE8DDC5A5C793D3760C1EE13716068752 +F0AF10812250BEDFB4D7133FD58F4587BACD572505C84A7D3802D27443175FE0 +0D89C3398B55176D8642AFBAB5CBCDFD6220C8488564B4306D74A58CD2921AAD +73CF803C754DAC2F30A5324886E273064FA51781D5BC596BFEDDCE3982EA1AA2 +62CA7BAA1B16C6EBB99B2AAC4E6C9CEFB3D10F19987045C4918DB239E6E63D79 +5F44B9D097118D081153AFF96E5EB39CBFBB99A3BE30909F614869031358EB98 +F07A97EA78AE50375941B2474DB46AF3305F2B208D45921F93743A6CB8AC584F +6BEBE25ECAADD5A789EF60C9F54446687E7B030DA3E5243189F02BA46BFD28B7 +DC14822E136AC7E40CE20458DDBF356488045C95907363864CD6943643BF0109 +EE027A3091C11EA392EA91320EBFEA3B857370AD8EB86D73F035A476F7058222 +E8CDE78CA1AA9EA69A8AA6EBFF3E67324C567B914134DE042D6F8F18A9373107 +536E8D90189917D343F5299024239E2EC1D2D177D82DC8E344A7CF2AC71AEC18 +36F139E7A4EB59A67192BCA9ED0EB25DE13032F6FEAFC3B1F4FC81BB0EDC41DF +B9EB92618667C59EA499B788CD26C2137D70F1B0AF793AF5AD0D0941F2E746E3 +F5A7F0288BC1EE11E982EAAE763CA422D72FBBC0D754AD58FBF92629DC8866A0 +431213513744DB48E52EFC89C83FEB082588E4F30D7DA77BB598E51CAE7E4900 +5CD570C914EFBA426BAFF7A56FC775ECF5BE13F2C42E51EF96784E5201C0B64C +074AC229FF0BFDF71E6D5E08D8755D2C12B770B6466A9C9C61C15582DCD2FF78 +E9E74DC2B1CAA344EC0339EBFF92CD2CC1D62E2FA8FF15E7459A83C6CFA58A77 +2F1A40BD276E76B675FD6834052B33BF9190F04DF6AA5FA3BB7D77A88DD5B600 +324C5E28216F47682EC29EABF35BA842BA2294A3D72B126EBB852AB741186C9F +FC84B12DC4A6CEC08F2D03EE61B65C845841EE17F1B765649A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMR9 +%!PS-AdobeFont-1.0: CMR9 003.002 +%%Title: CMR9 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMR9. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMR9 known{/CMR9 findfont dup/UniqueID known{dup +/UniqueID get 5000792 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMR9 def +/FontBBox {-39 -250 1036 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR9.) readonly def +/FullName (CMR9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 48 /zero put +dup 49 /one put +dup 55 /seven put +dup 57 /nine put +dup 72 /H put +dup 83 /S put +dup 97 /a put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 118 /v put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9AF72336CC4AD340 +15A449513D5F74BFB9A68ABC471020464E3E6E33008238B123DEDE18557D712E +ED5223722892A4DAC477120B8C9F3FE3FD334EACD3E8AABDC3C967C61FF003B4 +B10C56D6A490CE9594D57A2D431B9E5E10FE3D8832E227A7087611431ABCD029 +85F4865E17E17F8CFBD2CADC97E0A8820E3ACEC873F31464466A9545E967E53C +DBDDB8478E69063FBB891566BAF88B7660A4405B16834761F041CCF7650AF955 +F9E853AA9F5F4382E1FE7D0C5BB4023818A2383F91249D48CE021250EC9EEB1D +2835E18FB73026250B32A8849067D5E2258797C917F998F2D4121D96560C5FB5 +B5D3471216639A8671B6DFAC5E3554EC36D9A72518525A795590C74DD70DA3A7 +78BFC43E51D6F2BA52F17D4DD00D389D3983EC54912AFF73684A8A7E345537B7 +E62361C04A47859DA084BC72EA53512DC54132EB2EE671793603015652EAFDE3 +41C4B6B679BD60AEC5153EA0D2200CB1D097DAD770F5F31E6FC475A225995277 +B867B731D5401E2D02B85BA85158C80FF7E2BBCC42B98AC867E67D25DB656072 +55A0D32AB7AA483A5A9686CEA4E2B3031D90D84DB3E2DEE7706C91BA81CB8DAA +700E5F61E07D6998C9552C81B66FD10A10033D49EF3BCB0FF22ED0A3737523C9 +8F851C61C4BF8A213BF6EC70C956AE48B5BD276CC0437C72BF6515B10739919A +F00F6ADD2798CB211668842349171A5AEB0664D2C44397E55A4A9EBDF54A3EF4 +FBBCDAD9DAEF4B0CAEF7112FA828F2F8D9F633D37E5516AB5ECEA87342EF8DC4 +3A50548490F5BC9A8A1F98AC7AEAD9D913BFA10CA86D73AEB5BACC1FEEFDCC15 +B3655522CCA2C772E902FAB2A6FC153597D52763EB44AB7489FF061F7F58E8F2 +AEAAF4D17F36CBFC00D3C653F335D14240C87DB4339DA9D30A5BD1F502BC9013 +461B9DB2FBEEC01BB18990439A0E9CA6576BC9CF6B1A3DB9386C4A5D4AA6A5DC +CFA45FB75F22E10ECB72565DB441A194902C91427B4F676E531C661F7A2C3C85 +CD534D1C89B6779B2EDC8E44667B992C20C70B663BFBF680A6CF4383EB7CA26C +4D1F06B5EF4025BBE65795F1EDB5CCB97050872D6C07BC2974F905ACDB7A765F +291365D6C8152153E7F017A25FB4476C60FD9EAF9A121633DBEAC32F62850223 +D6418566AB350F90F4B35F19598478F76B63E347D4C61E203D4DB8ECB9889181 +C387F4B663A502C638761D2782BB96EAC81A0108D7BD6938F67FEBB69218D115 +D8E89CFABCE15C6ACC7FEB983332A51A6A73CF4E341574F366713D7FB29956D9 +9BF238A87483D37E526A2EA2F101EDD34E34CB92730DCA7235AA0027189BE405 +2DAB4AA021A30C28B26C50808E1E965C02F6212EC7C72F5683339425A7739380 +A422E6191ED8453AF0CAAA424AE44DFA7CC5C2F6EAA8D73A5101D8E9517DBCFB +2858D0E8ECB7DC430EF23A9E4428CB7DED8D035D6050251AC101A2D0E884721E +2F21E573F948048BB8FF888911C508CC198BD750083B339500C426AFCD5634A6 +AAAC1C7E91249667B231BBFC64B4317192FE07FE9DA0DDB5E517D097AAE46577 +9555F29D45C67CDE9812CAD03F220B20519F2FF32DCA56A554D4296FE2D1F3FB +B209B5270E0E695EA5A0EF1144957CE045881AEB8D05D72CE57F4D34617AED67 +0D3AF0472CD8D60933651626550366E300E72A9C89ACD475C2E2ED9BD44B472D +9DAFE943F8E02A6DC38E447EED964624C37C3130E48211CA279BB6A0BD59466B +42F3D89B5746F29E084E22CF58395AF0F29E55113F3A3F2F52CB3A6DF3D026D0 +C81754B8E2E4A15F6943BE9D0087D5166060734FD07C4C57D7C7D90E8C9C1F35 +623CEEE3ABAE75E1A18A1E3B50B7266BD2D8E812CFEB4A46B856885B185640D6 +B9C22179551002B94282F57FB433B7FF157D2F0D240836B72AF4A331668AE5D4 +E6B85415F4E8B9D2F9AF90FAFAA0A3866DF417CA5A31348CF9B41B8F5F4D2F97 +CCF7ADE851B5E2E2F6E319AAF5792EBB9DA2C6AA8B73D889F3CDAA42932CDA7D +07A7E59183CD89520DDFC36E5D513BFD8AD0886046585F29B4D7F42CC0C27AA7 +53915AB1167D292FE91957E94A57FEE2D49C20C9070ECD736BDEE0F046E60350 +EA539DC298156A4E0D019E7D481FDDA6861E20678516AB80ABEC1F09B126BCB9 +52E8272A06BB6DD87ACFC423B4A4FC9A3DC8DCAEBB807C5F748F1FF8B17B8B88 +F426206BF1B7B7D239D26BC3CF0776C467A98CFBBCA5FB6145D5900137ED19DC +D002F10704AA680EC753C22E29AAB15712EF22AF73D80820A1EEE953463D4EA3 +81FAF99518D4FD0F862A324FC44C4B9542A92C5B60CC983CC8F647CE5BDB4D6D +B92B380E0E5F7208A9CD91FA9A469548162C761C1BA05AC9D60B766764D821B6 +B4E17F56CE455F06EA1EE2D38FE47581746C4C5FBA63AEE2B58E877D1A8FA83A +31C972D53B64E92EEEA147426A92CFBF76FC614119C6E9C6476FD6A069C803BF +E949FBE50B5AB1F1463F9747E8D353F7BBD991C4F90F920BC9407D8E24720293 +846D052214E60390C3CB926D38C83AF697425D80C2B4FC4706615B905516B733 +46ACA325CEA68FB21B2D17CF0B68BA4DF249368625CF83441EDBF2B86C957C1E +44CD722BD2537CE84FBA07EC7AE15C840041B9F7F3040072E6084CD55B301C08 +A64A53BD4D3DC30DCAC6C152F316ABC59B8EE978793EBD568849DCC2A75A495A +BC83470D503F8E389F54B4A4A31624E83C601B43AC1E52CB811FAA7CA6B644A5 +1AE0BFD4FC774C9C9DFC2769ABFA9C83F900BE2DD4010416053A1D4874E6ECF4 +D86E44B4CAB15D53E5630C144B0C15B58DAAD785BA298B1893D1B09BA5D40344 +6678FD2D17FF6674433C976D6DAC659175CED26139967C9B2B9CFFD78FC2570A +E5142141C2888DBF2DC8503F9137CE7CB21A1EBC2D65BF33FCEFBC85C9CB736E +24E8595CE934AB032CC70BD6A3B0F3BDBFBBE185512FDB7BE3D4A6620478453E +75D044BF770B44C9741E31985E6DAF5A318D7BED12B02A4BCFE60D25EF12843D +EFC9BAE2A3F2EFAD66D7858E83EB46BB09D2FF8AE9C43844A7001C86ED97AF51 +C511E3A89A1BE349FF5215D1A57843EF51456B9838133846F19BE79AAA5C1AB0 +5F400E5E8E7B0BF96EFCA3B8F0894BE589F2C9FB6C97BD16D38F0A237CD4F034 +099C41F85C7E2C7BEC8E02C4F327306A53B4B48B26A8926670CEEF96F6DF2281 +7C2DAD99EF8B81BBB777227C2475AE7400DC393D9C0445E925DB1E955950F7AE +53E9AC4306794239346A419F7B5DF4168382EF5956B81F83BD4BB7635B3BCC84 +7D84D05AEDC02D14675D777CD19B08124001A4F4EA96990D96000C082A12F00F +7FEF793A7FA69D56D3A38D012168C5458B667190AFE80E02C816CAFF0A71953C +D80B085CD286027E2FDBB05452AA762FD7C813B2E19A79C74190E04E746C4933 +CE1E300CAF5DD53B08110509BDA404EF07FA1BC5224BF1205DE8E0C3276A13DD +866675103B960C5F36644F96B4FAC16F5D6E91F74629B318FCCC8E8CB13EB76B +B0B7B90718D913A52A04732EA3667674994A325A7973C601A7DDD50F658E0826 +ACB8E53D4914B0274AED98D7BC3B2B7F9D48A7ECC2F8ABEE05CF2C4F2B90360B +B7DF779EAF3E103D1D83EDBE32DDA873768D8C37DC10A5354A94B4153049AD64 +FF3E0BB51AB91D7C0B4134D8731CD0270DAAF19BED9EAD800A14B65B68EEE89B +40DD624111670DDC7C030DEFE0D1B96420E249332445C155BA96231C88E70643 +D526BDF3CA1E05FEE72CE2B881CFC01ED780C10E89F0828AD55FE29043BC56E8 +2750A6DD15AADD54492F6092618F4CC6A31766B17FC60766D18C307EFC9BB787 +39047DAD6B38419EFBA46B4E2C932F97451FE78AD75FA90DE409FC6DD46585D2 +1941F5ED47A8FBAEF5A917A240959E8D9F9917DEA3247D9CAE6BF7A88DB4C4A4 +F9F5A6DCE542420A032FF3392FE0F3357B51F884D6181583A554F75B1DF192E9 +253CC828FF06B0D992D5316435980B044BB191508C7C45CD90F797F88856424B +14A5707459C50EDCF3E3D8D1667AAA83015405354CE744C66D9A5728F29E0085 +6DBF740717FA0799E3BCC4ED7841588B496A5E549B953A7FD288B4A045DB611E +E3B2F35963FF18ACCB1C968BEEA2CBF52B3999AAF89A05320BB2E97F52CFE06B +9F10E3A79865A3059A957F97972D80ADF678A36E2B586C101FC6AFA4D137C13E +EE7102C9B8EF78CB057F8B7476F146E8FF5C897FD5503DD198128CFF7B5FB339 +FAD0AF0EA967F77B07B367A4AC9F668F8BED99B98E87FAC750EE045602D76C3F +289FC9D97694C96AAC0AD1BD3FA94DF2CBCEA24B40F47B9B59E54EECEE7AC4C3 +A3F5D19160E4C1EA830D57FBE10D8D46AC5CA0260F22FAA45236F0F542BEA9C5 +5A88F878F68B36114E0573900C65E305462B22A3429A17C7A567694414DDDA46 +5F30542B8FD4F00F6C295B2E8D3A986B953D96822DB2ECD48E8BB1763434E652 +152EF3717F5E7FA10FF0B01D9F64E22C5DBD7254629658887BACEC0ABDE972EE +67299FB84A05B3EFE22B6976DB4CCA384232DDAE38C31623A4E39EA2E82C1EA3 +BBB68F1A7DBF405DEC37CB7203A895C36A44BD2D63F45B3888AF91D37B510A59 +3C921BB44DA620892AD87B665F69F6FA510B071ECC403CB2BE2F54B3969C9E88 +713244BC97C1466DA8216DA7600C221E7E7EF5C789D2E12B36422023A03E11BF +2790FD6062FE6BF62F5010A92F0A104B76E255A0975E04F6F20F760881BDA7F5 +D834D1D328B6EC19AA7D5E5678A84C74C82553DBE8BB5765E84F5A8789032143 +6020940B4B8D45FC3433D356E28C25F42D0C19F911213D85951B2B00D01B77BB +A4C72E964F9D95422BEDE582A05CD52E03D28A996E6CC8FCD910CBAB728073F9 +F9FAEED5470FFA55930447C5BA816F826F983D53EC9941EC8364B3060FD74C95 +26D4F5CA753B574FD2FA4D1D333785241D8741B79E628BC852FDC35478C5ED9A +C1BE88C5EE7302816E65C12B58EA16FEDD4672EB3E24B6EDAD5DCE263BA8A970 +350B651E5A9F3C281D85BC3F44EADD0D93402E36489BA5185E7D388974B0B700 +70575188BB610CCA20F081E2CBDA13DCC6F72567962ADB342E02C1E763B673C5 +F7384E24C6E1730A3A790D690A2103AEF88E0C1D4480DC9B25E5C8C9E1919C95 +F83320179B4C7C4A26D559BFB24D7D596FB73758C9990C451E77FCDDD17763B8 +9C30A9534E3CB6680D3D419D4B70B0B0A0D160FCCDE169714E373F65B7144CC2 +DB9A44E041211E1517D3148E65A2486CBE5E74E625261CCF65392FB4F3091473 +F9E8DF327D59A58558E5C9F7190DB577D5DC658F5E36258291C708B3D224653D +064BB6079F91293FC733710893AD1C96169B30CBFE4E9D52E7EFAE4AFEE68FEF +1AFD5E7E9DFCE8DE332B0FDC0514F9B3090AC85BBFB527FD8034DD33E9576325 +A8769AE09AF1BA792447DDD932B98FC9486B39E0B04DDB3EFB7A30DA0940B33E +E27490E0E841E87B1C90E5248A91742ABEDC10F43A8AF0F9C5B4A4930B1AADAF +01874B9AC3B8D0DBECCDA6CD7E96471FAA15CB7F8A599C5746327CE392224C3C +40BD60AF97BCA6FF6FCAB2FEA114D7300B89E91C3BC92D5B3E2C83BB37992D8C +72F661EFD0AA034C738C019DFB79BF40651A1A34BC1EB9F5AAF58F8B3DA32645 +24AFF8636486F08BC21533B5FF7391B0679A78DFDCB03DAF6BB7475A1D51DAC1 +EE4BE9B986655D1FDB6936445EF99B58B303FE79F11275EEA96A9F6808EA8775 +D873D1052FAC93769789C700F20EB2ED6D15676F6E563A769CA9298E463FC311 +83281483B1C953370D196727A6A0E66D32D9480AB1B6DCA77868C1A2D5DB6483 +5F31EB6B18EEFEF1CDC31533E69B0AFC6B30FC9912DC89BAAEEADC30BE14F448 +1A6B70D36A5D9B01799BEEA686066114910842D022EB464A9A1E8F0A5628BA69 +AA9A1925CCADD44703BC67A89F3B48E4680726DC4360274185CF3C8AB747A8FC +4B928AD62B092EFE48B01E33ED756DB696171FDB775396BBA138E056F71EDAE3 +7A1E4CC272B8418114B0E81DE0BC43DB3C133167344488820A92DF10FFA26FB9 +65FCA2C87D302E956DE6B4FE145145440C83DB43A68F8B29A592B127BDF49063 +B7F11E155CD4CAE305525BEA56B7C412A6260426407BD892A3F2B444AC3421E6 +FB6E6425EB5C3053C5644666B80405530FA0012B54557327C98E0F4F064099A6 +4ACAAFC1870359C1B6FBE7606BB8A26026AE20C212210449905E628AF1B20490 +8CE908B7EF3E3DB551C85AEB0F7FEB6A8D215B97998E5DD9C7CCFB2A9402B8B6 +1770D4023777D4B45A73F471355353412C51D4CE71FAD1E0AFBD87B5F86307F3 +10D0B94F1194EFFB64AD5DA54A4200490F609CA8B912E149F8217ABB1E9EBB3B +C4470E7365CF5E1E761AA1945044B225BD53D142F6588C50E0644740F7DD55E4 +8F73201E5354A8BC78339211AFC4935F44701FBA043AAC4BA4698E9D7700029A +C79F992F62627C91EB855F64C4B251718FDA71EDAF082A0C7B00550949D617A0 +7071FB14F05620CCF2180941341D8E60FC88823438FD728A4042AFA8B853107F +852F631518B61B234565291B5D5B89DA818DEE3AE3B68A2869DFA63255CC882C +3B16BBA08FCE3632E57FF7A07F857A1F0FDCADAB39D77960BD827CCC8661A997 +648BF5BEBC0FD2286C2A112A8DEB9CCB6330A049170D5D68EEEEA011D3EF3EBD +855236B9380087CBBB6BE24191F728B7EAC5B50F7A547AA0989B7C7D3437DBCE +1669341264E290646F2C8C5A3ACAAC7CB63DC692FAAE13E9B40E8BD39FE16A0C +1660CE66872D061056C04DDDC265C024BEF8B7E3C3AEE76FE5C9702002C28BE0 +B180295EE00E567FA2E5CD1638226D24A7C732E1BD8103B476EF5702768689C7 +D4FCD47F2AB94A2B1FBAE6ABF87B09E7713C773FB65CA83F7318035B332B9F99 +24A2C8897527021321D003AAD7C273E4BFA2710B9BB26C2CFD3D9A5D7ED1096C +552D50028AE2476FCD6D12A5D0A897521313ED1A3A8456A70C16EAA50A3E6733 +6DC89FEC56AB54A579EF264377A103939D5EE00A90B4F2206D0023AF9491FBE0 +800C6540FC945199E20E945F46CEEA2E885F6800B9DF042BCEF4291A4B1A62C8 +6A7ACFF872B25FA3AE69E0093F3D0FF13A3313430C06F1AF94D500431566F659 +E8C859A5F80F5BD2E85C8E32603D3745628E8FE6FBC50FA68F9C3811A2BEFEA4 +5852CAE2AE5AAD3230ED050593BAD0A9581EB7B327C6916B8FC348F4C23E6FA2 +00FA28AAACCB3091C1D83F7BB88672A53A2EA3B8C7C24374E400C57F0F01019F +E52D5C47F389D4C9AF126F4080F9AB8D1C8F470932BBECCEC72A9796F6E965A4 +82057DDB43D68298A00880D4C2E2496F26F015FD83C5549215753459310339B7 +6B2961EEEE74DA31FEC8E2BDDA42D4080A32372AC372524BDDA580EF6634ACE3 +128C69D04D890DCA337212B109585C665AA83EFE47D5BABC2627A86EAD11BF7D +744176652C7F9497785A7A06A994ED8414BBE8B26E74D48CB83FA24AAFBDD507 +84A90195EA3D77BCE8C2BEDDD1DC52E8164DF15D65B916EBDF3A8A76849653DF +AE3CAF9561AF3B705F75B9E5DFD6758DB65A2FD54683759912E0D0035CFBCD86 +5C7A69BCDFE8ECE3C5F1C047BDAC4B2DAF36832BB25487385C650FC3C30A0894 +2CEB8973FA2E6C749D88789C550C32B2230FB689F0DB5E9F5E2A8133F6477232 +AD8B11FBDB46362C03A2967EC7E875CC0D0C94437517736307F4B8887FD275E2 +E346171058EC303E62B84EA810FCEBB2905DC186B95AFC6AD4127429E71BFC7B +79E612C18501DFE5AC0E7921BF1C6BD483FD867BC2938609EE52C0271A7ED1FD +EFEA3CC6F0872C28108F7EBBF5BF770C0BA6C712275E1239FA44736247CBAAD5 +B856D7BD6E5E186AC4C3913293D99529B8F9EAC85FE548406DE5D90A058F1106 +F98799495DBB3A05C04BD649053FD29380E217942F71F70C30735423F6F13DC7 +F5015DA9043FA42C1045FD7E0F586CBF2D967E468B2E8E763415D60AEBA2BE7A +BC199BFE58FA66F52AD7C5ED80B4481C08EC85B51D5111091F54823FDAAC9DDF +DDFCC6DD16186911750F761F9907A438DDF4506C6ADBAE868F8AE594EDD14B67 +2F4AE01822A99E924DFA530CE96B6A830ECE92ED0AA54E82D971689EA5AACDB6 +EF5562BF5C5C05996D08F30998D4C5AABCEBA2668C779577B2ECF422EB0192CA +E5A6376D0A7DD36AE46B713D0F7BA51039E05F76B3DC275C95EE5FAF3A6D8765 +36B55707F5DA048F27E64850AF042F96BFFFD3B3903C60869AB41C1D92AA8ABD +1FDBE17E30BD3C035BAEBD18239DAA330A84A5FFE1F4E73AB0D97814C976112B +9DE60C280C67CE7B6B5CCD4A00A4866D2F89FB374260E9C0D1047C26DAA81658 +42A4DDD43FC3AB8DADBB4D53C5BC7FCBD0403E755FE896AA75B11435C7A68AA7 +2F30E648E53BC96D108520D9CE9193DA216221F842FD0F3FC6533B95EA18BBA9 +22286C98403528F049DF779B434B60BDE95597FF0AABEFDF460AA0BE6AC0D179 +D8120F9E6B053113D442CC584FD6EA91C4F94FEDE368E0B9DE473F786B0FE914 +21F3099CCD799C271639CC314F9940AE48775B4094985B207F8A833037FDCE9A +CC73F75B045E923878E5F33D28C98CD7E3D8B59B2FDC4A483CDFE067EE6BB49A +AA5DC515825A9FCF3BB17187332CE5CC9FE34A8AAB8931883A177C37610A75DE +C881A5C5EC31782C568D1B04D2233CE0930FA5D878A7BD6CAB5CC86EDEB29124 +A9E47F4F5A8A95B780B4286397595596B95B7422964D5D2D609CFE3440E62146 +C04C75E9EFA7845A3A760AD00863134C211BE72DD261ABBAE39CC898A634A429 +F9D0B4733117E3217EC749F520C8AEA79C2D61038BA7A2B491D23FD512B31710 +8280D8DF30D8CA287A2B040C71F73911C8D5C8917C242C02A331EE280CECAEA7 +FE970E55A74B44A3EEE8ABE0E207824D81AB21C8AFCF5D4BAEA507A2B669177F +E94D14189B0552342C288137DCE659AD2F629533B07E8A668E68D117A3EAD47C +D56112F27F9B4CDC7D414D3B7B50B4F489556C7BA0A3DB7E8C29DB3630B72D10 +2B874A871540D45D3F9B39005F6F4D8095A21EC9F557EB81CB08D826B257A40A +C29D2907B33C90D28E6FC5BF776DB2466800F8B10325A5A826C7C959ECC2D2DB +3DD7EBAD12E1955C958FE51559594C29EDD3DE5931CC13C766F9223C555CCFB1 +6BD1571D1F0F61584608EE366E37AA4B5DE50459E00A2F7DBF7232980A348B0C +AD0009DCFBAF1970B2A8022199FAF4079610E9E335396BBE2B43906C5D49FD87 +0013EF41B79E49B5EBDE37373B8179748A2208ECC9987F45BACF7B4FD3D56A0A +64873020DCE8EDE7ED99A63327FD3D695A193EDBF90DC8A018BCA317B08759FB +45133229F99FFC9557D0FCCB67758049A446061AE96830DA3951E84323A7DDE5 +75937E1E8FC44D1B4B272C6F2FBF4E1A4F314B548E46EA8A4DD6076BA24CB572 +B26681037ADCB67BE340151001642913BF172ACF92FA3787D8743830492E2781 +D54E9771414C185B58E15953350D2486757F78CC5E099001627AFF7B58C206AB +CCBC550797B79F6DE84CDF2049AFCB62812CEE8454A918504C1463A0BE0B5664 +DA447AB71A060B517ACEC106C6BF9AE03A6D15026DC7BCF3AA98FC41B2D263A9 +9D7889A5C15AB3EBA00DFC9E095BCC4C44547D566AE9831B7AC4B253C2658571 +06DB8A68192AD9586DC7E5145B47DF21660523F680D85246E3756169B3FBD813 +8EC48A865241182332BEF52606D9D8F980575A7A8CAADA6136AC9CE8532125D3 +6C3EB26E2257F6EB80314143177A167F533171AB5C16D71F28FDBC1F16E06499 +4688185850778D7372DFA56845D468CD19396FF3EF1AAE7F596542A55730ADD1 +9574BB00A15289BDBE8796C599B0D4627FCA53C1486F7124FA047093707020F2 +B161B3C343CE9B31FC9E9E37619FA30D58A082F41601EE3E7BB420DEF4C8A0FD +6254E9EB5D2927452C649DDF5D0B2925126FA9EC4D65D711CF943FCD7F58C518 +9BAED942FA06619E39BA7EB20492EBC7EC93D95965C6121CDE165CA660A8FA9B +DD40C3EB89C0E2E963440FF61F98F039974ED30A1E080D5AE6E801B081D89235 +DB8FD7D0EFDB5386ACB4B5ABA03E7D9F82C7F3F2C57D6A4DE8F972075FB1979D +1537F128E94BB3B4CCABF46E2033DDCB213F15B16469F7410E70499F15950CCF +6E1F83C4B87C25FCEA468F8E5B973AFCD5EF74438A5ADB3BB0D91A0C38329070 +9EAF71DF918A74D81228B1860BAD29FAFF284E6979D5CFE5F745A90E14C5FD71 +8F856C4DDA56D045EE22877F25F3330D16A825F61551CA52EA1852ECC7A2CBE1 +9584C756FA0A322CCAD06D9A1875BD14690A0ED6115C23DD0C3223EDD5E79A9D +CF18EF3B3240DEA92AF27D0D44BBA56788BA3AC4F97782D02F742721C068B702 +62D59D8FFB2D2C5862F5CE393E2D9AAD5A7969D22F7C8AEC9BA90F2ECCFF54DE +98CFCA43192EBC2BA294810AEE0DFF0D98ACA9305D1A33F8912919C03580F2C5 +2AE44C0C1255A876EC4298E12F1BC17BE3F3E9F43616D3E3440DA8E0D5044DD0 +35895C4DC1BC280ED84A564F79227CC2BCCA1B39DAD02789B13FD15C9B60B3C3 +9C9C47442DCCCB9377E8823D7157FDC1F734EFB6A53396BFD22839A97CB026C3 +E29CACE7A9E8D9AFFE49AF1AAF800E013A8ED5A22CB3FC0504F1FE34F2068813 +229C62C9435372C81312CC73465370BB4540E24A7D35701A4F0E598BFDFF939C +164481A395C61BA61748BA0FA396F7360ACE2A6E8AFCC9081AC259D7F8C4C4B3 +5FE223CF1C93B3F1B75917E855A5BDDE3976A31887049A4AD6C8234E1C0D3E31 +C504CCCF33E22E3A7707C0398E2F994EA40B47AFAB3B6B7C6C5887B79C16E255 +3033428DC3A0AAE04486F36E1881DB296AE845A2F422E7A79F4A048077CA31C5 +7531E2B5F5F5D7D91F8C5B6711952C5D744BEC6DEA810510F9CD16E95C9143AF +9227F14C4F2C5EE75C82A62C5C8D80ED13DC518BB3465BE921BD31ECFE0AEECE +EB94D3C5C7687BE86CD137055077E60BC1F134E9BEB3E4F709528A893B54B4A3 +5B48529DF1A4FAE03DAB8C28D821339B384F4F5962581CCDA583C0EC09D6263F +96F61A14840557EC0FD9C17C33C1D507F0B152D5AC297135C2C6A331A4FCCC6D +501A08969CD6C091EF9AB457755680F34D61DC0F1C5474CBE940C68ADE951D8F +9ECEF97273115AE580D2756462AAC8B5047EEE3F3ABBB03EA8DA7E3F331185A3 +755A826B27915EC8C9BC4A4528990E5F84EAB95BF8F14A6A3A0ACF99ADF30921 +87029D30353ECB1760279B8677A55A0D71F70620D66E1BFC747D4B901A462E47 +C87F864B6CA670FF56F6548E38AD161AC74F8525CB8D4DA880506ACCAED5F8D3 +4B7D484F76F4C54529888A9F8BBD2DE8876930F334CDB54D9CD72A66BC03C549 +3FE123DBFF46D80FE89993F03A8585E5C90F47DE133674BCBB7D19FDE6E8A89E +EB90176F92AA3C095825F515627CBC11E4B0D8EA20D3B435D2050104716BC1A1 +89F3C00B4AE327C643074D5D7CCF3133C39967DDE5652861DF69D94324CA68D0 +A8B8518A829D4A0884B1B8A3A06A2E144B8B73BB90419EFA4512B181301507D6 +7EC25983C83C544A7A8B6DE922AD09BBB7B378A3C53E260744EB821ADE6FA512 +40004D22029EBB932450C6A6A703D5DF1F7944D12EE69F5ADA72BAA3E69786B0 +DB79B8D16CFB37C0B6CAE7A94C9498654AAA21B76D51FD067A00FF477A6FEC5A +27525F85273B01575E49F10F8A14531E9750FD38666427B020024CB981696A89 +079D10650FED50A1989C1A9C509170C4C296DD40E87CF9F8F78C8904E7AE5D90 +F872EFBCECD772C622458C09503CD98C1EDDEE09AECF940640D979B5087013FF +D1AA7582CC928483F8CBD2A8CE5D2545BC45FCAD47E48FB0A0A3F9A1AC37FE8D +531380F14718773ADCA01C090104119844DFDB128801D1BF8A086CC6142E4644 +AA58DD23B910DCD4A88D4BD0CF65CBB006421CEE74EE1B279A7A51D9C04D2E42 +23EFC041C1B943E694A389B4A9E3901632A5CA640F91D1EFDB6C88072BDDA54D +EC583FBB93FDA9C9C61D1D98AA1FB1A2BA4C72B1390F87688027F29B6FAF70F0 +E9D48093324B2895F129AEF3187649C6FD3C26185A812E489159ACCA2F2FE797 +D283B0A26A07652415D9D4A02D46E6420D2D890E26D23FE47589ABE8CE9B4A94 +8D880612325E470D820B30E842D2A46F498E3C6EBC68FB53E5F7FE8EDEF8F7CE +85C8158DC36BDB6F3584B46E3843013FDDF31229215045733B3078E344211AD7 +8DAC4332A5DD8CD8B1BB6B9C654DAE5BD33E813C70A0C90A187BAAD38C39CF4E +0C46C54F0B282AA168B3B77DB004678EC86B38601E34E989B5E82B4573133F27 +47FB6FFC01A26A4C1BA9CA5B69EFD9288B62E53756161EB3EF1407C426199524 +26CC7E5318B3D36345FC17734B971CEB33703A2BD3882B5E360EA54F48BC4441 +A5947F2917E184AF56FAC34FF504A8212B794E212646F0BE71EF55E013DDAD18 +7255F33E0A209DB1A0C45BB8212E46DC626F08121850C0177E916C98FD2B4BC6 +6AEC7AACF4B3D19630A5BEFBA00FE0AC7EE873FEC27854BA0EB16DCFDAA17C2F +C0057C85BAC9244AD05F88CC05D2A09CAC0AD4B01EF0FABFE565F3CC71111A7C +6AE1FEB3C657B982AF72ED527491863AFBD1C8473A7C28C6769C8A10AE18145F +99C87772D625C02A6224799B01B67E21CB2202719C309BB2A5A781A9B67BA67A +56C18BDD7749A684464FF0528A40EA576EE8ACD132C78B81E012827708DE9504 +733E9F692C17365DB8D4BADCA04D3F5F968D21F77111AEDFA9BD53D1BC39D68A +DB875CADA1AD9E50E79516A37F11BEACD46B02B3AE11842178CFFE9990B2B16D +D5AB4F1CF9EC349D141F080DF768BBD6CB785DE6A665CD74823ADA7B737006F9 +7BBA98A9B44965813A441931DA18873CE327DFD35E8192C8809F02BBED8183BC +17AF50BB95750F660288D5B3E13001A1D330056D50D4D069403595B8A18DF321 +BDEC558D0210BC679C135D8C2BB83A5E5613EDD51E76BD2DAA67FA8E74A26A75 +71F2849B4E3B4593757DAA4270A3600DF96A242EBB69E947140CA154B443B908 +44698C41B488227F5AF0EFB0D8A2E015FB9A90D28D9F7707FBC2B2C65F63E289 +69575B2845A823F03F6CEE1BF783568C70E4796D387F03D4CF3E4328173D2B08 +CEC1D2694B13C395B981C0EC9169EA35808A26527C1B7F15316426697804157B +76EF0BBE41A42F5590CCF7AA901AABB3DC32DBEEF7A24A1924B10DE655C73EBD +3071FEF7276EF38FEEC7F544AC1B68769CBE98237AB8EE411EF435E71D51373F +64C55CB88B3C482D3B47DAD804586E5077F678E72B67F6C85FCBD0A6A9BFAA49 +F87CED403626DAA867C300F3B2D2C597DBADC3DF8B15746B33887B2C4C4CCF53 +EC3AACB2DACB914B458B9E0C373C2B323372FBC8489D30777148AD3167784E28 +22F5CA86A3C54E144CC6FE93F0A2F7D95222DF69B0F4B896AE9E4E12600C4054 +CA7CC585809E64724ADA88EC845D87F81C314D5A1EEEC25DAA1544DA0169163E +87416F4222793775B0FF349EFBCD14A32291FA6B63F2E6A0183645EAF31E2D85 +E8BF8BDF43790F86CD11F90153FE852FA79E57E465C41E4E5A6B7E7913035B71 +D7AAB0E5B7FC2C953558DF1B403D9791BFE2BAC479E2BBAFA9AAB4D749DE02DB +F2A9D3CF3D2CF8C4521D453478024D1824DE9C21F34CC387A965570351253EEE +BE8D920B219106CB0401569E7C81ACBC7B3DC3B1C4FF14F017366EDA62493257 +B099439672EF7B0BF954774CEDF3B0EC19887613338A66821E9CAAE0B2864E68 +C0969234882AA39E2AA90AE9E3B2CA22DB3178D29D4106B27B781C4752302EBC +56DE145488C0306CFB3B4E23A3FB9D1D3156EEE5CE6040CE446D6EEB8037736C +176A8A855C8F665F6B55878D9F3A10B9CC2838474095E13DF61D6AAEB95900A5 +3DFE4D7D25E4885A19EC5856AF7617AFE79182DB185FA4656061E36F260C4316 +42A4589E7CA8B2C95DF751A861C2EF2921B6A8181C30A7E0112015FCD9F20590 +26AEAE99AF8F170CFAE5EC19BC396DFCD32CC78CBC47A485ED6E88D4871C5D61 +CE271F3AE45222C8EBAB0EBE432D3D2BD9CD69CDBC9E2F47961C9F74589382E3 +F7D6C133D7CA2E7C52835C48AA83452C69E7127F031DFD26B40CF409D3408D88 +56F8576972EFBC947400C8485F55267579C41C83D5418BA24AC9ED39DE4001E9 +68D0062ED8B8CFC5ABAA91E59D2B33B77F42D70CF896F3CA5408951A25CA3A4C +9B31EF3BEEFFB5C9F62BDDBD38029B27D2FF99461F3A9DA8500CBA6A4F46F489 +89F51D149470F18DB41F5DFBD78D82011019D3F6EBFCB4F9A6959B87466C259D +BDD14B284F1954ED9BEC8AABD2A94043F8BEF7F14E15BB7901151B67B4DCF824 +FCA42BC7DA7CB54062AEAD59ACB7F5A0B48985D2F408C6702FD25BA5869A658F +80024778A4A078AFF95332A0E113D9F0C71051F46D3D2657AE8191CA7FD9A813 +32A50908D672983773DDB25A9D06A174B750A19AF2F06BE981A5FBC999F20171 +3060FE8BF2DED7628FF1C2A22BD4D288AFE44FA6E0515D48C35F60BCE52A847D +C5F340DACB8FA15544552D52D819293765B7BA4184C504A8656797F91765EC53 +BD0A8E2EDEF3C5F89D7AE357E1C5CB10C5689AC67D0998C0BFE07B0BF1FF0E51 +F0F93EE4D49CBD3C29394A1AAE2D9E7D899029D9F5C768B7D70177B44A3BA335 +02E7AEDA13E132AC1D91FE66A194827B00453C72647EEFF3BCDA0BEB7F6D2AAB +50D477D017DF0341EE249E8CDB07D8764DEC30B217967EF9422ED96D7BA3278B +BA6A9659A7AB945CA306399726CEE1FE24856DA2CD70E5ADCAFBEE37F2F4E19E +FC780DFF2899C82FFAA0A2FE9A5A3DD6A8AAEC10998A377DA8AF8CE7CB2CF4B8 +7AE85B74674370669A06F7A3C4C19312318C7BEA80C5282F18A1C870EA786671 +3B5123B88BBA35EC72B1855EF6539F00EBE6B574BF0D26A528441588A191F6F8 +A49C8AF170CF9455BEF83152DC0438DF17B350FEE2B9CAEBD92DF32205990FCA +BA6455388C5CB8CF444C1DAD0A1028B369E6DEE21EFC40F557EBF6A8BC91603D +1775A1A0DB52DDD9B0F8F86334D76018B90808A3569701471CC6A9543345070E +D981CA923C7A49E22C758B639D085B001C2ED5D54331AFE2D95FA1D77C9655A7 +8D920659F7A0127ACEAC6E687B9D4F5D452761CA30B7EE6BF7B17F86B7715422 +902AA3FCC3B04FF410B5184A2C665F24E0B2A0E0F06E0A5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSLTT10 +%!PS-AdobeFont-1.0: CMSLTT10 003.002 +%%Title: CMSLTT10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSLTT10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup +/UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSLTT10 def +/FontBBox {-20 -233 617 696 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSLTT10.) readonly def +/FullName (CMSLTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 49 /one put +dup 50 /two put +dup 97 /a put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3 +2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777 +6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18 +979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E +ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF +B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59 +A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA +3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F +D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC +6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F +3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C +4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90 +DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2 +753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131 +54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D +107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3 +7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231 +328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9 +85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C +2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7 +308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450 +CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195 +739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93 +FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6 +F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312 +3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A +A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F +55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC +A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB +69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50 +82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0 +8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8 +0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6 +0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8 +1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1 +D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F +B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737 +170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863 +767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D +EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F +AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3 +826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235 +8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048 +345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE +67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD +802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E +20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127 +5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07 +0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36 +22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC +4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF +CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B +4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880 +0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5 +220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403 +7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005 +27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE +B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300 +7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07 +A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D +45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10 +F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7 +C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65 +AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012 +DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781 +FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA +997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4 +3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A +2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605 +31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22 +A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891 +43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D +4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5 +94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E +425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616 +FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5 +51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9 +859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852 +E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F +2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910 +82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA +22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D +200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5 +892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32 +0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140 +437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3 +BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9 +E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402 +DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1 +CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551 +80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F +FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA +9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41 +031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90 +9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3 +9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891 +4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB +57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B +2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39 +0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9 +03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067 +22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79 +06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC +39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD +E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163 +A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6 +9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6 +B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F +79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553 +2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5 +8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA +1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA +0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2 +BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3 +312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3 +B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F +9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16 +A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6 +91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F +7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D +78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC +7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09 +766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11 +016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D +C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3 +8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278 +E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC +6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8 +B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959 +44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB +C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE +5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB +42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A +F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57 +CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009 +9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2 +82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72 +0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5 +F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9 +EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA +E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD +D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD +F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F +14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8 +BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2 +9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5 +6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A +6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116 +4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE +C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B +A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C +9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780 +42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE +7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024 +1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D +4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540 +CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4 +D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81 +CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1 +0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9 +92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0 +57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4 +5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4 +57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158 +8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0 +C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3 +7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7 +B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674 +EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521 +D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9 +DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074 +F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D +D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0 +56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8 +46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40 +52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA +19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D +465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02 +0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE +078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B +DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339 +F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6291 +4663BAB0C9AF29F46951712C354B1EB67CF3FFF6DB1FD83F056774CC7F2283B2 +49B075479604C9B305D9C4587AC495570DF9C4F05525921AFF53D81C0D5AB7B5 +6F00251395F7675345C050C6679867C964E82EE6981E93684B0B28AEEE03B79E +4C26DF3A514E97F57A397BEA4315C09652254E780916102F48220688AF69BE44 +0C2CD2F43A576F4606BF4F1817C78B7068368AE36D593EC32F0C344B0D728A55 +089C518FC3D903FBF3FC98EAC7567224389B666D105516F48B7F46FF5A13572C +AA7A87B6AD749B9718946CFD1AE8B6D3CC90CF6A87B9B2F0C2F56D5FDA37CB61 +6AC4D8EFFF054CC016233A437E615F13A2A393CF269C603D2D57683047A0685A +E19032F5857E84E9DF2D16FCCDCE2C3679DD509E5A6058CC9FD78A7846017FD0 +178C712CA8D1B9A9D2DFEF19887D01D19B7C3AB4A02D5CFDED33131B7E46AB35 +3091A04328F530A8296C6F35EFA6182ABBB64C78682160034BC4D9F68EFD6000 +0B844CCF122E632068853944E646E33AA88CB79B127254FB45132447BA9D7AC4 +219AD1D5FD4D77723C4026768A051FFCF2AF1B7E22D2D598D0BB54669B0B81F6 +E010506C1FFF5BF04BC512CD766A955212B373C41EFA8733798257736CFF8B51 +52BE941B6791353A134E451A83BEA38C0A187DDFD23C2B7EEAC1A2505D0355DF +840C695952357E8780A6C9F47BD189EAC599A7C278B5E1E61467EB671953C2A1 +C71E035F3C66D88DF56CD37A37A400BB39D5CFB15A5007F9B339A5DD70ECA10C +BA6B38B84502FD74512D99E4B8E06409664C7523EB035E6188DD37140CD7FE55 +3878C6AA72F2065C7DC50D34DF0308A2798BA4E69E96AF19B916002EFAD38731 +EF1E8CB091AD21DBB2CDF345E5833EC2E51984A841B3EF04E0AE87D470288B7D +D42BB81C4A732FDED84096C947AC915AC401AED151DB68FAAC3A721833673B14 +3F7BB8111DC05BB7F707A9F57ABAD8B53337203640BA33B1689C9E431991EA36 +EEB231066F374E62432DDD055189844E5695469DC4511CFFD616FC4803C864D0 +873874A028907E5D0B8308DB5A19C65348926A62DF837AC247E7D6A55E23C696 +5313A67FFD96DE214B403B5A8CDD93E4CA1945C89EC9057D0456621EFCC1C42F +61E7C1DBA1F6EDE6A4BDD6D319C6341059F62609F14EF9E82C965D20C44BCBC6 +06B539365913C49FC2942C94E574415896FD459F5BCA2AE963891433545C5A11 +A85AE5ACC8E5995CFEA2482BD2BB3CC844F2D3A83821ADD3724A180D1F042206 +00581E061573D63C543AC5B9585B2A5D201A84A3434595C18761BEFDD00CA4E7 +2956D4486197F5AA7024E5FBE2FE197BB6491508E89A67574A63AE346019D4D7 +D4D23DE0B9D1D544ED82E0068BEDC5CB1E953204D731D9FA5AD7E8567E10B3F9 +F54F745A44FE06E6B2CEF76DCE87281F2D4B57C343844CAC894C1E3074873B21 +CC6DD0DDB106CBC6FF0DC13CE3132E9B86DC5DEAF638C0B240151ECC41DEABCA +0F1573C9B6A83E176FE8B160770AEB16E1AC0BE350165E28DBE259ED7BB1200D +83708D25774547C2D86354CD161F8DF70140EEB8DFEBF8B916005C5A5D3C1D59 +6FBD8EAAC2A93F3061E700D2CD04E803DA26401743B9AC7CCBA5F99E88E401C0 +453CBFB8309877E1003A65A898AF76F89C54FE4D5A4B51F07920967757FEEE7B +0836ECB7F66E922DAF520F32D9ECD0B83CD7719CB95579B6FC27D6E3E7DE3E8B +03965C6925CF9FCA4F06EDFE9EA48244C7A315B866D6B3F5C767B2B15FBCCD5E +A609DB4FCAB2C2246D320DF17D60DEBD6C2E78FF32CB7D120E9D1251E0866D14 +8B393910D9FBB4225C1B384BAD153C2B1FED53725B3F4FA46CB6DB649F6F1380 +9ADDBD04FFF2A8F3E53A6AFD44A55A1C394E2FCC723EFE4A30FE24963472BC9A +F349542BDE1FC7CE25DF0484ED3A1A344007FD9BDB04E863BBFB60996570557A +71EE4C77B244331147C5A70059A74064B3F2556E0B70E3A4BE685712379C35A4 +E616230DD8C716EFC1E318BFC8770272A3A7DBA0E0EEB60419207B6B2855124E +70575EB86D2DABC9738141D3C2DAA80F4488F1AA94B3F0FAA24683F2370B1ABF +6D06D5C0BB9063171E0F8FA31D56A9793738B7653E05EC4D5F136BA8C6BE6256 +2B0B79DAF5F989CEF8E5F0F42888D8EC9A32F2074DC9174776DEC9C3166E5B81 +F44F7AFB85FF7F7E244D3D64856D71340A13B267D04F25CD68126F443E1215EB +3615891A22B8A27FACCABEAEDAAEF7F7DF4C0BB15C1B652ED6033A76C4538F10 +324713DB4683F0A7C272895A0D9AAED5BDEC07080F9F19D61934A6B344216873 +A618463B816701EAF3F507FA0C10FC3BD12A1118E5357F2C502DD25315363362 +D0FA6C0BC28691C752DF717A651E8B0FB5B88696BC3ED7E23020CA9D6BD8D03F +7292E2C07399C40B9EDB7D161908BA250227EF489C16217EBDC6C3465481973B +72146FB3051DF328ADBD7A98986E7227821E2C24DF994A24884266AD2BCF0AC6 +B36A938DAF8E8A40AB859290FA078CEDAC6B0210A181ADBC199AAEE6793F4F61 +5504E4CCFD6DCA48F246F7F969633C70C5667B663E229592963ACD8A6982C6F8 +F52F5116DEEEDE61302F89D92EE1CE0B1BA22CF9F017D7747394BC2ED5BC0141 +6B247B07D0D2CFDAF75ECFCFA5D1CCE76CC9FFEC345B1B3A34194EDB4C75A06A +B03502F7702D368F2BC048F42CDD18829CA3D96CC07946DB257A3580787A5C40 +802A085E900E4785B1B9081DF4F0CC55CD292B034B4FFDC1E8326FB3170653CB +844636627878DDFFDE6CD0F6D8EE3FAC7AF79E03C3238AB517874DF858BF4D17 +971BDC9EE0152E969BB876784D35317FF452AE220819D1F48DEF67D8F296735D +BF445BD8815B21C3D9CB5A262DFCE53AC150206B32889B1E6A6C48452AA56EE8 +E66A7F99EE0F7B5AA66109DA632FAA425646350E58EE8D9FDDAF4DAFCC33DADD +C64D2A62092406E28C9483DB256D0BE9876D3E95F2715264B842193BF2860BA0 +98A8DBD3043742744C8C60E4AF996C733570050B09D1CDEC63CA7AAC157CA349 +B9E6188BA077DFE2FFAC844F6B6C3152670DB3C7FD149DDE67054B869A6EB19C +C8756AD1987CEE857262450FC870503F54A0B2A6574F9BA63F43B72DE9CF0528 +52BEE0FE270AA0D2E6B0D87B361CEFCB7F4635E4ACB38311428542A954C551D9 +BF33B8194311C20FA0D97D411ECED2312DA77197E09239660AC6A9465B06E3A3 +2AE9EAACF07AAE6D297DA00E3A366B0465E48117600936C8EFAB79D9D2A156E3 +EF0EEA375EBAE7DE404ADACBDBB45F830E8BD185C8348316EE978598A80C83B7 +24F89C1BA0BCCB2AA96B71D51BD66C3B87F58F9951F9872033109BE5CF1B4D68 +B17EE96C0AA378FB7E1163A6F6BC130AFD2666C214414383D9E0EBCD993C7A32 +0206A4DA1040CBE19B348701EC6015EF37BD273A46BDB64CDD80927BCB9D7B49 +B5F7F69DB66215CFBAA85F8CE86B788520DE516F36F7ABC6AEB7EDAA268F8523 +6008CA78284EA582E23C0F6E09B8C67C24711D65FC2C7C3AF48F8630D6AB7516 +CC29F74199D60E0EDE2F50B3A1CE95354CBD122E1DEB06128527016F23E8696B +053936A66BBEF29330F33D578CF456CC65EF39AC87BF10B0C677C4E6D8B06915 +ECFF2EAA9CF67139BA9249D581E9243AAD3E59FDAAC3B28A87758412D6F5D8F8 +F79EC4C47A045BA16D3D6AE0F9AFB29C7A20DEA61B932FD7240087F64EBC6379 +DC0E3F1DB7388853857E457D3B09536455528047E4DA6AA7938E3F656986B61A +21E73D3773CC66D813DC3DDD01C5E60E3CC098764E3C4EB309B6482A10F2C928 +B10AF5138C4225967A8A801F0DEE929E63B1A16FCF9A4D75723BD63EA3458FC2 +E3218E41839E091E134B655ED4049352A59B9BB7447BE1987ADB2C8309ABC25F +6743C6CBA2C0049869BCF800838E8356B5754274ADBCDA4F42034B5F49B971A9 +E2FF41AC8951BDC0BCB23F90919477D227FB3DE0C205C53C6D1D4A995212AF25 +06255B0BA2AB068CCE1685842774F1325B2594DD2C59BF414C6235879089A789 +6AD3DCEA1F8271CA3F41269AA934CC3A60C25A91FC73FCAA66D7068176C8F777 +01002FEB2343AB559B310FC5ECAE480FE0FC6A3D10B6037831852A654E2C326A +4EB26FE7155EAE63324E6796724B435522DC5935691F11D0B1DA1040F720768A +DCEE90219413C6358C7A602B978339B22103890EC4ACB3425DA4A1DE274BF619 +281DD83B9FBFFF431B06164A34F15CE90D76642D0587036FBE526ABFF1FA0694 +526C25F271910751C5DB07ACB4429059B6B9C5644FFFE2C622F5F7B6ED859249 +DD3E98EF0C0D6E0DB6CA03DD87BB9331797889A65C4708FE9A696041FC5D1EBF +107589B49CF9A04EE49AFBD59FA7FE9E3DAD2C46F44F6F54237302E498B80C61 +A975FFF794971CB55252D049E414DB833A05BFB0AD2FF340D73893A3286A17AB +C4ED27AE133D7FFD9FF0F2C9B96E83E566EBA52E5626CAACC6A569327C4F74C3 +ECF1DA1AA4E562073458A21785766FB65F487CB2DB656C438FCD2D6D33692FF7 +AA14958C5AAF35F8056304978BCA5901BFF9879441A81CBD9C270230A19269BF +110EE3382AC29404412E2B975D6C11CC5AD1825E10F74C632A7F54834C6BC433 +0EA2A0B303057D8AF4C222CE233E408D02E0E8DC600BAA5A6D14025CE0459A34 +B57B8CB8AF49A804EBDFED5276AD608FF1C8A9F299B9B5802225ACC1016F627C +9F457B3CDA742A6EC8507782C5009DD5F26090A1FB624186840F174609517773 +DC17E6EF8DEEBDABCD84172AEAE450A585EA54FFCABB66E652B885000A457D7D +17B159385131907E7B82A978B73ECE7ADFA85E755CF11D4123BBE0991BB733E6 +17F193AB516AF3D0D2A17FE00A9B3264953206CE596101D32EC850F5A5890CEF +00C261F646555B7BC183 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.0: CMR10 003.002 +%%Title: CMR10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMR10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup +/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMR10 def +/FontBBox {-40 -250 1009 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 13 /fl put +dup 14 /ffi put +dup 33 /exclam put +dup 34 /quotedblright put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 59 /semicolon put +dup 63 /question put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 91 /bracketleft put +dup 92 /quotedblleft put +dup 93 /bracketright put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /endash put +dup 124 /emdash put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 +569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 +24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A +2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 +8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E +3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 +D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 +D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B +03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 +767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A +8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B +DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E +94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 +22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 +72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C +8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 +344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A +64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B +07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC +1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 +78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 +CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 +7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 +BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 +4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A +5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D +EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE +EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 +4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE +0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 +C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 +314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E +DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 +EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 +DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E +DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 +7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 +1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 +69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE +EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 +7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 +CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D +38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 +22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C +0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 +BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D +4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F +3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD +B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE +15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 +849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 +FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 +4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 +1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 +84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF +7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 +CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA +4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B +3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 +F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D +F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 +DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 +D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 +56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 +8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 +59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED +49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 +87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B +8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 +C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 +D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 +D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 +F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 +0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B +5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 +229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC +17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 +01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 +F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 +3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 +689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 +4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F +A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 +DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D +364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F +7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F +26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 +43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD +8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 +C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 +94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 +C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 +B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 +4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 +7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 +204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE +B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 +7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 +279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB +E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 +CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A +65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 +BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 +6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 +B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 +63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 +4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A +A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 +67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C +DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A +5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 +C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C +9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D +B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 +963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 +D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB +B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B +72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE +B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 +8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB +3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 +668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 +ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 +69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 +C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 +3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 +407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 +11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF +2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 +4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 +2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF +9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 +CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 +DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 +0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 +5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 +9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A +EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 +09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A +2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 +AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 +324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 +486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A +EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 +52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 +9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 +4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D +B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 +BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 +6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 +B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 +16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED +E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 +546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED +6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 +559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B +C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A +ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 +04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B +7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A +8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B +A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 +94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB +C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC +41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 +7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 +18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 +9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD +E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947 +5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F +4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F +E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF +9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9 +89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87 +7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3 +AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3 +3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E +61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B +F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F +D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6 +652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA +07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11 +6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB +EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2 +BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77 +2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDC250E2AC3 +9A160EC8C9654FCEB36AC2B586E978D54744FC8A0E963D8EF6E228ADD22D093B +B889C940206F504F14DD921D909BE06EC9BACBC23EB9E9D137FBC983570FFD2E +CC5D2EB5D2A4A8604A4AD418B800EDC6B89809E00091A2315EA8C071AB631CCD +04C3EA77541646B7F9D70B7EA564D92A65C4DED8966517660EFB9F77E172CD8F +1B5FA83270898C3709DE964B0C4A899418435F92C13E94F5C1C5B9D7DF3E8793 +5F9E83CE1430E3EF275C26835080FD2AC78DE88BF65298A8EB4181F215181356 +A09245577F997AB5F23F31DB7E081C7385F461B083E96E3F08890BCEFBFBB6FC +E597C3F22E0F0F7B6A93C55879A8EA022411E0C1864E987D2F00CE0427E4E8DE +D92F9621E3F7751A3CE5CF1EC306A78C0D1CC6781A016A285C0D195E17B59A63 +C593D2DC78B6071636FFBF968B8E7970871E4B60DF79B9BF341528C4F0C5008F +191FABC891AD46A68212B20FCC87E25AE386DFA935CC1563EA96F1339B6CC859 +CEA88CCE5DD0993F19E3902D9683ADA47980535FB5597CF57C046C48E0D0140A +C40AF806F16E94FA0C046C0F32AB5BE121A7157A42654E7C1FCBA31379FDA9F7 +BFA8A0D0384D3B29B9DEA1500AFBE314EF78B201E5F679AA38F12A87D1E1512F +F71D12EF75F3DC48BD8BA01A6D091F0C5B2B961F4371E588F79C825EBC124C1C +E334BD4714EDEBB709068CE0669738B49AF675692317C3E530C6AE57CA21B59A +0B542AC77FF404DEEF116796DFAF46DD8C9290CDCA4A16FFE88A0D60ACD6CB47 +440014F30DA7C27C199D99A1E6D89D0A0C31CD1AD4891668DFF5FFFAE992F10E +C7B88872E9AC808E0663929D199AB424136E03E284D8F44DF9235246B9D22C9D +79BBFCC936171A58B943DF0EA5ADFE2818992B46DF97AE05915E078FD6AAF8B7 +1047AD85A1CB13CAF70D095264B8AF9A3FFE6A603B10EFC6A20DD56A9947DC94 +06DE0A6AC5B655C71870FA1BA99322E51D46A52D3E7AEF8189C9F1DE58AC9833 +7B325CC59375D0F61488AD740909A855DC069F260A465080F5570CE7D41CBADA +47C1AB404D32CBE9E1B8220A27C8003ADE08A63AB714709CE4312179218E4924 +6CDEBDCAE80C39AC4063789B6A407EA9C19D12688DF86B62D63BC05E9D65ACD6 +CD5DBF04B896DA28B466D584426F531F4A3F9C4A717A0C5ED8C8CB4191E950DB +CCD311A20B14B417714501AEB2F6F8510242AF91BEDB6D70B1A52B91FB3BBC8F +A8F9731E745F2BA8ED8B00CFD8A93B2BB05DC2DFFB5EF265CAE08E9B046C3F0D +9DD51BECA540149E202F9042A94113745077BCC293DDF27CEB36D7B0C78E1B9C +0308C3A413492F0D59409D923BB699CC6F59285CBF31CF7F1B464AF4BC054880 +B279621391D022E71427F275BF550881FEFF31BA2071293421FF99BCAC2D5483 +B7E56EDB7929BFF410A35BC193DEB96C4A1894D3D262DDCE224ADC5C6E85178B +40FE0E15AD22D7B2F6D066B0DB42E32B026967088FC62BF250842B195D82AB30 +4A5263BEC475A33ADE6EF9B4205BC44543AE6912F1B9BB3D694AF8E9CFA440C2 +E2CA5DD42B637763D9C96DA8DCE38246532ACA6AC4BD7B8F2D348A0A4BBFFCA3 +4CF17A22BF7AF3BC490D254639584011D9D515EEBB719246499AA89CCFBAF34C +77541F2112ABE03FF03C5C8B2BB07DDA99390C222C7CBC96AAAFAB4EE6391224 +6BF97923CCA98DDAF09E5E01C94798C4AE609E954BF1E40330D66423C3CF96A8 +F6879E2135374C80689F757F71375E333A3582C2886F0615F2379DB47721F6B4 +04385DAC971DE716D5AA2CA014EAE9FD0859A89CC62667BD404A071154F7015C +4E1C734081F61F33176F8805AEA5A95E427712789EF20881BAC36C6190971AFD +B876670811FEB1DBC25014AA98D3D0D9A29CA7D853C8118DDE2DC2402DC99211 +438F8A380EF1BD24B442988AE5DD9FE3A87B54BB834F2AB8F69241E7A10559EE +9E1F3DD7597A041F96313568639B2BB50A76FE62D7714AB955DA07C374F642E5 +2060C46160DE1F11ED73A837DEB4EF5FEF9BA654837203FE8BCEAC3F500A0957 +9E673A257569C4D4E6B00BF84FBE1A8C9A566A77B3693FD20159F95F66AF9559 +A80D47C776CD363E299BEEE2D5BB9B10B58B1AF2A76242D59997773834D8945E +F42FBB1E75B90B6BDE5E4DB2E2FE96BB5B8E485E42682E9F4ECF97D61D441707 +9D2DCF09A0E67F4027A9D1072FA8934106E9D7156F7333342BC640D6094EC706 +5BED449D636E42046EEF2AE810351BF1E38581FC71D1BE17BA690B2567F52A39 +1205F2704B712B22C4AA4684CB74785537AE120F66EE7FBB73A8C475477E1E83 +8D6CE79D788B1AE7A159013A2E070123EBDA58BE4DFC8BB39C3D561E2A2917CF +1B3F64217ED680EAF63F04F9415D7F9CB6A5D3E0BC2A6EA4165E69CD8F93727A +4F4E9EDA653BCA0422BFECC33066DFDF3E4AFB32361ACA3A0C339E1B4B1F99EE +EF4C3C3ED1FC3E7078F7FE282F0F6793A4C18A484F1062F780D2947F2AFF2E84 +182DCBFBE1BA25E8346045859715EA2437263F6CE83BE0B858CEE6A5CAD60BBB +45723E3858702B52B9AC50EA918DACB15EC541ACDF19782024143AE9ADC39A0C +AF0B2E4FCD4E97EB36923F31341B9D72B917711F55F4ABE40E6B5F732D46C76F +02BF82C68500194FF7CDEE3CAFE3316C4643295F769C4BD964C3BD4196F7DD45 +EA2E80DA6C2B8A23DADADD50BD28E2DD1BE5852CB88CAA6FB71C40F8EECDA3BD +CE874BAABB668133D5001FA651BE928981AD1A8D95ACDFD83095F12B3E460DF7 +2B68B2C84DB441EB1ABA2DED0E9BF8A04B1572284498AFA3F6DBD1D4DAE8D4EA +877B0AF0944DCF4B6F6B55ED1D99ECBB2A7393DDB4634FC166A47B4D5236C543 +F066200A255781DC3E2E583A0288C1874BE8C25A7C13214A79DA8062B0274429 +57264A9AD87F246982C80FF9E34473082B8A836A0C83FBB736DA740688432090 +3EC63BE175131C8CC487F76FF44F247B7951454D01876332B4DFC27CCEE5476B +68B432744A0C3689D1D79F2B876A30975783B96F904B92F39D2D3FAE7ACB1DFE +A19A42AFE6A2318B0E3542440A40A69FAC261313DAF36C61FBA307C908682BF6 +658BB9FAF140EE91B182D763130FCDF172B811359D669E86C106679FADF3E2C1 +F83685B6CA73CB8E1D58323B6A733EEEBC0323A6F23BE68E5977EB3D881522F2 +0E49440AF248939790089CD9615F24D9370355054A7077585637E6D80E13574E +B802422BDE06ABFA0D1601D78E215DEBFEA118A5CB82E68C5EA656FE97A5E1AD +01A8CD577848C5DA4B9D780BD1B0B4362FA271BEA800890613D8247171938596 +CEBD54A77CA281A5326F2E6F6111C5CB507FF35387ED3D870BEE3C9F06E6E756 +7E84D952B39B49905AC2C1BFF606AD3C07E45A768BA1969F865C58F3455FA101 +2657884B120E69D4D515F8BED9D9FBE928CEAC720A707BA004D95434D4236957 +86A7AB03ECCC79A9D33039559291483B27C66EFF11B3540F7A0E8716584BB29C +EA6259399E5FE1962DCEE55E4AFE699A7BE7E2C5081D6F025F66E4A236E95C01 +9ED2BC2B369D0F7DBDE3F53DEF90FC9F29DDADA413EE3589BA2C9B802F9B5F44 +E00109A44BBAB43AA4E86B63C6E1FE10E8C7049EA6ABAB908C0386FC64BD8C6B +BD8A089A521EB06ED2F433059D5AF5B4E1E86D6F0ACC65A5AA9665651E82F38F +10ACD33897B4612A7D0E08C92FB67193C5F16DAE8017F3F246E509422F8AA656 +ED88EAE8608354A2F6334559DE541445AC1EAB60FC9D4A66110AE5DED90584F3 +EE278836F121144C3038D3B47D9751E0E2285085544558F53464BD908A71B94B +57A71E94C110C8D8DB565A8C6E527BF7E7030848FD2BA4E6748459CB4ED3D0BB +3017EFB793B2A8627F7AD99A9602161C8FA3B0A8B89334D2082370A87CBBF01C +5F420760AB1F70F2794B3C98CDB70BCD5F437BF4593B1BCCFCEDA9577FB496F3 +7E86D7D3235A4CCB9D4320925AC726AE1A27113235E24FAD6CF43365609990F0 +466CEE79F0C0EDE02D2102CB024C9DD90E9863AC9F2C8A6E1ED0C4A2193103BD +C2426B358A2CD7ADC8C1F875D672E220883FFED285666956EC8CCD2F6D5BBDA9 +4907A3E13EC09DA98DEFA48721B1B1E140ABF1CCECC3D17D364D5CE4021B8D28 +546FAEB139027DEF6E4A11312A6357B25B6601E8F6816C413BB16D9CB7535E89 +3CDCFD4A08C51D5310A114E474CF1C48B06C87FBE85E2186D1B8081A3C9BFA67 +6CE5AB3C5ED7539F05344A2A061F5D409EC6D03E5769BC69C6BA042714A6DA0F +890B03838426C5C69D393469CD8FC4BF4C5D7BAAACF20F905FD7BC3246189A36 +E1EEDEFD3F488362478967755E9C2476A76E8197F91F855586B9D8D8E79FC4F0 +66C4D6E151ACA5B821C74BE4A19E86229BFCB3EEF07A2F6DD59F4CB5511FBA40 +378633B1E5B6040ADCBBBD31C7722A828642A38E80A42A90A1984881D9107671 +91F2A5E50887AA1B0D3E96673A3FB85D73EA75007D7E30D21C54FC8224944F8B +6FF866AC71499C6F5F38A54EA4269AE591E9BE9543FCD72C49BCDE00A2FDDCDF +130133FE649CBA9A607428F71FD761EF81046CCA214F7DDCC1A0BE0EFC7B05BE +85D1DF5606F398DDB0413766DDE50E614EEEE1EF52500129D3C6E25E09B7594D +E5F86EBEDC9A262FBC012BE5E4044B64E8F86327FB10EE5AF01746A46971BF45 +73A7804D9FBFFC791A2B38674EB34688108D1A05C6A58117CF47CE531FB6B84D +7419C0C6A3E29C6BFDD122FB1D4675D2510F27032BCBEC6BA2705EBB37367CDB +40EB8C8ECF19E2B507FA4B64F1C1293578380F289D6F006E78428669BE48730C +9DFEF090304F4EA254E12F422316BCF1D3BE6FC7DCCF5963A646A909380BC6A2 +32B67F5C312FEA9A1AC7281EFCBDB4D7ED9FACD9616DBC2B14D513BBE956F29D +191748D03650D722C48A49F12CA6A7C5E211E526AA7071D951511CDA58BD0CD8 +A6F821F4D20C219BE6DCBEC9C04B61CD7EA0BDC7A528FBAF88A5003DEE761F17 +32A465D05343ECCCDBBD9E410084DE2EA145AE58482B5EDEE78A4BECCA5D50E1 +FE61847CD91FCFA32C5D83F97651FBE30DFD72BD9536641298F062669FDD8FF5 +06F837C2927B3DAAA6EC88DDF23FAC5A77A4D79E4D6501288458897E6682666F +C94EA8ECC173CD268236D759A04337A123A5D499CE0328168B6B13E6470200D0 +725B87023AEEC48256D4ADB2BD7B6C960F2C6BDE3D2DEED6EC5C270CDB33195E +78CD19CCE6A80C7495628B11355F2E560721C29AF77CC7CB9B2B3EE5DBDE2185 +47ABA4CB28E69F351FCADA2765CB7457DA00A683EB485EACB21A3D72CFE027E7 +3FAFDBA8B5A44F46F817690D484E5F57C00B139B5B8195701CEAAD3E0C4E225F +369AFB09115B8CFE8B09A31AA43CDA4F6A70C188183A7695DFC0E6FE024DF9A7 +796933FC2F94A70B64576B8DFF20DB12888E0C0E6C69EC10A3787DEAC56DFD0B +9DE60C1081EC41D49B63C8E93A29657DD944093DC8E43BA31396F7BB08D6A773 +5E6DCF48F5FFB922EF5C084592914AE4D236F9D227CFC55CA687F1FDD8BA31A6 +309110D25EB61F5882A6B3326D3FE04099B986DFD407D75B21DFCEA02551CA95 +2C8A9606039BF8C268CA3F761274457F6E08260529E8EA65B16BC30EFBB1FF0B +181EEED4230A43529E2D95E7ED03CEE2FEE295B1616E6DA77F50EF6190702BA6 +B0DB00F3AB9ECD4561DDFC45B4FCF78F81AA3132C273F4FAB4839DDE5644DA35 +1504DABE027DE826F331F655E28D7EF3BD8848439F4A265D5F78A20B8E626DF7 +684B174333448C107EB6937F8E9730A86EBC26D86415EB8B2EAE82E384882822 +C03090F25DB59F163596547E62A25B4C5A514447522C9A2DBA21023D31EBB946 +51DD3229B562ED5604E4D85D54D17EFB6A03AB5C59AC2E1FF5FD951BA5F85419 +90550337BC83F44C4C503609AAF3EF76845C50744FD18571900164DE71BD06C4 +CA06177A36EEA8C1BCAA73D5468981227964ADA6C27B06519421D000C0E1E11E +B210F818665010B3E8DF82277C8B1E6BA61D51A87B0B1175E75A6A88BA55CED8 +C564F583090C12A3CFE29303CABF1E88819F226D8F29DD2C2D999A35C8121ED5 +15F7AE050E5ADFEB0F8A87065A3FED16AF811F7A74B0A9AD18F2F6F5CEC824CD +FCA9781998B67088F5D6C0203DBD9C43D886844B9C0970DA4BA88799B4ADBE5C +2E2B7D1EFD3FFD0FD130E544083FDE0E3793A354711F1D6CEFD8ED99CD29A5E2 +32F7B1EB4ABDBD7D86FBDD8B9D22C429F1C50277E859039E8E6D6A6F3EED2CF4 +4BD04AB88B70C071175FC6400304EA0BFBD02FEDA05CBFEC31699A0A244986C4 +C688E733DACD7775386DD2CE86716AFB5EC33EF1AB10E63C85B820044A540703 +9FF2DDA0C9B0A4F90970DCDCF75A022AF83013DE7A3D9E544486225AC1601CA5 +21F356B84BD903067AF45598964A0FFB06DE209D6569D00190C0140B3F2B6D54 +C9172B77422B25001D50BDC26DB1705CC2A2C09C582E1945BF8D20208F505FDE +DBAB67848B8F29300EACBE3F393B2648EDE71F5B3ED721F81807B7624A7D3B75 +C458A8211FC0CBB1D2125082EB9E0A37E468F2FFD1866862D3C3A2CC9D8FB07B +0B457AE1A3CC54474A1BCC93CD21BDAC95A36239DE043A431839263509389733 +79249412851DFCFAE1B2163738CA5DC64AE5322FECD2F1FF852554292DFEF94F +BE8ED5A3E72E7F8DBC91EB990D3C055E4C91990D389C511747D8D7F7BC33B34B +F3EB81905DAD0E88A31C0ABB4CAE612F7911E9D338F3F5498AA389C20F30EB11 +6953F4AF288850CB7425349719DEF18A290CF40B27D625207FAD6557F80898C2 +EC247A4FBCD884C459DBA0D3A083EFF8D0A133C0597CE5B2B803933530EE1C10 +A88C85564AD8F7CF7BE09AA5406917E26937AADF884723F1BCC3D5B4171074B0 +B21AE144538B141791B901E3A12E7B4C26CE3ADC9E2A80305F6B983F8B3262B7 +23981BF5DB92443B3CC866C0D17136D3C045036F2C7F39C33536E4A09F76700A +E1CC6880D251EA090FB88F555FCF201D4707CC95169F6AB9878A2D342DE5BB38 +82A2F02186490DC055DF783118EE78C1E02685E4F05A0616CCEC0DFAA9ED09EB +847E2F9911D2F5276538A481A17A8E9B2A25D63242918A78F920660B2D77B7C4 +12DF7F369BC3DB114A7E9CEC7993598FD71CFB92DFFD8359E22AE1B1B124A856 +EC29D9F05A660506D49167544588FA9BD8BF8D23D9CF6559180C532680B1CAF1 +9B776E24F1F8DAC95083EEF00EBBD775619173F7CF4139C45804C23C0C736414 +303C465159DAF5CB5153D9A6638C8E31CDAD0907B6E4BB41555F8E0FB5B799CF +BC46A80CD1D14ADCC7EF0D2E16A955CEAAAA7554C70D27328B4DDE0EB50DD8CF +62E2A4A40740F5A13DFF032AC5FAB6EB0AC3F6AAFC32F0AC635323538E91D8C3 +FE69E72F66ACA72F289FE2A94B699958F5123BB7864AE46E1C2BDEA67946BE1B +2A65EF0D2373B40FBD107E619AE03B2FBC3CD29FF68BD79F86CC6CEF3C354C3B +08825FC1A96E2A993EB37F8B2DF2FBCF2CCCFB032351AEEAF24950E8F428FC67 +A6F668B6F8956411E70AA3224B7E24FC18F0E9251DC4E7FBF2FAF57125576412 +33BF3AC7B1EE19C164525EC17483F68ED41CBC6182D882799DBEBF250E9334B9 +1E201D5D08BAF01FAEA5389AB934479A29BCB99F3CF8D9FB5022454C6A9CBBF2 +05EC3BC73DB4AFC552B8148F42774AF8392C5CE42EEB1780E003F7F5D61265E5 +EB18F7B139EDA4169FD97593C10CCCADE160437ACCD537FAE3BD1C0C10A6663E +ACA01304DB5EDBB612BF5DD24CCF6D1362278B3BFEFEA590B255D2DF95AE4193 +3F33C268C47B75B9D008B9F5E17E7D13EE72C1030A05AF676FE29368D4847055 +B8EB37074295EE705B9EE6229155E578BEB24A8E0106D20F475AC4B6CED93D40 +CFCBD74C0551A1F532F2E19923248030F3FE1A717B9A9AFD494918300A396DE4 +3A2544B6C6A8D8FF2E28B4711AB72D25791B8E8FBC57A698AF3CC9F17B18F07F +A86CF80D0F4ECD065A579743FD7974877360CD910B1E7BD3099B4036D6FD0BC3 +A80C96598B59B8AAE0BE7578B7A68258A1F6EEDB774FBA7FCB4952F90705DD5D +F8A0E1B6FCC7220DBEE1582A9168571A80D95C939DE1A3A404DB4328E107C672 +AE8122A745C918280472EF626D7137AC72E88A296174E5CAC33E59C955A55A2B +49970C8D84558F3CD22F53942959A830FF71FDAB7A73E0F64210CE46818A781B +071FF5CDBE768ECD3D6D1BD52856C236284B4C0CF40E377C694D74D165A61DB3 +192E4D4C197EBEFCBAD48CCAEB50AC8A4D52C2C1E7A4930768FE6AFE6D286F70 +BFAAC5295CA89B6329FAF994B8013868A7E9F5C6D6C71D667950996C2DED0B80 +7F0A8F1A525397D9A41AA2934D3B8C2441C010888154A14499DC6D3A0F0C247F +37D8FB45847AA94F37C8CB299D24F608F01EFF597BC9026724E200BC00629354 +21B2736A497796630DE340AE317E2B04F20482EA0206D01F90A83B7A56E29474 +5F0196DF23D2E8219E681908BD6D2074794C620B2330FD5B0E6AFAB092FAFA45 +BB2ED8599166A24DB77ADC449699547DA0B6683BC153135FFE59D9E650E78518 +CEB174C35115A94B8689B16AEA36D25A49B694D5B72DA72568D8FB2E10878B93 +88D754D6EF8E035ABC26382C2FA13A75040A1B332C050044A81441238859D8A6 +0A33E2DB068D8F32D3047EE64E31A6E79D9BC344A8B498823519372F5D9E3310 +7809F989C979BE5ED9F8E2CA6E0FB8C68B39BF957C8E425860D6B1E75DCA7867 +E044250791F3757D649BA897246E233A8D7B686F137EEA37251001F008DE01DF +BCD2443819603C03EA1301E4D809B32DCD2F525EBB839469D0F764FC978D82ED +AE597DF1EB131486B00F65BCC29396FDB8F75728AB03E71911C74E5DA6DD6E59 +8C4B1F45F77854B200DFDB656898CEDE1B7DB619B9BD75B90C075FF88E1BD95B +5314EF039611A4A793C31FF4F2FDE7FE3F9A51C6DA4080A7BC7DBB1D7723488C +E668E78E025B4D2F82C5E663B02C5024CC35459FFCFA5C5BE9C9BAC09020C603 +AB653316994DE4EBAE83A2BD866D392B6D46D83B9E7E0DC2AB098F7C86431D31 +D07C1F41955C777C635B022CE5F2F503D0D812B3318E9A792E42CE4926661CD2 +950F1A3855D694B2B061ED5CC64E6EAEFA1081A5CC322FFAC259C01D272C8A30 +4416D3B622EAD1D1B2B6BF7EBD395AE45922CF3956D9E9BB557E2783F5C8544D +C3509410DCD994247B50DE3626C33650F9F76334CBDDE3E90E9D9618ED5A78F3 +FF7A6D01071AB4BA91FB47BFCBB3B8E54528E6540D75BD5EB6A4E301C2B49330 +B6866A4BD4AB5CDCD23A8BC873D212C2A6592D62EB573140A6B79EF9ADE701F9 +9D2F8A7205A36AFD20572C1A5C5F55FB8FEE492D999FDE3C641BD8FE201F7975 +2D9EA9C65979BB45D2EB33F5C3A85573834C75DF4556C6254A90C7499F684D22 +7B434CFAAF6C118DAE59E0C79F327F4D8D260D9A633DA0B02079947316C84D88 +05975C05A1734C88FB0A48BB85F87560F1BB214259EE46F5F3406E418B6EE281 +0F93F058DAD0F43B7B0EE4F7C809FFC30366560E98DDC13D82DFD58C0F8BE287 +374BD8655C4691E39F4660F5273E5A545A10BC582D0592CE2DF452D9A8731351 +54B163AF681FB97288647058DF71A290D1EA6DE31E60A4CB7DB4AD2E2928D738 +3FA9E4801278B8D78664E5E3F7691783F71AB1CB2053567466D21CDADAF4F97D +4DCCE8DC1CDE465AF48A37E21DDF443906F91731614029D6F3B8ED69A7F77800 +F3C6ECDF7BDCD03276CC54E1237F47EAC383742E5DCE2346A715A8CA9A5BC487 +0A996E7EF0F44F349B581C7E537A3968492B28CBDBEA4CAE3E6E34550AB706BC +220354C6CC45F3EC16CC1ACDEB8FBB25873CB5DEAF3072312669518AC3BCF57C +500269761D11BAA25B73C1B4B0F44B1F085BDBC1F849225A14C30A9FD245E72F +DDE99E0E31B57C3C9F3170D0CD7C5FD0CEB32A379F0AA9F32CA92BAFA82273BD +FC8FAFDC0CBA3EB8A074F78A505A52619D5546E5FFD31640D1E14810172184B2 +2D278B5BE71360A739C949C3D4C46DB023040A993519A8F24335BA854460F51E +777771BB912A3900BBAA2258D178BB9552FE18E4AE9A453D89A4133B5EAB1061 +6182B3C80A4CA11A7B706E44DE5DEABE7D80DEDBEDDCB304C548BFCB1A0C17F8 +06899F6C5ABC9DE62210C390C33FE92665477562A97AA07D16173CFFEC45736D +C6451F1C6B64AEC235A0139CC8A4DC96847470CDF08CE08D0A58583884C7A35D +DBADB9DB07C17BE52B1259DF1841CAC042F9FACCD3590104B619151B34EE822F +B4B753A6A8198B0A2D6EE580F8C4A21FDF415FEADBE7AAE5C59508523E9BAB02 +3F49DB2E19E7DCD504944FB0FE660626A1CE5554728C1ECD6B2AEA7FE6C512DB +E056AF6C1226A25547A8CEDE7C961B158365C99E574A0D6B81B2356364A61664 +B92D006607E6167A4002BBDF9951E8251142C4DFE4924E227CDCA028F6A42C33 +4011F0CC83B59E5852CEEDC6CAF1A94ABFF15122A698E5FB6247DA6AC6A8EC32 +000557DEC06FE0135DBC6B56CDCE6EA59764AF9E7E5AB79CC1D71ABAB2BF1916 +843AE75A64C177ECF1BFD83F713CFFB6278918624FAA4BF2B5FCA38C634E550F +FA25E51768F931AB7D2C2E3000FCBBB1B1E22E7381A53C358AB4AD42EE7BC991 +913C633CA0EF25B9230CA9681B91D22880BCF44D4FEBF6F132FE120EBF104761 +6FDAFE8F33FCD2248B12B8BE283B37089B0383745324EE468DFBB3926A30F4F7 +6AC4B9EAF19D663BF1DE3B085ED88D9CFBFB36C2C53F12BB1FC55E3234A68C3E +D6EBA530B8D23B99D098521DD3F1005D4F5E4E333E50C5C9F607D551019B0110 +2B8A931F27824ABF72C26615FB82859E6D527694EB41A17F6B08C9BB329AB6DA +16D9CDBB7F00A0286EE119E7AC89A959EB16D9D06D6149D0C073D771B67E7BB8 +CBC6A3FD291BB1EBDC68428214BB371996544FF8A4F38A672AF2DA2F820437B5 +AEFE65350F6327F1772C9C9632A517A0EF4CB5C7ED1159887BC65C4F1311D1F6 +156964E2AF01F91CB4DF824AB0B3409908611FDD799A12C51B705E6DAD1BA8CA +F0066A66C20A8871EFAFB0BCA7A22DFEDD54654E0BE31767BAF9CF894B00B435 +C9FA8F63F32FC2F23C80640C0CAA01BF46FADBD147DFCB10B988ABA1F2169AE0 +65E5779FD0FABE6A8C60F166CC1C8EE6EB1532A8491FBF84A824125B436E455B +01C64FB89ED5AA77CE3148C135D76837CA45E7EA92EC857AC3A5B723DD7DC830 +CF1458512499217162FAF4EDCA0195A42EE1721482E56028B4895ABFFECE721F +CA5FC8BE5DB4B7C6D026BCAA58AD7B9BEC349E395E16B897AD1404C27F0FDC9B +5F706354C2E2F135E3A20B450D6788FB9AAAFDE95813AA09AFE116EAA7B9C76C +F3D61AEBFEADB20580E3906E72F76CAD27D854381A10F56FDFA77EA5C8B15457 +E6278FA20742413B0BC95C1AF12E948905E2D8501E81BCF4095EDF9B941E1AC5 +E2B9EF45599AD38DCBBFCAD80405659D828DAC269825271518AE3721585DB57C +520FAC927E8440B8306FDF0D2149B2CEAA73839A16681C6DDB6E596446B01BD3 +DF66AF8D7B391472DFE40B13BCD9C03A46B65814E06C2332404C4F1CA8D0EDD7 +37ACE6CD13620B84A3A80A122620E57E9BD33FAC8F2D9569A5AD18246A720B0E +4EAEB68D73EEE587ABDF93F8684157595D5299CDCA11A72203B664C505EC8B17 +49D76E555CE3DC2DAD377D04A854B7A6066E5824CABD48C2F5585C4187AA81C5 +BA883542E97C87339B34823A5E32C83E1344D6D59AB2C64C6AFCFEC6767946FE +001B6501171FB0AFD07D20840447E9F692A88C8162DD8E753D1D984B1893C019 +691930563E2935E4AB3DFD1437F4A2741636B5CC2AAAC5AE74E5181D28F643F6 +9DD08F5A28921CB8384E43532B16A9AA64A4537FFD1ABAB417CCEF27F373B58B +2D0C78D40078B03AC3DCEB3922CBA12BC4CCCB6F3972AF9C16522E6B05D68B3F +FFCADA33B2A7CF4445D6DC0E94BB089CBEC2A1603BC6F704C9107ACF0FFE1C07 +319DB0DABB3F3317E0CA977E70FE310BBBCA339ADE39E17A0E0644A9155ACFF1 +4E1C8FB9EE6E917E0830CD37498E3DFF20604766D25925576B599ED7997F272D +11F53CE4000FFB0E89506A2E7B3CD818309F586966AB21C6226E70297FD093A2 +0A0DE3BEA5A2841C59DD1A48555235CA8B2654413E13EFCEC9C3D1ADB555EB22 +BD634C01514D76EEC3181A14C5264F5DD143A21D3626CB611F9F90D7BC05AEEE +9F947743CA9429F2BBF30176821365D15C419B27A085DB7CE7BDD6F28ED3BD68 +6E91938951303521F260F7C1636A39726E03C0DF3A08942DEB17280EAF7AA849 +66F95D56116501CDA299E005A7D303BA09E9033CF45C0469593C7AFA2A5C9F03 +28D64726083EBFCF05DDE3564BB12AC5C90FB0786153D10DDDBBD41269FF9537 +836DF30F71A587A3935D91E24EB56403A2A4F5C6E995A89AAB2A42EDF8586C81 +52BD65DD33C8B10AB18FA9F93895FAA1639A62D553FDE5F976CBDB5059F099E5 +91BB6C1489F9C66E2FB7ABCC579FEF05E75083FB02D8CD2E4C37D438CB64B920 +81DD594F55047309C66258BEB1108B4A52A4AC52384E2861DAFD6DC2B0A88F6F +0DAEE75B35222DEDCE1490BC77F808D56985E390AC2EADE948B377E051B2CCB4 +2CE6D1A8B6C56DFDE8874773C8D9E8EB0BC66E3272E7970621DD41103CC78165 +CE745AE462BE3CE12765A2353D89AD2B2C74658C5BF922A3A2E4E5FA79111525 +01A082205FC54279ED5F656FD80EA1E3A988E7EC83CE2439D8E9D4EA2EC6A11F +DA81B6B259503BB7F66C3373A40AC6474A85B71B79A66BFA105EE8B90B1C204B +5DC2D4EB387D4A1D36AF0AB4C2B20D6B06206DE70805ABDDCD7F1A9A6C3AA5EF +1E59AD9703BF74A032B5F458A4B19E296D4770D7315F05877D1D9346DAA742BE +C941D937156610F1075661F679BD680000E6F210DCBC2508D4EA5484625CFE83 +774073B2BCA4BCB71E64B3755E69BC6E39BF59341D3FC71BF0A97D3F139A9765 +CEB0FA137A1AA226BF329CBF14B1C509EF36D417D4993DF331BCB79F29267291 +D9523735BCFB3837839F26108BF833B1E3E4AF576A2045289860E7ADB936DDCF +818CB035558E4C444D06C74D5865768C9CB901EFE53A92CD2EBAEC0A8EB15EE7 +867940DE7D7B61216B67FAEE1A72C06A916F3F2F7D766FB3ED6BB50A02550B25 +9EC6E7B65CFA667A505F200DF4CF743F37B0E876A0A5A6742A0329C9D22FFD1A +0FE985931AD6A124A25A4340D2848230E73BC52FF698B5DD9A3DCC6B530047EF +79BBDCA20FE02236C25BAA421995E202E09C41E24EB424EA401679B15988F8BC +E1DE0C0838B32F0AD240F9C217F7E94118917A7BFCE878C423C0537CBA1C62BB +3D7DE687FE49193FD2E8737DC18990772E1CEAF4FC5BEC50BD603CEA326E948A +3ECAFCCF56346F9DCDA5C70AD7F1ABF751AE962CEE507A5489D4E86B512B53B8 +40AEB1AA263944CFF84D5D80CCB63AFFEF8026FD69BE94BEF7D15E07062B9F5B +43D7420588F26015FD5E4357473C1853C4D600579BFAC96BA963DDA2AF04FED1 +2244E91B8A097AE961F45685B9159C8A1B14D25672740B5313F18CC262992CDF +4E50C76B74C198955DB662569CC9C18432B448CAC4F8C64A3A80E7336EB29BF0 +9BD4BDBBBF1C05868296DEE024548D3E52DBF0A00897CC9E7A0AD30AA683A898 +6DA657559DE0EDCDC82986200485435CBED48A4A5B9B4416941A737DA4A43865 +50900743A13040965178B71853D2194E73C6BFE4FECBC76030FF25448D623DC2 +802B1CDFF958690833A7AB636B30475C54F34944976233E0AC952CE4593E63A9 +A5CA3A8AC18E53B37F8E60A3B8ED4FDEE0FE5A69F280CBD531DB0A9E36A1D80B +19AA485604F64F7A2F3D0005A55927A7C4393190A09A3F386170325D427D01B0 +BBF1D02BED32E5E929C9EA7B8273C34BC5FA1CC076A0A4D42ADE112A24EB4CF7 +39F7CDD3F0337C0A70EF6858DA5D76694B7870C2FF84BB2D4E8D4CCEFBDD8BFF +E650DB24EDC4FF041C21769FA7C15374F938467B46E518F2206FE3C70851C667 +D4F35857B33462A603AF8AE50E78AA616D699781FDE049CFF60AB24DC796551C +D3E4B4BB39726EC682E8FEC0030905B89F2C2853D41D5D039AC6F68AA52D4C26 +217586E7CD877C011D0A0672F392400066FAEC7CE19760EA67D657FE5336680F +6ADCE6A294F81DF1BF69AD6E55D7CFB4262C2EEC8D1348F3F707E2CA6D041AD4 +4D1F888FF99691546C3EB5E79C3B9EB73F50895B8163F80CB8BACFFA86E01CA0 +5953CAF2C7C9EC7BBC065081128CCAD4836699D30AFF499D8E00369CD6A0C4F7 +0ECD965091FDA3C2ECA853E805C5A55E36BCFCBB5EE8949C38A2D42C685E370D +A1A9172A76874D53AA6C52D2926F5E5797B6A73B75F0F5FBC3E8D10EA913368D +6B6ACB2DE7F528795911678498ED557F7FB6383B657D17C85B31BC06F1C0E908 +C212B0D11EEB8C2E61A929FCDC9C5F4F9EA9A1730E9A81EE313F103CF736254B +B67AC0595FC838689E33D2F1922416B1E24892160CA8F04B502244014EC5BE45 +1D288C43D0D00FCD418FABDC7FE016A4E3586C14D22E1BEB4691D13E58C9E66F +435A85CAE6173F3591B0FE2E727DFC579B16B2A95933E7854EAD8F8946A6E527 +E1119B0F029A1C4209F00F09E03769F00C7F13CD11B91CB07FC41BB31E6F1E12 +7917DC9E91E790B644581AB087D78DA43A621BB0C80DA75A08E09D7A6DD98AB5 +2AE5C74394B0C42BD7E7D222D3554215C6F1C04BE694B2A841BD9F606A01ED52 +B6DD7B7283C7971ABB732BF93CD11CD2C407B7F68DAB86E7DD380F8684F3F768 +692756D6879D8867870F39BC955CE0213E400EA1F40F76E46AED18C6814854E3 +AA2700D296CCBAFA4EF58C3E1163D88198845582F52DDB0641AC31FB36A130F7 +FE16F12FCB3D09E386A5DF2073C56F01A7A89346EC1DAD1038BBE20138492861 +0091D8A9F091616CCA67051700B90746423C002FDEEC4D86CB9DE72FF87FFA15 +B6E9A9B58A7CB8D98E3DAC7A522DFB45906ED1C58392C9CB204ECC263F098864 +2AD1E02CBCC95A104FC6DB30DC6A603DFFF7694181B4E64D06BFB3E19086B55F +C653925A2678E6957CBE6F68F1DD12AFD9795072B122D72B23F0E0916D7FD554 +6DBA60BF6FB8D1A99822099BD96957381A7001EE267E773F3D9AC79460C5C092 +3A2EC8EABEBF5492AC3BA22D0D1DD5F6725D71B5B363D13F99BD08A114950A16 +C6C9B99FE48D05065AE2111B16DEAE00B1910B7CD0FACB1DDADF1E7BC57169B4 +4215A14F63A223979B6068967C045C7443BD920E8F406BEEA35897C3C9AEC183 +4FEECA6DAA76AF17EE3FFF748A2BA63DF94BCD21DFF30218DFE6B04853CA2D6A +CC230131DB265BE32EE6D21102935D70FD223C79F7FD0926D68BE38481639849 +82FDFBA040734A19311350D7A74A895D8D45E177BEB8FE2A22B11FF69A9A8C95 +DE72184CA297379E7621F642815ED6C54100FC1613A18FA632739A5B2AD60D8F +7B2B756528F96C86ACE4EF1BD851F72426EFBF5B70306A4BE758A15D0E367E9C +BA0D5A378DE7EABADA5D75D687049FD5AC0033AC1F2336E5C716BEC683EFBBE3 +36ABF0B965B2317C681F0B7F4F6D8B7093855FFFD725EF4C2312DBAC2F715CCE +0FD786A46D06820DC3FE7EF87C59D7D84D11E877808F590C5754F94C6BF2A306 +405D3EA8A1064CEBA85FFD472B72F64AEA7B81147ABF52C05D17D13AE4D32C04 +C20170DB4125F85FCE3665ECF7458169A62DA7A928AC3E58A5E9F69D2E051086 +FB380BF8E39D48D653D75C5C83B924449ADD13CA3493A7590E27B3D98D24E320 +2F9700C26E797D1F78EA39169074E365E62B9B6D730DE95DB3007AFC44086E50 +60C18957CCAF3389A18060FADA8D5C329CDB6EA2DF5C5882840A1147115ACDE9 +4357A24F095E2EAAF0D7201555687B56AD5224859203C059C63194C092DBE505 +6B118FFCB885E58F8D40988D2E14A73AA40303D6A935A97DB6A8E7D5889EB21B +3A01063599DA829927380AD6134EF4661418DA85AC42AF2C455ABEC0413B3D9D +684E852E69B743B1324F7671B8D75D815C2F1C425327B4410E013BEAD314DAA5 +FE193719A5BFEF3E5FAA0C5E4CA2B1EFF6CF921B56017526CC62293036F76E51 +1A999063CB2F93517614C0937BA9708728BE1C381CA8D0768EF314427A0DB447 +BE59B9A034A8296AE3F848C75784517C47D019141FABF56F2B110C6A768BF493 +BD5C38879397A86AFA7905804E2EB3AE253038E267098F3B7674C3510985FB41 +09A5E02E5F4F7CDAF6E12CB47346647A58CB05D9AFABFD5A9A538F947E205FE3 +C6480C7A1A940C21CEF21CF1EF48F15FEA6C0734A5B8FC23CB315BE3B420E65F +AA895CF17377F0CBC197191B3CB8336A2588E8C26BC988BC6E51C67E21B64972 +7FA5F4F1E95CB29E217A4FC4998A54B480B7861400CEF84E18095C55702C8F78 +F3B8CAE65BD5F4DE369C583EAC060E69EA40F595213F8ACFBD6B55AD0F5CBCC6 +11707FEECC47B1E28C9A8CCE499E248A2B108FB29C309558F8B12EC74AD295B5 +B5E8072C15AB09FFA698D0265B38F88D0D4724528F79A97776B8BE04C29E1D16 +703A23EF60B67A3ED14EF29179FF9F719A9F274E0F73EA8CA198F7053B6E8C5E +A912738F68128EA32E2764DE57C99080482C11FCA714412D3B6AFAE4A2C9F044 +721C372CF6D8861182DDBD2BFF1B2FCF894F0C0799DFCDE0D8083E16A855E2FA +D5E660989B98A7A9F3057AC99B76854DA2E75E510AB2E53C6789750149DD1438 +367D28A8FEFDE2042BFE791D28ABB435C807E7B7AAAE140EB065646207FC75D4 +559CD14A44E0DF2EBEA232A4057C72C65A595905A56F2C2C0FFE326EF9B3CA7C +C2CC7F3A8BC588AFEA2624616ADE803C1D0067463F4DD78C97D2616E14562D70 +AD7BB516183630C1182BD2813D8E282B26B18F4C1ED4FFBC86A090A036E54877 +7DBDF63E27E7446304BDDA5D5E5C2DB68374E76D698CBD3657AE037324A75E16 +B1E656932F8C7253C8F1EDC06642D8F74612498F9ECB96A9375152046C2169DF +9B3D0654663948351E48C0EC24E9D691748DBCF758D60EA3643623C7ECE568C5 +5168171E8D2ED9BA5049018DB73E2EA3F9E60683856D3CDC4F0C930BB1B126E8 +AC776C33525BBC280FD87904D5DFEA512A3B073CBA5AC823B3B2FF68D289C558 +58553E0EF0617B4156665007C8895492F2C19AB138EEF10A977C9A61AA554866 +32F446EF885346CA0372C001223769F7C01CB76977EE84E76C178FB444E33804 +B4E72782ADE86D811BD395A15C329E11973B021C8882969DDD5F9E4B3FAB0D2D +60CB9370DC3000772E3263E693A4699F2EE60E4C022090F4273F6134729987CC +ECA36D229EAD946149831037B9701B0C50FE9B4304CFB73ADF8C829D36F285F6 +FF9C056045A0369FF759FFC5994DC0B40B87E547CC46274BC40823C22D90B9E9 +D01F41FC59B7BCF259C4C2E301C5F7EC3163DB07FAAFCE8F0CC08CFA7A07107A +483779E4DD39EA89B3B9CEA198765C6A52BD80C624C3CCEF16A6CF3E21FA1BB5 +BA78FB5AA13759CE5D822DA725A07CEE1D39E63D4D86FFB30FA1D070B27D34B2 +80B335AD7C86688BAF25B2FD2910A2EAA186C500120AC2898F66AED320EC43C2 +1C9D8BE8888AB84F09D16B61167FC6E42DBBA1D3DAB971576160E8B85FF5DAAE +F37D9872B22CD19A436BEC7E7C27DB2D7F7BDF4266E515516C0A2F8A899BB1B2 +D7D5811CE7ABB71AE427FB019D07E0BDD635D3527D677620275525781A1A9F8D +B339C3E4D5817FEDF135EB150144EC6FDA234066FB0082C52C1A851CAA19AE8F +A1960216743A9EF3B6CD2CA93FAA3FFFDA3D144DE465DD11AAFECDBC9A694A76 +93EE2F2B10E37D26F2CCE520D0A358E13A541CA963B239C132D1680D147AD8F3 +0E162C56D0F4D423890E36A2FCE66C11AD14B2FD4F7B84B2197AC12B49DEE166 +6C157079FB2B538817C030506C318698C10A5C4FF2731E31ECFCE48282398A79 +0B3730964A1D7DDFD6964E62293E2E6D35E8F9C9C675D95F375F4714CDF5FD59 +5A506FF7FCB08A9F5B9F3989C847C92AC53DBEAE739E2596377DC1DA1949E7BC +62573D838E4BE9D025946E1C7F6DF511965BE847FE138E87A646FC1E1F43E822 +EE272145B75265C69C1C9D8DE3AA9F9E3DAB873A8146D7606B2DB7AD9D815D68 +50ADFB48776F11F97631AE5C59B4AF8CDF8011CC76D8058AC70C6826AE88D109 +F50B6FBA868F63EF089F428873E6E24DF8DDC504CF34862BC1E53055B3DE8012 +9F86F50B0ACD428124A97867C3B51C83929EF73E78B78F8D09A83BBE59591A78 +3182284C7035875981A4B68097D9DAB5A1901A4E398B219089554DDEE17CCB46 +94FDF29575367973279C4676D9864B0ADFCC0B2A27405B5144865352209FE496 +020017FD425F2A84A5EA6D006A4B0D1782C7C9443BA8671CCA3B30F3E7C0CD48 +5806DB28764F94AC413A5BD9DECA1B119900A82D3009499998C925377D637052 +57687CE3EF5B5EB49D49BE3AFBD8A4531606AE86CEF07E058CFDC4FD1764C9FF +1DEC0ADC674C30DA9C9A24A4267A7D694626E9E9C9AEAF66D0381854AA05BD14 +177AC9CF2A0C0677F0B8F496F325D78AA336B04CEF7E6ADE30569A4DA09B2847 +F754A24E3309472B0B50CB43181E56D7AF316A5E9044DA230403CA6E013C0D85 +2CE3D19C611DD70D79EEF35ACEAF797AA94A6B4C52E27E140C43BCA68723F2B6 +DEAFC3117D4652F9ECE33C4C51F564C464428ED27B302750C0309EEE5FE0483B +182F1D43D8F7B460BAC7C0D0250042013EC0C3AEB5C4FD9F882F9A3557C15DBF +324BDDFAB515E1B069F210F96F6648A8F96F9E61A36B2F7E2E06CF67912A1869 +FD85F47B84AD9E879BC4E3C48B39138406C6A2549AEA55F7A9D79D9638F97151 +4B0C7A41AF770C575CB1327FA3BDF66D83600F1271B04D484BC4285CBD5ADF0D +DAB6774C8F0D60DB4C25081F2B278D2C11B21501A840E68E2DA02179FCF9E2A7 +F993DA9620880EE6960274954DAC790372C9D831C4604A07EBAB27C6EF5EE84A +0C99613EC5021DF782CE12D96EC117B8997E1BF9E783A5737BEB7306FC4D9F08 +CB92A999C8B13CD6A2695190132BD04B94222C7B60597CBC1750F4B189B9F38D +04AE51084F7DC95A39B008CBACA295AF18F7C1FD5174F5EC78D11E1154A900C0 +EED0392B0AB46BB3993EE89F05AF25041D71C0BB35B2FF71DE9D842B9FC98CB3 +1375B5F2853D18C64DB633675D37E0550BC73A47D8A35AAE5593FC1297B21F68 +52B6FC4BFC2A4C58A8B0DBE73587DDA9E35A1E20AEA29E3E1D46EC0B6660522F +57236E7EDC9C1F91ED36871B6802686092E5E4F98A66379DC2ADA482DB15F522 +1272B394721A7ADC446E9A5F98D401BE1DC712F010DC17845DF75737D6C4794D +51806744F84A4D7B30B198AE46C46D3DD71EED74A96CE8791AF292F45104A055 +B651BE40EA7FB93F54A8089FD5B624DD3B7F29663229A8ACC91BB7D07F71B017 +3530EA873B77C0298087D3AE901BD59A71EFF85A8E490FF120C6DBAED5B67F21 +B8957374F7FF0C14BE5459A40CCFA987ADDB03D8F4E507554FE3ADD1301F2DA8 +BB218724D4F966CEEC21A1E28C39F3901605BCAD62E311A4AA9C295A69D51D0A +8801A26ADE83DBBDE01D65FE1F1C26255325238C119C6D6190B5979FD7337F12 +57E2695B74CBFC9291D7DDDFEF77879C8331BD21164D5773691931C4BC15620F +CC55C7E3B130091D42F619069B056167074173B8C19575274CDB7D2D8C1CD4A1 +2CF2DD3D8B0072DE563541219857CD8D94068C375F33CB5B028FA233064E0DA7 +4DEFF8E9789A8EC86AB9E57B3CFCFCA9DAE4E27C3DD1EE9009215B726FAEF03F +21CD4A7B32DC8889A8E68A0D509EA68101BD2077E3AAD72C003C66C80D566E7E +2C1A022970C6CEE4185BF6299B9025162CFBD33E4DF7246382BA2449EA5A2A08 +DD4F10D8A8617F4033ECDD7FBF55E537B099BFDB6E6884D0835E9F58857EC91C +432930F1307C5D7EB390D8652C4D981C496F1BC4D898BB66B9CF804F7BDC41B7 +4FEB527554D00EE0EF56862355CFE59A17596CE9FD737932496C67A339034286 +62D3FB833BFA261B632902AE3AD8D199DE5CAE4627EEED4CAF7C60FD50AE68E1 +0F85D679C10C52AB4F3B8848B5886D02EEE1ADA9E292F2E2EF40EA1DFE567733 +37FA902654A3770E2F108CCC08E32E3985AAFAB55B83D5BBCDBBE61DF5E378E8 +F64BA772901333C57B6DB0EA3418A923EA2D13ED7EC9550C71B2444EEDB0BE0F +0CB182CA3D2EAB214840FBD18A3DE5DCA551B6D4E7BD9F8B3B2C7BF11F870B7E +B8C594704BEC50165234B6D41161AF9B8570F4BA6EAE2C48652523E275738F8B +89C66E1739C05471C19ED3B2D16434F22C25677356EF8D0B01A6A9F427598523 +4FEC98CB244F58953AD560113C038000F8F7650C0D56A0BB12E391762B3B4004 +E2516B29F80D719E8E85014C23E59B9CBB3A966B5E83B8B51FC02F32535D03DA +EA4F801077C94CDD2F98D1E25547659B0F528971DCEE22A88D9A1F1E0F219771 +86E161A0608C3511EB0D969E8C956E8A55B1FB3E9278845E8BA26F6B6381CF74 +9CEF69192CB36B4502553A99D047EF5251194D7E269752CCD9778123295CCE8A +CBC1B4DC2938D076967A07155138B3E91A4AA888A09095C3D2F442F98529EA24 +7C717439B62F7F1C5D140D9CAAA94B22A8D1355E7D3D85561D26A71C826CE30F +D7157F63100097F04F39C6FAD40ABA2F9DA78CA6E2A7324FAFEFA1112BEA7856 +F8BC9E21D32F9EB9BB4DB631DA30EFFB05CE5BF7948980CE6E29A379E6420D9E +B2E6A8F19EC8DE7371FFE985D0CA83E6B0C25465F11C299388865CE474EFC22C +73ECFE21098FAB65C332BDE3CD631CB5CEF22279C8CE8AD38D97EEE9E4DCC1EB +4E15F2B38341DE20E81E8DFD504A1CB456211F8C21E806FD62807D0A4C231FE0 +09052F95B3397FE4B1947A90C596E58E0D74441D1584C9DCD1BA47737553F54C +A119099D8EB107A9185234A613D6B5279F9DB5C5FE4377B92DE77F8D0DA00A4A +F438F080347C01D9C1DF7BD28FC1C30B1A9B337B0F77E968C6E9B9A7CC5049F5 +56862250770FCB1F086491ABE56ACA8EE9C14DA082C0D43230D383D41256788F +AB2EE3CA273B90F822BA0D7F1A3B2D50C6381632FF34AFB322A6308CCC5EF3CE +BC847CF050AFF76CA1C9B049C334AFFBFBBAD19A101FC4361E51455283CB9DDA +2145417EADFE932B34C9800758D651CCF90BFD324D12FC8616B423B08BC449FD +03D6469522B23A7E094AE8EDC2719034941091AF269725CA0E510806CEA18BE4 +F980B58EB05E9021B10643E7CEB0CE2A42B976324DE1CF105F1CBA07DF358D34 +B4366DA6DD135F36F32387026C45C4A94017312FDA49C4E6E0F5AF2F0A9126A8 +07602AA9C8576262931EEE464E0A2787011D33F9E7C6C9D7DC0C0C5D20B8A746 +4D139F5F2B1B6E0AE059747949EDB3FDE1FE2162086C4F01720AD408DECAA906 +7586D3E2DC51D8A63EF20E21F0A5725DC80D02453DFE9F75E6EF660D9A892F95 +411B7558D3676610042CEF99261185A8D7F69F15E2405D2E5C0E452E223D0924 +F20DB835C62466FBC0A8038F3F110036104E9DC649A5BACBD568B0B85A7B64CE +7EEC067FCC7F7E6A51FDE5272FA30847E70D319F9D593CC2EE45C83E67FA6F5B +C7412096BBDFE81666CA8B3EE1411DD487B4CC3C3EAD104A2C9BBDCAF9D0C847 +6D2C7DF762BC3BC874B4DD3BF2BD7D0F6227FC8AFE4D568D70BD9928051EC85D +62D8B2FF07AD099B8F879677BFD4B90A08C585D71F2820551C2558CD14DF1555 +66416E2B9C87BB7B1A0C9D6E3D4F80C5F3F4F887B17A957025BCF65372D9D3A1 +77E2CA348A47DA5100CC3EA2EB7742654B955FB2BD3B5A6F84D2D5F5F0339D84 +D8AD3DA2A75FFB2328DDC5004778BFDB4B0C9916D306BDF393ABD5FDB45187ED +95F01EB80FAF51B7B38FB22517655D532DF3C6A8BFFD339AB7E21C009D467AA8 +78AA46B04DCE4F5C17A5E1E1081E33CD14E2E7BDFD41DEE2CA9C042CB66C70C9 +9A07B488A14488AABEE67E51A4DF481CB30774279F049C9D56D80AA2B4EFBA6E +94A881775CB7B1373B81A69B301711AE47ED07264BC98A84819746C192BA6F9D +693A825F0210125BC4372391890975B78626DADE396B2470522A8AB9DC4837BF +1467A13F281F125F0FA2E87C8A67946EBBFDB7ABDDC2F9AC10DC820DDA8208C0 +55252FE5C829AB859A983FF7545B6A6892CF73A5C9AC8D2D4B1D9D01A481FE21 +51BFDC258D0B8BF0743EE4A7DE9AF2630A9740FCC2838BC84CEE12404701C36E +A9BFAC54A7AF6211B17F0AEFDA006CA74105BCA14A882463F233E831D8477CC5 +0E42E19D5E21A3D922F645EED56DC7BB7F371785B8565389D39EFCC4850550BE +10CE6C78EEEBF8828F83F9E858FBF0640F27E925AE3C2539D609DDDB0964A513 +88238CD14F7B91CD651054CA37BD71F9E64DF562C5E2613CA29318D3B39035E3 +B538A5871E119CB3558E0D301B091568C807D63AAB36336AD239FF58C1131D5E +FAA0F85AC68D33C154F97E42E73EB71437B0F2727BF9FDCAC75965C62B15564E +9BF7154DE438CC9B04D343FBCE0FF6DDAB9E46A260C7BF76679B8483BBFA4DCF +D652C0FC93610A6A4ADF53C3D9B7296E70CE1FA3EB6DA1B46749FDC0E2BFAC85 +F00FE4A1A164CCEBBC6CFAD03E3D2C987EC80ABA6D1DCA6B85689F4C6ECCAA29 +CA2852B2325AA1D5A895B2D8C582060673605C54ADA2F41A20B2E98CB38785A5 +3183C9562EE46D58E515DAB27B9A5A86917B05554FF899BA50E1D97EFD9E7EBA +03C6AF103CE3570E592DEC96A8C634AD7067ED147E3399F0933F8E245B269AEB +362DCFE8FA9B42ED031F5DE999962C9F53594A437AB2E629338F662ABDEBA947 +7AB265D05AE53AC692ACC2B30973ADC366921B48F8D53F668E08BF65A3031C10 +F4DF18B1D5536A7794576A2A836503B6F62CD601B1F7151B90E915A927287D99 +9941949683B99325AFD768D0BE6C27B14A073A4DEC837CF91D61A3392B13C2BA +323FBE1B93090BC4603E35B5C1774BD7FC3F2B843A8F59B51B0E4DAE91C5DCD1 +8553B77BF8A5D3156C2B92F9E14B53344C72B1C9AE82F86352D70A7802B2A948 +3B7A89D4C4F402657B46C474E6AC77D75505B9EA6AFCC1359BDAF1D82BD67C43 +B61FB8430B9C0D6F8B5B7EC8FF87AB6A824FB39848140C8F35ECA135A9E25913 +1D8ECDB09AB9C418F0EDB189CF314BC15031EEAEDD76C062245700583CB82ACF +8F5A6E8AFAFCA8AC150C0CB7A96AC61B1DE23498278F37BF6383608BFBEB4E92 +F74BFD5B630B601ACCDFB1795DF67DB3B87A79DB4BD17364EE8C6B74A04E0C4F +B11DCDABC0169779ED890C0543452380AEFC40581A93424D9B626315CDAEA786 +39874F4A6468BACFEB626B63CDEE84F4F51E26E52D1487890601D4116FA68600 +8CA491E20ABF21D1B1A02CDB96A25ED403ABCAA32944AF30648D7C4A7A208968 +E2F6AFD610B8C8F7F3306B1BF263C2A47299F436D1C741B24DAE39174F30F88C +7DE095E133643F0BC96D84413D373AFFC457DD7751C2B4AE16625D57D7F0385D +0C5723E54D10C7AF66648D7DA4942CBFD4EFD530B8EAA843692ACE50B13389FB +67924D2037EB81EA52D37976C2984BFBB05438DC8050BEE88125A7119C68118F +39313CB6E36B04AF224354D6A3E08A2A45DC030B6DEEC6758CA726473D766D1E +C6661DCE8FA0086D4FE42237C70771109FCB99B2C3BCEA066541D4B2A5CD1BAA +C01A5E22A7885A2A4298EADA5D1735A00A851BC1640E62EA5C30D9B3085B7877 +3F2174394A5A8A75BEB15805CAF2CB0E6E5A7A3CF05575ACBB7A897E7E1239BC +D4D3615DC0E77DEF51F7DD2B803AA1A321FB51E2AF854D672E1C14736869F49A +E5ACDC57E3B3976537B8FCAE4748984E668FDC1DE630EDF826F57CBA3F2A030C +155D3A2FAF649220AE2B1D1960B6B0483A37D24B32D263FEAB89E7D6C916BB37 +437245D788031CC042CFF7D712220112EC16A61F7ADCDDB09AA365980D0A687E +01C6DA9D234326EE9B8755F7B8ED79E6B4E5ECA508CA102D27A3A226D02F4370 +7EE4061C0B8D75EC0D3FD681AC5FA83664B3D0CD55C3A95B5813FEAD19642EF1 +748D06ABB5AF95D258A8B433C4D8215625E8AF1F47924BB1F0530EFE633A333B +9227C1ABAD32ADDB6910993C4A2176E1DF3D738B4E9E899DF859DF3F42EA4508 +B9A3312BEE27B4570260FC6261C8F03D72C056E7D824F143302157C869316E7A +5B3BAA828F6C1FFF5EEFCE3A79F41F97C2EC11E6F8121282D823A3746E1D9C13 +39B02BE7059BABAE7E2274DE13F9C1158E821637CC124600B89390A15ECAB890 +AE0F2EFE53E7755FCC955879A1EB9E73E61D4572E292E72FED83B94715A3D4DD +B682A712D578B9D2E6A34DC10506DBC9479EC3C2ED12B2C310AA9C34466D979D +15275746E0FF396053909C6A73777380826D98B61D166E0085F2FA98A3267634 +3B806CA0A9ECDF557406239E72A470D51985D7F24A4CACFC71131694C40573DF +70AA1BC7C29A94272FC53C0AC0BDAABCD7FE594B4BE530B432F3C089B52EA8F8 +7280F52EA3FCA6848DA826324A497C393772F156C709FA1C0976F7F8EE15EB46 +82F0C0E2BF11650E9A8D241255A5A999F1AA83270B655E354D177AAA05284912 +469113159F4E8134E48C194C158A012480869DA113 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTT9 +%!PS-AdobeFont-1.0: CMTT9 003.002 +%%Title: CMTT9 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTT9. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup +/UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTT9 def +/FontBBox {-6 -233 542 698 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT9.) readonly def +/FullName (CMTT9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 36 /dollar put +dup 37 /percent put +dup 38 /ampersand put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 43 /plus put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 54 /six put +dup 58 /colon put +dup 59 /semicolon put +dup 60 /less put +dup 61 /equal put +dup 62 /greater put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 76 /L put +dup 78 /N put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 89 /Y put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 95 /underscore put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /braceleft put +dup 124 /bar put +dup 125 /braceright put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0 +42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259 +4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457 +689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521 +0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA +610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8 +3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735 +C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933 +995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE +EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723 +2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0 +4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC +B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014 +D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE +510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5 +BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF +93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC +F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385 +45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757 +4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47 +088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8 +9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A +09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988 +E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C +0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A +FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C +94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741 +03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF +409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71 +45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95 +39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971 +58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85 +84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A +0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F +F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD +B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD +D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B +3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B +7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D +8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737 +712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E +C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3 +E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA +A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC +2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467 +757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C +54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981 +DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9 +08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD +6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2 +A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5 +336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D +E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB +3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A +E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627 +1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903 +FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72 +A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6 +465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0 +3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32 +CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF +573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA +9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D +15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D +D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5 +15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1 +64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789 +D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C +D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8 +576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540 +ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135 +EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC +9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099 +3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A +1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD +FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598 +C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA +4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0 +CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7 +3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D +D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9 +BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6 +1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D +4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442 +C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D +80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C +AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6 +59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647 +3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6 +14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59 +B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34 +F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8 +54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588 +34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191 +825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439 +BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54 +4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F +66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E +2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF +F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A +1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416 +37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6 +741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1 +39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC +887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49 +B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD +15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526 +5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1 +80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839 +A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404 +BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048 +2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B +B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598 +F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B +9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483 +CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91 +DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62 +6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B +7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7 +D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B +9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9 +EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12 +0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2 +1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10 +85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0 +EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F +D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518 +E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0 +88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842 +E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8 +01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68 +54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A +97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78 +B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2 +D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9 +18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE +A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13 +1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62 +31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5 +408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF +1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E +29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33 +BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B +AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8 +0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D +99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE +480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC +D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481 +FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB +587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51 +A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C +C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C +AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D +AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4 +48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367 +385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56 +8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38 +4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C +839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C +320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63 +7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E +DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D +DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F +461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A +BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449 +1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A +3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500 +0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77 +EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA +AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8 +F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4 +097C4995B2C3BAB2DD04B1A7097DE16DFDD76465E79ADEEBA90489ADD0914EBA +53E11A43ECB11D072C68D2131BE1C7C43CB9DD5FBA0A67BA43D6851AD4CD3BC7 +39AE2E22CCC183A56CEB71D4F9F578518E376426E42B6390426A8434B5A83E78 +77A5B9963BAECD5FA5521C2A29418764E4EC1A72462B04957F823E2817A7F8D0 +1512919889500024B1C42EC107E8B8533C0B314EE4E23313A4C1BDB009A20114 +2248276B7E4F8924750C8361FDB1FA328B434499FE5DF14B96C1F5D03F1F2702 +C77057AF82D3982C5EF8EA40D0B923249FD9810464A9EF6D1A99402DDF08120F +FE77568235A193F5DAF57231E5095D4EF505A0FCD8E538D53C5E23E226B487CC +568F94438B050A4ACB53340A4054B02E8F4D8BB42E72FFD1124BFA91C22F3F76 +3F3015809D6EA1CDBF7827ECF8893F550132A618BCA2B9CEC7A329460CF59E2E +3F0E70D05F42D3E37130429C984D24F49529F647CFCB675C7CB79749E35DBA8E +E8A0B56EE8FD852899BA52B789CF2A5D4F1C948FD5F5C57DC8475E65C83FC690 +28EDD11C5A7149D68B924EF92D73A70D37AFBB433D1563A034361A4415C1722B +7599BA7ABFB5D0189D99B2C48024088699820761A73762B4BEA323121D893572 +DB414C845757270E9F21A5B2BBDEABEC09C5D030ACDBF5FD8FB7F9D62F13A93E +AB6060F37CA8DFCFEFDF62CF0222FC4298247FF97BEFB153EB48A5654F570E17 +1E1DFD669AD81A441A98F39A41352DD1447E6B923B88395230C74CF703375B82 +8200F0186280DD3701067721E2DA2947A499A0974C5ED5C7BF3A226319D5E60E +FC29B2484C062A0FC798C291CD5DF9CCDE6D548E2FD14853CBF563792BB38EA2 +29E2FF53230B91825B5D239571581541B8BC60EB5CC943808DE2E587CD56AED3 +BEC3DAA382464FA0DF0DCFC029DAB0DD3E3180ACFD8C81AC0484F0C096DCBA59 +430CF139C30F8E45F15CCDCBBE3F96907ECC42F00DA70994C7E3DA894A5E4367 +9131033E06F1AF4FE22FBBC261B490641D914837EC2715CB72E5DE97FDCAB119 +77C8401699DE82B21695A2BBA34DE7E23FA3E4506CA817F20331D0710D2C9B08 +F03F2C3322E96BFB5064EC80EF4DFEBD8367BB7EDA4344562CCD23259F7ACB48 +04A9AD253332216DEF772A5438B95FCE3393CCBD5CFD3564B70A6B785E3FB2B5 +A90A86D161B6F70006DC30254CFE76B55FEE58F2DEDC34C6DDCBF1A75674F657 +2214FB982FDB68CFA80DE2485479759CE3DC6A7E73ED2BC4F1E12B16DA41A1C5 +7BFC746498B0388AB63258419384F06BB89531E3CE7A320CC929BBA524CE6B78 +7E9523EAEDAE6E724E6172A76C8B844B721C4CB17E831211FCB830B1ADDDAF2B +F101C2E3F973E3EBF963B70A5B403CEF7E3D869AE8461BA22A21944F954F0784 +911D337209C32F1ED5585735149343A8DF86749E395907A4DF47E3DD955632F4 +2119F02BC4688C047960306B85C79FA5011A0A947B3D998078763E196AFC24C3 +F4C5B764B1A90C2FC34808D92BB87AAA5328D35AFC5F6036147C906B7D1A3499 +65C100A777CE69E53BB32D79075918510681B6932CDD71EA32D2B8D624249414 +E5490FA6B660AB817752C9A70ABAD21AB8B1227D4C87532ECC8B504902FD53BE +5A130CFFCCE869C76BDE799CB07BE6E8A364CC42FCF642314329FA02D641D85A +20F2B7E13DEA7FF35CD9BA932B1ADC1BC32DD07EB048F4E87C200FC186942E89 +9CA9E82EFC02119549CBA415130B0D98A471C970EB1EF7A3E8B7B8242F7E81C8 +EF86B46A99759F12C62138634EF26C0D0942BAF165A40347CCCA16FC278F875A +B0CC1515417283D9D093ACA02D40284BDF8604CF49C1BC391A14BF2FA0D2CBF0 +FC6C63080242FB76CD082CD5F8B74D44AA03208458D4E76D5979CEED233CED2A +111A6D222DA6023A10721B41C8E3AAF75B687A8BFC5719E21101D005BB811172 +4621B2493D36C2E4834F7187895F9AA31F67C06EF7F4C77B220D4FB889F8ED08 +B29E10164249A7D5B7E5F0984DE91C1C5B28439EBD117BD235B700F0A962F781 +5D085D110C2E73A70FBF1116A3089843598D04568166C344A1F41758470B6ED7 +9184178DF09FEE308F775400B5573AADA47232243060D683C4E7850B70E7D798 +802BCF2038A79D9C02702EF781BEDD831FAB3615DAE92498B0618859A00CF942 +50187C26853134D471D76842C893C6D041566BC2A51858E41FC0E3DB1672B373 +8F565BAE23909602161C8FA3B0A8CFA5B5A525EB95E477627C24707B7BCEDDB0 +C8321822C491A5A86355857CB3BA92D4C5DC550FBCBB42A024479E71BC219C3F +DE97CDDB5FC69007024B01BA460B522CDCF5D300293F8375127DCB1ABD94DBB5 +A08B40555BA14BFC5E23F8165BA7B45154D3FF754428AEE97A1CFF07DFE06AE2 +9C4D711D48AFDE0BC3A50FA23D09516EC4CBD986F746CACB8C95BA69DD20B1F2 +08841D940741C960DB0E48623644599B17A04E7F500B64569516376156449033 +2A8943AC82EBFE91990FCC2C99AEE28247B3D4DA7C5BF4DEAFDFA2CDD3D08BEC +E4EAE749EC0F9A6A28850F201E3B2C79E920FBEA1A7F3CBE19F3F3B2BBA2009A +729D26431A31A7A3405F9BAB02A9F451A3591AA29334FCE6E7DAEB68DC34690F +E189556BD67A31FE42BAFB929CCB0B6ACC4DC1649B03AE11042803B9A21C879E +DA2E857A305DD86DDFDF10BDD0B7FE06FCE80BF6728A9BF434AA27A1FA11A164 +D1584D7829EE7053D34AC69CE905871C3166C96740EBF60FE64730C11A63CC23 +4EE4318CEEFB38885A3011812172A1C0ED6CAEDF62CDA8CFF9D0081F4B32FBED +6890FAC82FD2128DC38266AF0DE70FD90489229153F5D172B496B937D2BB8D65 +2A86CDDB601218AD60E1B68CE245ED1D0E58CA1936908A114FC8C7A1EC53E3C4 +64FCE5D1D94C899EC235DDE3748392BD878EBB8005B92F092F6470F435DBD0F6 +59FF0448F92A1D6612BC766242754CECD05FDD77F837B411DD4DAF18DE438B44 +833E0228C3349A29BDCA5EB57C81832D9703293BFDA307F8B3084AB5E82CAEBF +DC71070017586387A94E218DF6DADDA303D892AC7198249FC769E64EB4010725 +5704E6FD548FFBBEB2AF71FD922B8205FF782BFEDC44161AF9C6C366B837CC10 +D2DAE81100064589CF1FD53847A0FE243383CC02D9C77E08FCF101D3C2C1C5AB +3177425910BB80B7626B8BE707271BF4A40B4143DBFAF11F30606698652A866C +AC430FA8C48362C122C3D3E1A6CD487D49ED49B14270869E8D9AB138DFCE62A4 +94DE6402E94C6923D5C7AB32B6C1C595ACB6B6C6D4637C0C33E5D278803A29C5 +1970489E0DD6220824B012752FC60AF3D0CAFBE07E0D918E62A723A9E71F504D +A5284AE855EA175D724B976D989CC7BBFA69019BB3958B7D61978959C2B12719 +788FC7AAB8029B8895621F618DD67578AA066BBCC56649293791A1F07307A232 +58EF97F617517F20843F0B317C6BC6F3EF64AD70DD35E6B25AEE4345CE0D3DEB +8DF2284BD0EE20D326FD65F759826D48148C4057DA66FE14CC14ED33F79B2F17 +69AC90656F331371D13685AC5090A8653D3B256C5FCAE10A86011E25FF042BED +D1346BC6046B0FD5BF7B8C2100A5CCE4DCBF9E882191AEF91C300FFB3EF52F03 +EECE89C7D8B46A2C8F993C0A47B3494099403E9042EDC07CB6862531B2024899 +A378960B55D3FE5998290457BA27337104887CE83A7CCB5E243097A7A86EBB37 +600E7AB7655D3003A6E37AB275BDC82FB30F8E7AA1072AE291BC692A7B8C913E +0FE58AE6C100BEE929F86495D735CD59D277728A4C1D8CDB025785F09D14DCFF +AC86E32A4A582CC053B4A60519EA32000AC3F372739D6973CE3C2DAB2794D923 +AE6379DE839B195DB3A1EF5A7D1C40EC956F4928CC9C9BA7ABE78135DE7E8FE0 +0A243119A8A652396BEE0C84C2B0FD19FC42B64CBF9D22CB75663FD43AC3EF1C +555611B1BA1D45F85D27FA3DF97F57C321AFA39566D5796BD7DA9D776214C53E +A8ADB3C7478A2E779597D1F66C6E3B027E29C02A32CD02A6C8957ACFED6390F1 +11DB06ABFFF7AE18923D4E4EF99EF4E0F58245357A9FF20283BD0A045446CE2B +BDD97A4856CE8898CFD1A69BC87A1D8B155A9E3C337AB860D4B9C518580AC24D +C89557495A65113EEE53502254B60A6457C73EDE878025E25760D1BF4050755F +7E73C95A73D7D83BCFC1EE63FFBED31D55149F98BBE60CB0075878C088C1C932 +B3EBAA3FA7A98E01BBB900BC12C83E90E2E51BBD8F2C1FAA5DCCDAD3E89368C0 +2441328E2963044B19A6014289D088C0434921CDAE975E9A547E41089F4B24A5 +93435B3698FBBD0D4765CAD1DB922F95AD9452C483B53BAF5091EB7C5627BA57 +0B89514654C04DF4552809C7C1EB967137FEA20FA1D92D261632AA66AC66C2BD +4E6584871E1CC55B702F05A97389C51BDA4FB131E9BAAC3345792E0657089179 +909CB2EB0529A23BE5FD4AA804492AD5466AAC0B6534A63ABA1DA4EFEE1FC003 +160F7EBA31A4BC54C4E327E40DCC1112B17D53D4BC3887FAD8189B8AAC3658A5 +B44B1F10ADB62190E9A097637951B18DB403C20D93A65F602EF033D3EBAE895D +02CC3E72176D6BFC26B7AE9024945BC787B07310628D702580C0622EE5B624CE +45F40BD8C49CE83F7F807D586193961D3F2E802A57C299070B2D0F760BAC8879 +7D619D7356596434A7822983D64F157ADADEEA2DAC8DDC362504FE79EB29F3D3 +84354E9709F5968B0891E10C66EF859EA472E26F0DA704617370757C40FF2A61 +6005169BAF7B3F6AC6AD6F4CA4E92B666C5942946303D7E8F284619CFB0C23B3 +B2CE3368C46FA4EE95B893B3987FE902D0A553962D230730F00960E5EB7A4095 +8DB86FC8FC5E1B519A63A10EB05B239BD980614EBE9F47A630A3E9960D1B1B30 +ACF15F2B9BA83899455CB66EDE2804E4FCD5390BC6184AA466B65AF9C273C6CC +4CC9EFDD9DA23C2B6EE6D41897D75622D13639B48A934B71D8B5727FD3716690 +9DB0B5CB21D990281E88930682FAC6C5F4E2F6B6275648A15CD4976BD7A2C3C9 +3088AFB5C74CC7B013013FC07C1B0F3855B346153B65C1DBDCCE354C46997443 +F0D88F3A566016F9DE8CC72E2533AB3D608C3879CA50A44987521E4AA87C7535 +70D52212A6E9B20188A29AC8EC5BBDC36E5905AE8A98D98BEDB04CBCB86803E3 +9C11481DC384480BA84D6739749755EEA5D13825E2A73CE60C4D9E895213DA3F +D17614DE23A4F5BBB77CED37BC0EDD509FC982B6A384D354404888BF640EEE32 +011B752126CDC123D644359A67CA221B943FC9F9AD3C21C6A6C200E1116C4EA3 +6342DEB13641F27465E8BA07492CE3478456F4AD33F11396C683B645A9265A8F +BFEA4B15045B6D086722C4DDCF6636F10B0C7AEF67DF5263BB3C3B0205BBBA6A +3CBB91361E9D6DCA886DA4811976AEEBDF9F693EF2B9C92AEFF1150396924FA5 +6773EDDB28EDD632A6AB358D8D9481B681A4132718ADF8114A886D485BFE3B3D +5E4D38E5993452235ACE90DE18F05D3D8BA1BADA1C91E115FB44D97F3950404F +BF60DE067BEA3DE4107DD9C602A1F79DB07FE8B9578253DE009329954D4FDFAC +03538C871E0E861A27010FA65520E2D64538E16207EB2E7480E120E7E951E687 +53B3A675C2B7A33C87F74C712C6A3F7AECAE4B93B854BBD64B290AD73F418E24 +ECC55323BC26742A57ADD9A875D54845CC152A0387796B2D4240D8FD233B7ADC +24320EF503F00864E616875A4A78E5C6812E4C080E1A9ED6FA5BAD10CA19F60E +75E9555D3DD97FA9D4FFFDD0A7F1976A5E6162C9274BCF9B54E70045C2DBCD45 +DB89D6132634D5A247EE4D86CAF91169A3828801D6C809BA93731FDB1DAA57FE +32943D7D3777547C5667A36711BBD59519106F08EEA586F6AC76000B4B11F0ED +AE10745950A200C4854DB95E19793DA183C0D65EA822A6E4B74D958C3C04C3BF +535B18FAB3A2ED655122C1936B010C5C386C4B7B9F0BE1D3540898DADCEDC7EE +15BD873F84D16075241F458C0CB77190A9AFDBCC06B8F9EF0826EB30ACAD19E7 +E6F677680A43F868621D5F159E7D4FA6D02298013A38D07B95215341D825E7D2 +6645DC4548F7638FA0E7C6623DB99DD3E5AFF3E98CE808EB2269D04F2974180C +5C6835B702BCB803ECED3E509E11F549D99E104D0072FD0AE0E3368B8BAAE93F +D7FE42F04D18D1334487A4E264FE55637FB75AEDC315E26FA1B786EB7DD8B92D +FFD25EC6CC2987C62DFFA29E8AD556D63CB52C5AC6892B6E1FF5634AA04381BC +1511469606DF08C618CF6458060F97F504AC0EA6313834D1A7CBF35EFFF4ED85 +5E0778A7C485E61DAE41A5962822016DB270FCBAA00F6AEAFA29A4EBAD761C68 +209ED228DF25730626741D50E19D1766BB895830397C8C1A72DB3BBA55F7DA7D +4148C1D90B37EF217AC492993BA2CEF9F2842004547AE32AD8A8999B3077AFEF +7672A0D505B382E6A41E9FA2D11C617A44D5AAC2042184266017C39B29540FC6 +08B70ADDC1BDC711390DCF933A70D9DAD03EDAF54F8C38C9EFFD8EAD1FF65D45 +11AD1CA1BE49E98BEF8BA210FDC8F146CA563F9A51AF0B1178502382A7482EDC +EF1E313E3AD947109B58112FC644CF77308D2A8B377F5FB494E28B64E96B3F2D +7DC3A2D3F8E95EADBE7C11F92CC922FE78E07900D69898F357910436C69B63DA +2ECFCFC37CAE957B83C5B9E232E308B5090BB2A99C1A19ECA4763FFE3C9BB3F7 +E7A8A66023438A6D0A2320F3CABF171C0B1910141987305A01E08FCB9D07BACB +54F5E23C26E05F97B2D8D4C29C3442EC472FC39C278AD0BE6DC19D91433BB8F2 +0745D9639D35B97D9FEFEFDB3AECA7C3765A5E88B59B40E00A0088440F1D6E0E +01792EEBBECDE832E58A843D333DF394AE900C45C42C756D27DCC4B6CF6390C3 +8450BC057D44E6E83D6CC28F81E99363615CDB0AAA8DD56BD454491A6E9F6B77 +455CA95CF08A14C6326E78AA6FA39CA2053D332E1218056A952D1123C1C73A9F +6021124CAB7F23CC38A67F3FF7AD39041A290926E85E75D9ECBD7C78C05D8E5E +F004D7B65CA97608F35E17C91A8C3ABBF76237B4B171AC566A0B9C34F578D551 +1FB4317A794CE695A872463510543E212A8E61CBC6D762730E1FCBA388369494 +9AB9DAB46D412CD198968F40A60335DFE34F255581923EE62B5A8984E50B34F8 +AFF6606331FEECE433749E039AA1B74D4C6A27AA1F6730A86A7EBD67BD70C0C0 +0D3999DE78836667371883ACEBFD70A6CD51D417ABEC5B2324D863D8DFBA6918 +8ADBB879EE3823AF3DBD47E280814FA603F4B13AA966A7F7114BB0130E518715 +C442CB4AE0D51C1F8811B902D25E8B2515DD537E9292429711D725F5613182A3 +4AC989EE031908DD115C98349B9695F13969A43395604C2E19CA305FD1D60226 +9CDC9C26724DE6F6B4819262B8E8A1114F633933B8E18AF2ED71BBAF27277935 +41590F61F257066BC3F5A53A41E4AAC48C871C4CD6AD9FF3781B6038AE360DD7 +955A4818950DA028D308779858C29E6D010F28451A3676A3EBF13F4F82A25D3F +C470BC73BCA4C342967F3F77A0B971E5AF9AC80D5595FCDE497B774902B89B80 +A58E83E55E40AE05E9BBC2C8BF914FAA83EE695EB109B713DB0A3FC67E102096 +A7719209AD328C46C3F913A6CB7C78A290749BDE09D0C5C7947C715F1359C493 +26A276EB34D9E0D1CCE459296FEC388078992BB794AEA66BB7C80743716FD0E9 +E1D47B891D95ABA42352651B832AF5D8777AD257FC26E614C9B1807EB829951A +0153E30FF02B63ED75A314E206532D5A6F02F7D31EF1A4FDAF1DDB327DD36287 +EC0226F0823954EB663F735073878B115EF2B0B069543626DD0292BA4C59974A +3710A723D9C00EEB118E98DA3A8934845C44C3F988B4553497248C3342122E2D +A76A1FA97E5D1061D824999E0A67025E4BF678088B6B57B444C290DEE9D7C3AB +B6848C14EF2FC6776A47BEE20CBFE61F667E9132E00EB96A581B154B437C8E2E +9E16A414F99AB459D532768C7905A37AC6F0DFE133B7D43F58AA2D43C0B63486 +E769429461C0C574376291A00DC3E084CA171F9F546AD307098FE9E3AAD1DD61 +DADD7AAB91DD6C00DABF4E6BDDD8BDD51D687F2E1B7162301F2B80BFCDDFC3DD +EC3AF5030F284E2B869C89A196762FE21725A7F614C16144E0891EC814DF7CF0 +5D4D3F66D56EEBAB3F8539D890B7D7C869648B58E6A51793C213A5D5D335E27E +3C6B2105D07E8751915662AA0B8F51FBA97169A66CF2195E09125F056735520E +6FC8AE0C5EBC2BF6380C1C6176B8C51F51772FB260C83C7CD256573AD0F36304 +710A857C900B2BE113C5316A1825771F94321863F2E703AE4412E73001758478 +94610FA250C774178992AE169A24F246F58632CFC2704CC92439AADC4ECDBE42 +A35B595E632698D4AB4A56A8AA56BA77F732643753E34F6A6372BADB7DC4B872 +3C336F6A425707F3A484CB46707D39C785419AA3B53A3346E1B51878AF2C93D6 +5F81B5D88FD4AD6B0250E16394EF95AECF15B3F00D4247DB499B13FE31B73010 +D2494176F67B8437C97401626DF51355C93C404461C4ABB7D92FFFC765E0BE89 +84A227B1FEA694D32FCFF15D3EACBF9D33C5AD275B6AB76D2B79A3E0D0F7EE94 +2046ACA982FD57F2415B6914733CA58DA9AD53B5169D973C3686FB1EE4CFB94B +8099312D9758B884768E82043A6345CFC2D05AD742B2B50A932D310200EA0207 +FA6F0F78DF0F234C27C9A7D15491E6729C7665AF2BC732116EA2A2BD75A83596 +6E4381DDD537450C431BFDDF20A784EF02B1FB68D64EA9B4DD4EDBC17AC6C60C +38D99AF68F29D5AE73FCEE7A36E77A46137953E9846F5B8F1E89A5A184AC3B66 +9906B2715E3CA27FBD9A51220FC6B0CB3D7A2A1617D3C6B1ED4C98CEF3941EB2 +508605E64D3ADA65B6260F0EDF3B483A7FD014F88E32BAAB33541FB16DE5FC99 +D77018CE78471A24DC42A3E0CA3979527D049887023D024A3002B37EAEC9AC04 +2D5F14E26213FE6047D0F4DDFB27972AF90D39BBD19417C0E7D682DE0F82900F +C24B570F2EE7F2191FEF466CEB9846B1F387324D5B12B9795A13D8D454FF23DE +9D9221B1DE88CF14649B6C9F1FEB572D2BB11470C5D4AAF80CDC4E07E72E4FE2 +658D8835158AD7B8AD06687BE521A647752838BBEFC0C9356A0CF1B73542B6CD +1DD5606CB6A9F6263B799230463616775209C2B2B8EC69C0FB00BFF103053EEF +D164BE0ADD2D7234F5B93D9C79DBACF53630479948CB151A4BA659D490BD6B1B +FE49EBEB01949EA4EFD789DC7F584D2D0FF4C2307BD49844C0A09B1152699CFD +00451F12C8041BC3569CDC068613BF42A3505E1E1EF7C15DCE095D4837A3B075 +A1B8E329A5A264BD10C3C78FEBF4FD5963C0443E1B36B718ABC713CD4980DA0C +7E7B786EB989FF2DFD627A6132E360712F222988A4E6459225F4438F7464B01A +9B7F2C6EE557F6BF291DDBCF5BB3381F8C5AFD3DCB67CB8D885C38CB5CE49EB3 +DA040612837DCE5DB1A56ACC3819EAE607D852BF64EC9BC75371A948541AF8EB +DC5BC4583E013D578715034B7753D0BC6F55AB54C87B7FC771B1D0140341736E +F99D7610E03ED6EECDD1046ADA13B865E118FB4322880C19BF933549CA1E31BB +DE2DB4F370E015CF1DCBC99D792297189D7BDBE5EEDE7E30EE6650F33161D319 +6F6BD222E804A6507BA2ACA37284B25E455B0537185DAF8773008BD6EBD113BC +7B27B47AB8E9CC8B6A21BD6FB58E3FA32C81CC3EFE9135234AAE897E191A2600 +A6AE60220207E885422BB1B48B2AF4D4CD98554CA3BD3BB720FDA9E8540A1FD0 +4B15777D2A23C60AE4E9A80B1A9A6273FEFEBB7AA57DD4931D88934A91490B06 +F5AEF60987734D8435BCB113E56FE6F3FB2D3A0C057DF82611163D91E032B44F +3257510434B96168D0A1C91C12F669FAB09961CAA5759CB880F7CC8581FEB999 +8D73181255DCDE6852FBF100DB92B70EA8C7E2B82C5C2D1B069E0B126FB09845 +1F828A67AA70CD628BDEF776931920AA91A1861662B30367A8B75F7DB9585601 +F3BC666F1E422E884A49156FB8DEE987F064788373A9C98B9A01C5E8526B6120 +177D3BA99D17A99CFF561B8EA85AA74FB443F02AF95BADB1496CE49FAB52B3AB +6284DDC0B6F8E286FF527B0653FC3BCE3A791536C6662EEF3F21023DCF65B05D +3506D713EB4CAD909E57C9672D911DB320ACFCC0724F25E49DB713B979A9FE44 +329918977D00E41BDCB4A8BBC984FD743BAFA0AF1845BE4AE1D47428D124909D +BE639284E91D71CF630078EA2FB7408731A88E28A9768961C52E2E3FA37F3FD1 +E34F85E189D822C9ECB971D9CD819CA028A138D741DFE1FE8373E3A7C3373270 +82AA6B286D19C1DD7D16D61326009A75E2F23A68A5ACBCD453E5516D9198C125 +3E3C172A730443463B36110E4B1CE6776077CF23700A36A4A434C641331626E4 +4591E792928383A7463F3264DA88C9A22140B0752EB0EFF7BE8B684131FF4F4C +19377AE97D4EF96532FD72DBA9570CF8F52457CA48FB99ED65B8AE6E8AC2F982 +03B338CFD36CB681279E9094CA6F110BBD4D633629CFB0C5DA424D2003CBF6DF +1965ADE0281C20C9C872A1B987BE11FF533F03EB9173739D68EA0E2FDE0C5BB2 +9428A037DAF9AC7560A3551FAD938B6BA40D5F8F12BE6960325EE234F255DFCB +FD86DBAF8B027C2A34C8AA4F0D0EAA3CB020591A784B25BEF370C99AE34E2202 +6395AE62B5B71DD4A551BDFCBBFE8F7FA64CFF587EE5B03A8445BF66BF7DF203 +6ED5104402FB9B5560FDF3AD85617DFFB4C8D0FB27931073F3CA6C55E6E54E02 +82CB95E852170FAEC9D6E26B3B49152C3DBCD5BB22F5B212999D21D23CF371A6 +02E8AADD793585C7B8BED25D7E6FC8509848EF83DA8B0CEBACFA64D22BFB0772 +D5C50A431235520DE11BE4F280049613E70B53629E6D79305EC6333BC8485378 +25630D8BD49F12963C1EDA7FEECE66B6989C18598F9F1D0E1DF584F83303AF24 +29A47FA93BEB04D73913C112AF4F17BEC47D7A7658FC08346AFE4B2A7146BD61 +5DC0395C52A0920393DBCBFB31CAE13E8B0C1AD9BE8AFC3CA81066890BB79CAC +C8B083ED7853EB74795371A2C72983CD9F35C771C0707D9140C22F7E9D148D8B +D8FD578E160ADA08568B9ADB7075F426097A0C3BD72C557D7B8D808A1D24BA33 +06E970953C6A952AB7B9FA9DBD3AF93F39D953992396CB4A8CA699916FC666C1 +BF279C4ADF1615EE65BF22C3DC916B0F9F7B2CC54EBEBFC9E6F47290896130AE +DE1B1B599CCC39208D4142D529A8BF191B99B1C49E60F969647EF6FF5304103C +235F10E72AA15473AD31B7DFDCEBFEA40B73D98528B9BA34115E2D428AF84702 +BD9B3296285CABADD2038A505F67CBC6226A942561D5076803C8E57012BDC5D0 +143BA3A2F5C501AF422AEFB95116C5C40BFFACF1BF7F663D35551F8B270ADFA1 +7C29847D1FC9C91188A3E30D35A357033C213FD9C4AAFFDFCEE8E56D0F494570 +377825DB4DC78A2E4910321F7A99CA19D8F63B6AC5DB9DD3D25A6B7BD9B59A0E +DB5F0A25DEC3BBC96B3D26FAB85CE144D7834A1CE02AC05898F11B8415A3CF25 +AC20EA39612951A5AA6246DD379656C8E42007491461F6C237C6A21A4633ABC7 +9096E45DCEFBFE5750F7D223C6D00DF0974B98FD99190E48E04D6AF706F3C9C2 +4CC83AC842856F85563B0D48DF0B04B2FD6F3FFDD891F608782ED50A2C3BE1B9 +2CBAA891ADDB4D65F2651F1DAD6C4A0A77B25F3B6867EAF356D30ADE19D406B6 +B96E61E18FA814F25A4EC9A7DB9A97E7062DCA91768C2C57FB065B001D966263 +21276E0CBB1ADB60360598561888946F39E0AAB25881B90D6B08698243086340 +5EEA694B7CCCC012165C4E32F2272314252B5C937BB54329C078C37E8BBEBD96 +82813CF7DFFDAB3F2DE684630B10BCD386D19E8E653E220F4403C5831EE96069 +94F23EAD50696129006B8CC3160DE8086C978E92886169CADEDDC53C6D0EB174 +DE2D95EE0AF5754A954E7806D202964D8E679CD7F93B8E5BBE02AB2417524888 +1AC98AE1FA2D369C70C0179F086FD3B2A759D6219B6BC48252F970893C5C1DE9 +5CCEA71B1A0F10BBECD9A63D30F6469E0AC94EFF99322190057B2FD5A1507AA3 +D242FF2C3DA7CA93452BD6C658831FEFA2A2D0282EF662C3B0B8220176860CB9 +4E2BA62E6E57048875EAF30B0093B782764422692D0067375843F96647735D41 +8C19C1ABC9D8B0BDF3D97F21C5900BA2D9E45A0979B21FE7CA2FD50319EBE343 +8A16E6DF19AE467FB3C19FDCBA1017211E259A3D8EC4714E38C8405C5B008626 +175E959124BDE96372905BB9555798DF405DE23830F3F26BAE7058034A0FA2FC +0BE9640C22D88A8547FA1938DE72515AC0847A820BB6116C81FDC85DBCBB4BC7 +D81815E0260D9FA0E759375A9E4721CC2204F4CE00D0CA74E51871FA34875C68 +0B1E05DE1DCDDD21BF3AEF51482BBC19DC6E1AF3C2E3C915102FCA956BA86CFB +9FA5F50BA977A472DDDB35E477ED5AEA56C005157C7AC7627E529F60BDDB7422 +BF4C061D7029C0F85DE7D266263FD23FA9EEEBE58ADA311BB0D36FF1FF0802B1 +299762D3930C34D69EE4CE17AAA7326835A4D553BB045C4A216A4AEA82AF36FD +73944CB69AE75F9E79369F833EDF5930646C3BE057F457B21BC52206693E19F9 +A390AB95E0FCBE021308220B9DCFA3A2C43627F105464F41CA9ACBF51DD01816 +87595BFA78440BDE4C69A41DAC308F5D19720E1F01C2B3829160738FB498B2F9 +C52ED576618B3998576443454A07B7784FA0CCC0831461954C05C364D9B0B09F +467043627E67D7FD66D583E92183A52C3EF8C0179E05661D41DF119605ED3202 +3B3E1C232040B475CDEA8E0AB92B881720A079F93014937C4BB2450C8A7A6182 +820CF7BFD92B71B2924972DF468BD9E120C8C3C96A3D38059DC95E2497BDF251 +639DF3BA5D34B763AB8E8716FD5A9B8E1AA0E1C445B5417B16B3A2DE03C1564B +32A17598D24AEB4C51DCDD7D28BD0ECC39BCA860E5FA32FB8DA4FC960E488E52 +EC7A3B42A9701DA7CE09FE0DC6844E26960C6B6F1D6EB3C07C903866117B3FE9 +D51AD8C654048C70A94434B5A2C6FEA57D5071679FD41EBE6E6EB7C94FA9E49F +13534142F2FFFC56632873F5EDD88190A727A57EAFA05E07EECFB8E901A978FF +66B1B6026D59E36EE4D11B667161B01021B1697EAA4DAE1789C85E90276D6E80 +3AE9EF553659116F60CA3790D10BB50E21DFF508E8C13AE909A031F320ED684A +4757DE36C67EF5A61A9382DDE8026F044EE45D9299BE637CE9F3FF1DF2612E94 +F1AA8C6C9CF3E7A7DD54EA60DAC781FDFC79FA23A549F9D045B7D33815AD1862 +B2443B02B7017DC77784967E9535452F3466796A1A79AFAEF033087852EEED3B +F73B887659C3B5FCEFD0B3C6CBE54FDC4997B52331FD58FAB9A3636DA029B88A +85B74A691D803AA3A9C24032582F11E3EE8369B5F3B5E9D121896A29F2E6C65E +48692E4DAD0296BE653A632609DF2C7536DBCDCEBA1F3EA21D6E4848780E53C3 +C850611024B2F2CE430F725091F4D94262A1963B6434A3B7F7DD2D48725A9530 +D1588A863EF323BBB5A628472E87FDAC1F10EEEDF42334AD39F659AB1D3C174D +E9CF07772CC74C112916CCE5E02EA1F813DD7BA5A2B8F5EE63529C4509900B2F +410B7B16E6119ADF83659EC1A742688C1A1699682B90C518B3DE85479C890E29 +A99E798A4BB845A982169F7301CF3C4BBF583E6D79AD2E49CEAEC0E7D2311FA7 +5756E69122F4CD6AF69057EB6D76BFF0C19343048B230A20361E33297D683AE1 +45D1687D84ABD5C8BB836048B9B5E650ABBE68E66EF27C89AE01DE9BF0E1A0EF +C5DAD166222EAA95986D0A31AD4FFB210D8DB5582D92AB2085FB6207313E3BD0 +0B8D05218DCD8124F8E9AEE538C455AC0F3A121C53A27B963680D625AF421DFF +718D0682B8FC8994D10F80EE7CFEF3C7A22A2622E8B685132DB7AD8B8EB74891 +A10B4DCEAE8EE380EDAA8F13931F9D3DCE875161CF52277757980ABFE42A15A2 +9427A355A1D0E43D51E5259C1236925DC69CC205D8C4286E7579F990A29F6A98 +C0148F081FEE5FEBA4CE1267AE67C854987B9B70A41F730768967A58046D80F4 +9FC01AC85AF924C87CF6A97D017E382E2C888BB1C80138263B8E0DA15F82E169 +7D23A24302AAB8CADEECA545700D979261D1F7F1142F2C0CC2F3390F58123B88 +77DCF0DAC085BAF095BD3E158572FDD033E44E067F0D0447071AA62B1B4FF680 +B841E0C19E5443970C937F80966046D7A00A5DD1AF38C18D95AE7732AB983511 +30622485D8DFE310AA3613DB5F351C9D1DBA6FCD686E38148967004A5EBCAA78 +9B6B31B3244FAA863022D2762D43BDED9A8CFE51DC9A8F545441E3A478F0933E +B187A85A04E4857AC883BAC5F42A890C93D38C495F783CAF9780B6D2BF160363 +2EC4DAEB9039526E575A4183F9C02B56785C6AD690B48110030507634EA65649 +EBC356154C92197E63103FBB8E22D39003AE100B70A920CCF051D95BFA98A5FD +912B94289DDCB7C05C6ED85A75E27FD5F74F86486E23D2988B6DB358F41471AE +FAE134BF06EA5B5D1831D9D68FA9791B72D3A2E54D1DE5C2C6A8DA1DBF18C280 +C6073F817125B132928E2EFBA35BCFBE39C1B88FFD602D2D216EF0473CAE549D +C6D0A2E6E82E68404259516F3591FD433517D9C9FCEFBC9A5CF7B5B27F5AB430 +AB18435EC8BB9AC2843258FB72004AF4CF43228AAA717CFCE311ED7A785D1D19 +41A7D56339F7D5A6DCBD8C2473738D9EE6F0AED82C56E7CC01CC7812ECE57061 +43A65CF7C781FE0994ABAD729D54FF48C029DE1F8473FE2A77EEA482C87C0D31 +E3D8B7C0B58C7B93A535B401725657E2B81F602C0EC9D5E38C1AF15718346664 +0E95B89D0987153BEF53185D351D2AB2EBB8F88B44580A7C8D9114A1CB01D29A +788656E462955BEB11A3CC309E5349B033F33B0213C10166D67A24C877199DA0 +76F0D03ECDB6EED7C23062FAD575FB03D34ECAA6CE3F3EF5A4A4F44B94955424 +60598749E3D93B9FF2260A1EED71D6FE5D321F658DB5155130BC84C8AF3CE339 +8F16E09681886C2A8456B547144B3E52571AC2E8E30E6CE628C48BE2D08E67C6 +D2A79325EF9C6C4B9FBC621FDDCD1A9D62A618E924345ACF81154B583589DB80 +6F572ED120A7067A893DFFFD64DBC2D7859B9329E417C0713A5FB0C19B10DE49 +864629DAB75E73C3E82198B00E9F40AA40E51D8D64AB90C14E94F51298C8F20E +FAEE0DB31426337836E77546A68D0C3BE4AE7E54A693E6645F4C86F0199BDF70 +C9960A3CF831EF539CECE72B563E7DAA9423BC14BCB069F045D906DE885D7425 +726DA4C547B99590E71B83335247A025A7D3DF1F6C37A9B330A62E8E09462C89 +EBAC587566817177EFC52550D10043D933196549C0FE765F2581E74ACC018898 +27561470E34FBE6D2A2685E6520A4414D7EE1E8A038E082CD20FDB77811766FA +D06186B6AF02B84B0FE903B99ABF0C8C595D951458 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSL10 +%!PS-AdobeFont-1.0: CMSL10 003.002 +%%Title: CMSL10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSL10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup +/UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSL10 def +/FontBBox {-62 -250 1123 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSL10.) readonly def +/FullName (CMSL10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 42 /asterisk put +dup 44 /comma put +dup 49 /one put +dup 50 /two put +dup 65 /A put +dup 69 /E put +dup 72 /H put +dup 73 /I put +dup 78 /N put +dup 79 /O put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 89 /Y put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 +5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 +8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 +EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C +02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D +46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A +4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D +DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384 +7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0 +C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814 +25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5 +7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581 +299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8 +80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB +5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584 +8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894 +5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F +F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B +966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E +A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5 +9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4 +A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD +94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A +DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669 +E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929 +5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23 +8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5 +155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E +4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038 +44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D +8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0 +04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC +A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F +F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07 +111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344 +8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C +567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728 +C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214 +C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094 +51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01 +66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58 +9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6 +2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4 +4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7 +5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256 +0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9 +233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D +BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF +62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086 +B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88 +DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0 +C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA +CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC +38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D +FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24 +303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2 +8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1 +8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2 +C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53 +9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363 +4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29 +03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212 +93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8 +91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0 +FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27 +06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179 +95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954 +9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2 +7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972 +6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31 +5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262 +3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91 +CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1 +797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0 +DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112 +CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19 +8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51 +04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757 +78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE +730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F +021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79 +CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57 +90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD +97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0 +F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9 +4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394 +40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7 +3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B +362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7 +DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136 +7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233 +04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8 +DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B +C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049 +B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F +9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229 +3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE +D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2 +B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571 +74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A +44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5 +A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8 +3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1 +BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64 +01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4 +6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD +DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A +CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C +683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D +87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF +550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6 +2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB +17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB +3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E +F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F +B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B +1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514 +61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7 +124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2 +ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746 +0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246 +D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933 +F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2 +BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003 +75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A +8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3 +B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E +7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD +F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F +F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7 +322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E +523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017 +6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77 +66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633 +B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182 +5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1 +093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838 +B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72 +6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394 +EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF +A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966 +8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE +144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0 +7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F +172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9 +254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6 +5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71 +011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460 +B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC +0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E +3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB +E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E +993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E +0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9 +18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0 +ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F +CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228 +1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3 +A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A +6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B +BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20 +DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323 +1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761 +93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082 +E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62 +4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB +F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526 +4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1 +361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36 +95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C +AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0 +50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81 +88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932 +AB7916D44EC2210CB941B83BC0F1C097792CFFE7112D039CF77EAE73CB4E02BF +60F5C3F629F7BC5A27C207D70DE63FBE0E023452097D5B7AA5B2CAC668D4D075 +1A0F70683E96AE35A6BA0B59619C215A7012568991AFC0C35789DD0ECE45C649 +F44580845F0FA422868CFCC8029513235C0286B76196E350498845EA934DF289 +1D0C954B079BD2977384B96D8460B4F50EE635A4C8F7A3B6866F93CA641F3F2C +C93ECCD6BBCD792189A12FC9366BA7134EFD67A22B4FD62465250E0BA6B7C627 +73E8F50E379328B7FABA341B0D50F9A2CFB055E01DDF6BBCF6FE4114BC36C10B +E581D76A84EA12995506C33DAE9035683FBD5F54AA1545992B94B8ED946E5866 +2F2CF263C8B27100503264301A710BAFDABE2BC79B07CFA2FF4628FB593B0C62 +24651DBA0CB2302B18664065F9C6D06EDF4CE96CAB664B99C0B710586D3E3D73 +2357B60C1EC5EC0A5FFFAEBD1FDC2E8607886FD2E971CB2BDE3F3831ACA3C77C +09331BA12ECD9C58934C3C61023C70149AD63B43B158C677FD43830A89DC89D8 +8DBF8D0F98DDA8D06C9D59B5B4255EE05C2FB4C677FAEF12B325F8363F4A9C00 +0FA3A548FF16017CECCD6A1560E11ED9EEFE1BC796D2BD8984FD88F5DD6153BD +3172D56277366465F8AE0AE10E72F38DB57D30F9DC28A4C2AD1063ED7F4BF8A8 +B4D7732E938AC8487739D26FC08BA2DD3927747652FF43107A1F8EC3F11F8E38 +1D7A79B86C69CC188F2FBD0627C7F4C624121B2C3B0DE133930F9D480BB2F6D8 +254B97BF6159DDBD297E8F0DBEF47689E090BAC0209D53234F3A97DFABADE965 +30DA301AFFFEB9BBF566F732FD3BC741A4FD6C6E923C0279DDE108FAB57DFB2E +ACE75598F49515F54CD038003920FFC3F00ADB18020C7E2E008598623A8A11B8 +8CA1EFE31D894F2B86179C7041C0BE2DC7029117D29FF00F8EBF7CADD2246280 +2CEC39A29D82D70413FB6CEFD9B5999414655E1E6FAA31488C3ED458E880A344 +5D6119FD88B3AE9AA81DA4E675F78B570679A50EE64EFF2809E2BA0185EE5B94 +FF3A70DE7E0462E09651C2F4F216479C29D8B753F0936AEAD3EFCC0BA64A72F0 +58770CC3DADFE22FED4BDAF76B9F6D6008A85415D01479746BD03DE32A7D488D +9B1C8F8B6F10A5A8419B8DE651B2B9CF6ACF892BFFDEEB08B780AEB0818539C3 +7DAA805D8F621BD6B3B75123DE511D88604C5EF071514E58962BDDCA03BE02F4 +48A689D7E434347E81077F835F9801B1262494A8A831D803AD6323DD703ED2E5 +A92BDE25BAA62E955AC85FFA599F38A94A4558F83CB6D601D3DFD0EF37610A34 +F3B68AB6ED3BC07AE74331556F2ADECCCBDE091A2571B5AC458415284E0CAC03 +7733EEA500102E39526E921714290B6EF33987E8FDC5D5E2E6304405B32E6F19 +0D34C9995F41248D56A698B7EEB6CF86722751A0D680389F4F7F0D7B0FA89BAC +645836C890A9F3EFCE85CC21699950A00DAC35DE915E2AB54D09ABDF4E9A0A44 +75BC29128EA22CD98ADBB8A5011C734367095FE0B43E205E1E579438ED3CC098 +668D1D533E0686E9F6527AB4EDDDE7BD654793F67BC090DA7083619328B2F6A0 +76F82D5AF56DBD8A80F757748FF98C2A6D5BECFC35464BC557123FFCC5D1447F +D0E47454CBF0564E3449DBD404831D268447DB88DDA42F1239E291FA5B0C2A7F +0D1BC8606E79E388ABC7F2C4E2F9A37BF075D69C59592D2E4B1749969E4BC3F6 +8DB0A31ED1BB0EAF337DE171630F93F08FBA4BD889DDC7069F06711E40565ABA +80EFEA764D8D52A10182F141110ACD55089ED2A1686B0A2966929A690BEB4E1E +F896346DB64B1BD93D2ABA1271303C2051D2065E818FC6F7076D8FFD473FFF7D +5972990679D3A477AEE532EEA8B4ED029FC6CF5E049FDA19BA86B756A8575E2A +1A403D14F491FA424733646614F62E16410A30AEDB48F88182CF81F775869F02 +0F8D8B4130CF6A8C4379475C0E5FE333956A7BEB826146670329ED1E267A1418 +AD742E72E26FF3F53DF9BD0973EC25108298BEC5BC4C8A334AB9E9F179494BC8 +BEF0E05DCF987436DB4417EB49CA8BE14460325ACA66945084953FFAEF84F37E +9881EA4C778636D2EE3E512CE45A4CC31EB52E7BDE60C68F21E90946632A91BA +402C1F82A5E4E7FC60825785331A9DAC906C9574777749A34326B25259E0F31C +EA7C970E5344483055900BD864A29F58085BEB1CB67AFFFBAD6294B69F9F8F2A +36A4B5FC710642A3443674A4D13A89EE56224DB9E402B17A645466E74A293FD9 +A6083DE85E837D034B347A86E6277E4B4DAA3B7D8C15A9BFBC19CB1D0F13595E +D330FC272F0F4E944FD5C61F26C8734051853FBF27BA228AA98352C4127BDEBC +A6DC86850E0F1760472C7E182EC921E446583EE115E544E71D326B3A483AA55F +2624FC99D29A19C03D3420D4B845DA59FAA739F206881580FD36F16514BC3C5A +66C8B6CCC715035C4A355221321D53D0A05A8FF9E4E7E2DE61126AEEC58965BC +464448D3A3DB5CF9CE341520B2D8360AC6D0CD8086E53D5FE0A4E9BC992F1DF9 +7056113D28F191921A49F34271FE816F6A4A3016252279DE9A17A3153617F0DB +B4F5D360243C157FA120CC89F7FE8C2BED8248D1587D2D4DC4F5C90D7D6AC2A1 +329C5536E85BB5ACD3DF5520C4F620782D52F896186453F3206D740B57AB0451 +EE735047AAB4AEF258FB1DD705DAD49F695D5FFE98CC9F73AA59B034D7A6689E +AC3FC0144A791FB04DD0C2718B676B0405BA04CAF72C57DF2EAB282CB9A81A47 +FFA4890EA672F3DC041210C9F9C86F238FED85DA9710C7C6C0364552CAEF927C +D52D5A603D205C1494E39F6A66BD012080A4BD18DEBD96DDCF50CA118A569035 +040AD7B9E925F33391D130C3F274077C475BCAE215C7F3C457AB339647191729 +05F89D2FE3FBDB1DDD7606214B50C3860625F0E34FBB3037668338D70032FD4A +F7602CEF0B62E0D06B5E27F3106894CDC7B249734195A62A5C1BA0CC8F03E3B3 +EFBA46FA153FD44EB55ADE26D38C5B5C1D8C19623208987839093126ED883168 +D4A1D9A5F9C94C71E16FB6BB3504D9E772140F505438A00EAAE79D05C5722442 +EF1244BE875098251BFD488A2E84C2D3F8F70EA07C9805AD823980561A074FAC +523D3143EF274AC1F1872D8C1272495F07DF9B062ECAB0530DF8FA962D33C377 +2449FEC027B79CFC109821620FF67F02AF25F265E9D241F761B1C21DE9AE21BD +A0A7BE667E34578A62259E35CD3503A49015D169BA5131BD1230CC16DDDC9BDA +81FBD19765355B5501FFFCD65438449C36F66ABFA4C6DC52D44706C6E95FA7C5 +E5D69839225C8141E81F67339D6A3F510F1A87980A7FA2CFCF919F83D2758981 +885EF470DC2ECA30F843CC677A3E6083A9639E040DA5FE2AB4173581DA251557 +B631AB6ABB4746A81929310854DC087427DCAA78BE0A14D52CAD85EC12CB5D81 +21F8F7D8ED34E2EF764391DEEA35D03B34F5EEE7E0845939B73683C9A726D269 +6EF42C322E69844F503AB771E7BC722DE5D39ABC79723BA77B0ADA9A27C7E6FD +8F0523F450EE4FF8D985E36CAEBDF1DD6707B61478675CE0ADAD4E67FF4D34A8 +597F98978F414323791B64E84FBBE9D67764C113C6822C20C57BA3425C1B7645 +9AECC2E00CBB6C8CA670A2A5A7AAD80A1E737E77CFF242BE49B872FFB60FB3A7 +FDAB635914C9947859FB5EA665F7432BF5E507C5C95B5BCC14A841A2BBBAB185 +D1576730BDEFA8A5897E476D51EB1BAEAFF9FB6C457E0B7C9CCAA1684DE2C1AC +5E893046D4E6D704528669F08063EF86F99D8ACBFA5027686834E8461792E35A +0CE30ABC123D8C3E22873D65364CE0E5FF75B89D80D6BBF420E5FC5E31CE10EC +073C4064C47A38800034AB2BCE4966C18B1187E5CB1870B30FFFF6B967A54E38 +2A38EE09854E20AFB47C7E2ABB35DA449FDE353FA5A6FE4D7B550018230154EE +E635670AA0FBC05DB432E65F3457ABBAF7FD175D5AB5B386E0CED8D7193BD547 +86ED900579DDCACD269C1F4994F845804AEB40D68457BC8DF062A7F3953A2F07 +E3A24311F563B23859C69C790D218B0AE1B4A3945F46A5FD63BE4029957390B5 +54EA289752B826B24BDB883EDDF6659F26212AFC7CC8ECDFF1E7123A911B0F98 +FD9533D672C0A00C73E0F01719100918F605CFE56D0DAA18F421320FC18B3FBC +78AF72B4093E2D305FB3D8EBE1EA2207D05F5A121BEF677F3DE94ED9F0A7672C +11ADB780122787F68CFC8F59D4F4DDC33E13A13CBE7B3C5D8782F8C9162190C9 +0F49DB134292B4B488315B11A4C3250977E43F0FCC585709C47B96A2FC381035 +61674AC6B51052D77130C37A49CE264C0973D3D75B1AE625A66B56AD41EC0931 +C9765F8DFA5D1587D06A28DA530498CC3BF68C0B0F24F80BE5C1E76F528A1887 +E8A415FEA0519FF3261FD62F2D1E009F97455D5FD3C75B7775FB5104DB7A20B6 +CCC697D5A821F89F69ACF1017C5462D5B828907191B41C0918A8FF44547B7CEB +0F49B625F790A2147B94EAE381164BBE644A3E70DAE8E1F6C97A75E8425CF6AB +6C8073D8E3116D9B5D06C1992CE93024618A5105E7AF32C6BF525C7B5D4AB280 +5D4103479D66C948EC9D153B2737FFD64F95D300B0CB491D97AEE905F3C62E3D +439936E4C70508DEF021EB918AFBCB4A56E8758E13C9490D86A5B732CCD77373 +4EFF0B8CE6819A7AA5BCC01CA85CFC95719A03098F9CA7AAC88DE8B0C09F015C +46901E5D0A49613F544290560871A1D4FE48D7F6214F5AE1362E5D1EA1508FD0 +E57DD35C0993EC0CC5E7BE4CB79256FFA4B5687CDD69750377E48CD6DC808922 +BC1BC7F14A5C664B36259FF9161669AAF0525FC70C6F856CC22A7A938BCBC318 +D01E132682BCA208FE3B0989D714E5BC01BEA2E3E1AD01FB56F4477172766938 +7023741747CA79AEE51D233B0C82103426121821648D4F96C22F040F40A068C6 +DD24A417D17F46999C9BC648C5AFEDBE3C4157E2EAC85D9997DF585D8F686C2B +3365696E492DB619498ED80DBD495BF52AACA15AFA2C7AF60B5697E3E471B80C +D313AFB321295FC989E819E1970F383C94511737E60C92B92D1720A7AAC6F774 +14C51AA35192A28DD4B2D46736A65DC54B2B25B0996CD01D7B388311B37E6318 +C29731128DF495967AD5E6EB6F1D469B5541A41D4280AE5DA85FF96EB4AF1789 +D7C1DC31D52C087DCE9405062806A0B4E68A075CA2C6CFF60F8720E77AB94BB1 +CF15D4AB943E7150B286C5CF6966B1C3C304F96864958030A625C742158EE151 +49451D17894D4390AFBBB830C7739D4DCDDCEF731712034ED0CAE738647D49C4 +D73584E907CBB7D64E5CCE1A42267689F160E43D8771535D9BDA7702D1981687 +107C015208124B4D759DD00397A0B54C83878FEF897F3BEF278BEEA272CF0C82 +88F57EC3DF160D26746D785AD19F9FF3CAA86BE390898C6B797B3ADF01B0989A +95B0FC905F034C14C5F32AA0C97B7120601C7440EB99D5855A61A7039320DCB3 +CA9E49E5FAE282460118757D841DAD5CF14D34E5D108524170B6C8F2F209C4EF +071D1C930A071D0AFEECA65EAD8826E0E54A349F60B54265C62CC70EAD8AE3DB +B113BE98479072046FFE73BACE222033E2C47C7C749D97E7BC932EF60FAE13D4 +0A208321C365A5104F6638D21176ADB80A3B415C20757104D051D967471F687D +E3E7E344F9CCA96E6C235B52138879D72D33CE3EF4183ADC3173AFF0AFF779C7 +78190DD5AEEBEF54DB6F50226B652A496F6899978747E151E6347834F8177F18 +0F14381A7BDF9FF785DBF90498806CF5350C82B89E4BBBD5A4F3B050E10E121C +E71FC9FC055831EEAB6DDEC8F26D102A9250064EDCAE106D53245BF15EBFF4BF +EBD2DA1099A1F0A1F4B6941DACE2BBBF2A38F6D25C1565B6C95CC94DE6C17E2E +AA539FC845F16712A2CDFD39854C63F6B7E7A89F335CA2DC57ED30B92A0E0A34 +A15B59674766AC84417A9042E9C388A906FEEDD189714A087ECADAA080DD178A +70C9D8A1C1B0C9884D02B692483730FD313C4E64190E6684DA24324CF88A8C16 +C04E949E9ACA502B5D5ABA91803992091869C0697422CDB5203057BD85471518 +B86DEE52FAFEA174D86E3DBA6EF3440E3DA943480C88F0886412F4411D0FE7CD +C2794552597E9CD1107AC4AD756C4CC1BAB6EAD6D38559A233852C3C6735A7F5 +EC6D6D99FD510AA4428918E0AED80E0DAD0BE22EE3EA20A309BC7267899D1396 +79458C5DF3CD1C0848B555D2AA48DDDAABB87EFC2B584C48CA8BC0A91867D9BB +25994B16DD7512B4836A691B03BF5767EA105D68B62D3D81F2440EE269750E58 +8091F08CEE3C62D4131C18D575147A112AE01C93773124DA4E2B74D4EEAEB1F2 +C8B0D863EE815D994070ED9DCBEBBB673B2182F190608AE7D97C309028E7C992 +B14BEE67E749D1A875E79934D23E4BD9A3768497518620388D55C076EC42F6A6 +2EA61F2DDAEAD939E921AAAE37D58CE72AFE3B74A8A02F4A1804551117D2922B +80A2750F0A3D9375361BC7AD2E302267A15C675DC20FD858DE9793A080624F29 +8D9106D26F7F5747FB7944BCFEADEEA4C7605DD473432B4EA58ACD471AE3A4E1 +64E4E35DB9D97E2A374DE22A6A9F8B6D7E2D32A0C603BE0A044283621B3D1F0F +1154CA2149ED42E08F08FD85D2CA5DD02DF68E535A25487BDD98964A6C2064B7 +A057D4186F0169777C3BCBB4E397C22F4196E3F5025EF5D59501FEBAC3C44768 +6DBDF3342857931DDC23BA77C22A318CB13C653086032E880E191BDCAA77124D +7238361A68F663A638D0722BB7DC3A37226FE9C5B1C15E0A32B900A335F93AD0 +98D0F22C9092134E37B336750C48B5C30AC8BE183A154ABE2F304915F8FE256B +0221EB3064620A3F87AECF76FA16A7A1BFC67EFB0D27910977DF3C8B1B93F7EC +5C47C8648197E784C084F332FB505DB3A3FBFE6367534AC18D37CFC9D96814B5 +0B568AA24B823D93D58C38FEC655183AAC309FD07CE32353820B5471E345FC29 +51FA9581A7CFEE964B4219E3837A158FD43C9FA8502A566E64DDCAC0ECA874FA +CFC71A0D442E128423D92340E53A76C9CFB6882BCF76A2AC1EB66DF300F6AEB8 +C9A2A9808EA83ACD248A68DB3F78D6CDD9A507785799714214DA4B60EC547FA8 +2967939DBF9A29B73D319810FADF8C44792E1667596261B6E52339736E7F857D +EFC6C4997298BC8ECA834F8BFA5E3786AE80790C50FB1669230ED454DC81CCA7 +7DF4E5AFC2071127D70476AE9B225166EE9C65842EA63B4B309A907A275000E5 +94E0994A08FC58EF0138B557AE8D96842EB50AEAD3F1FF98F454E011CBF4C2E4 +DD531883C44989669A50AD00BAF10A062BEB4B6DC3F790CAAAD0E68686FF3A50 +1009236F70FC80905D8EA2BDA8D2442A006E2B77D9C40A01A106D8BAFE585D2E +CE2FD94F9A628634CD1F829657939751174E8F43F318C47CB894EADAE6C8ACB7 +2AD554E3085ADB6F3443489F3BD33A56CB4AC8CE9E11FA0C83DE9E133C97F69F +4812256B60954CFFCF3E7F439D126F7DACEF1626D83608DB70079F0B2BFA5DB4 +9E2EABE7D23BBA421A88374E77DC5B6E2648AC9B7B1C3569C826A33AA21F71BF +8A5B0B825DB9E00CFEF59403990D57BE4C48953786B76D55D8B665A15AD69709 +A360AA9D8BFCA8E00DBF9AE1D0A40F0B02A652B2B330C689E61C3C5A7EE81172 +E847414CD43E2277F37BDC832104B29C998785022A693389A9FE86EAEC5CCC4D +09A7B9348C80AD3BDE70E7752E44D30113EFA182DD5E47CB21EEA64D9101C657 +2106899AF37365A796ED255FA7F4EE501D8681FE11F92E64149EF8CE9D23F334 +6E2B1E1A67CE7CFDC535319EB61E5089201708A0F4F449F89534FC7BC340948C +6788F3115AE6B80CB6C1956474D2D292B830DC9F8F67E1FF381CD81D788AE222 +1AF6B548B5C7C496BA711F1F8AC21947D2604ACDAAF0C5A68E587FA2109B11BF +24807B7DB0EE845C13E8F693DF8A4969715443E1FA0090C4BF359F4827067C0C +823676958AF915D6D75C767F01C7ACBF06CDF9E9A27B57FD5C2F133DDB091CAC +2B31E9DB522783B69951F2965AFEFE6F454E9A859664A65AF8D087B203924BCF +E4C45AC959352FFFECE860648C6200DF02D650237BDE22AB1ED127EC09B4F3D1 +234BB3F32ED111B8BD481729F4293135EB333723B7990F8B70A211A3ADD67AB2 +8B5A7D6AA9E9B0EBA08F9F2959D13611FB8F29B749686739380BB59E0A93E99A +0B97B297ED8362D421F3AA230DBAC86D200DB0AD6D5F320D1B23F0A570357646 +94DC98B2973F2EADFC8D2AB5DF1038740AA520B7AF4AFB812575C18EBAAB76B6 +EBDF757E1B8264C87A7180C627070C3B95EA0FA431E8360F0DA8A722F0861C9C +BB7DABF781FCDEC603326ADFD0FA3F788A7C695E50F23848CF85CE410DADD5F1 +D7CEDBB484D009FA9BC4E06108CB63056129815A616BBE98C38E6DA6E587C23E +D0F6496CF0FE5F51ECE5FB21779A44163115D2F05541531EEB124695FC34E359 +8E0BE91219FCDDA56C4FE3BCBF6E8F45505ACF974C6F9EF55DDB391BF5606A61 +725BC73D5FAF324A7DFCFAC9C9C2728CD4370A9CC71F645316ECCD8AAD062EBE +9F0763A7F77ACEC296597E0374545BBFBC538525889D39E9153D8FA7C5945F8B +955BC41CF03F7400E4AE3359818A4C1FA2AE66AF9B77F6AEE16FAF82A469F6B7 +46E679B38AC3897D1AF3CB2E0289802E8B449A1FBB084EC5938185AB229211F3 +6D8A9C36134ADAA0498417E2FACE92E753325E0B23BC6330DF323C6DC3C4C41F +25B077754E4724164566626638525F6F49BBDDBB3E8EAEA9ED1C3AB5F8DE8BEB +9432578C9E334AFB9B3B05E4E11D0C17C4A084BC7903ACB1FCB213622CA5A95B +D6EED267C225E42D372F5AB6D45B23DA02D5141E310A4AF395531CF047673DD5 +69FC7C683F52CDFD0BD9598587E1D66BDEAAA467C512AE2BF24ED472527661E2 +CFE5723B43C46C210CF6E76D0A4FD426258688C5A797F1F6ADCBF6174A61C332 +2009A4AC1E90E598359039CD693DBE122E18F574B96FC97BBBCF0C7020EC446E +FA902325670BD42463490952BC7CAFBEF1074FC1A36271F6C6E29DA363A6335F +6223F16AF2A3ED714A8BAA0EC08998F41BC8DFDC7B0007F04642CC489BEB0139 +0A78094BA9D580810CAC4D4FEACE3B67D1F957B180A481BC62BD7836A708A336 +CCCC06B85F07F7CD13104E30FB110F749A966554CF8E507D10572B4BFC0E24AB +AD69A17D1468C4F4EA8E96ACF86192EF402E4F59EF145E0C8B187709E9C64EA9 +C52F7CF2E7CD9F43170430CF6A76CD422648542920F90917C1698803282D5AB5 +5C39F06597D76D52CEB7AFEDBE9C91C90274EE106BC54DEFF89B7E870ABF946B +0C87A133D0CEE117C00ACD3BBD72474D14F14D2A6AAC857254CB409EACDEB6D0 +F22AF9B820FCE6A5DE6DE866CE8BFCB17C1E3C452CA7912BF25D07020E447AE8 +9565BADB3EB531A704AECE4A80024BEC8920543773349987E9F6240514EED4B4 +8D78A234318102A2AF9D6C45D9BFB27AAE43D5ED91483CD1284A6712DF124855 +B64C5E3FF7DDB5DA6735A0C765AE823BA1F14749B6022624EC3170435DD20CBC +018936484A3F93D5BF136281E07A5352F9F1D5772DB0DCEFB57EDFF0DFF1A92E +22D3B7C7DF81B7F9BD970CAEAFE9C01771C4E2DCFF8B97FBF80788DE47C77707 +5F2D211034B5150F0343DD875E6ABAAB8E68999B59738A3999C440EFB67BD76D +90085D1D4254E63EF500D66E4177A18EB2C74B1BC53EBAA89892F680F33F3EC1 +AF438446E2E38CC40F3BD253BE7E37F00F4F6132A5AD13F09A9A19C801694078 +0189410E617ED04990AC4B4AB626BD9A10599193E3B7C7A3BE9AB3DA5F9466A4 +1BC68B6DC033EA0123D1D1DBDD8CD5C86B4C0539E1D79DCF67653DC84C3A8C89 +D250A78AAE935811AFE6F3FBE2E5E452E430E16A20DC563CA577C898E68F2A84 +ABF46FDDA19186DD43A1DFA24C92FC62ABEA7CD85BD68D64CFD1A0C29DBF88B4 +D25D8C0F2A6FBC7A33C4DBFD91D97918748A9E41637820C7CB4FD427825B7FB3 +44DC759B24D98AD1565AC930B89E81D23128723BAB5BE792A6C9112787225241 +575015D00D0691CFC7E29EF61F931599B88E165E8EE75DBEFF5B1A8D4740496E +9F85ED6820722C274DA65F73AED95051BD9FE38AFDE4FBF425FEB6ED07C8A976 +F32A9BC9850E0C7069AF74BFBD5A78765AAB81037075B4CC6F09A95013F4B75E +A86D41C755425B4B00776EAD7F5872622D8BA5F5A2C5187DC8F36F03DF03B168 +6AA1AEBEA0702437D8E546888A00D42EC5D6085945E31BB14AD594BD9BCF97D0 +4B99A50C128B77C75D87CE0BE0C73FF37F2DAD7A5B5A361697627255E6E5797C +FE1E38C38E4359B97D594EBC15E0E10F17F20156E7DC9E33DD8BF8EB016CC9D5 +F496FBDE6E16F0FC9E5EDCF67A39EEF57345C3E6A4E04DFB7EE6AE6E54EBFCEB +1C53ACE652AAFE3425ECBB3E42EBBD51097E06D1C2ACAF97ABF4D875865429B2 +2D9A1E61267AF7E31018C46EAD1839A45032BD9746DA458A2893613BC41D0BEF +F6338BEF85A69A8683E5B3C3D83DC5F651011934745C042E3DDA4DFB7B393C4B +9002B5721DFED701278E9CDEEC9F7B4EF1D326CCEC149E68FEA5D7468F7A091C +00A3FF3AD5446B14FB635771A5138FF8C2B02FE98180C19595BFEFD29B8F1A0E +51CB37E46E06413ACA5D70EA7F4F0039A0F9A4A20BCBE335C82317F6B1CE4E8C +7B06513CBA59EC62CB7563CB4B29ED6BC20BEC14F6D4C192E0261C8A2CFD0968 +BCC64408B19F39F69CBAD5D6E117BFD8470DE959BAA369613057DB1BA3441E27 +EEC436544FCD8B6C50D24548886892C86EA61CD573FCA53F0CFA97D799C25418 +3EBC2302D0B43DC80E08F68C01934958A810C76DB2E23B13FC0BC6CBE37AE842 +8F2452EFE0AD6E97620A070BD93CB99F13E8EA78DA56728314E62FEDABC6A6EA +491EC96A8256AF6C7E8FFA6A04DD6CAF1DB9A45AEF196342D690863F54B3196A +11CB3BD65F022BBB8DD1356F768AD0FBEB817DBA77D2BA4FADD43C8C7682DAFD +EB331954CA9668AACCAAB539AF7BB1F94B6C9C430021D1DF43432F03DAC805B5 +EDD2279D4BB979130BB5B44FC22191C59A849D0DFBA2847D76DEA80E88AC203E +84A8657C760AFCE2E070E16E3AC53B9D2F0AE040AAF7435051B0B36795BA0ABD +AC192D83908FFB421CB493A64F1C3FE99DB9F0B41B5AADAC1D6E0482D6579670 +F5154DCFA00E4E45991B6CB9FBCE7F6A470807193224CE848C379F508C5BF898 +4CA713E40BF4EF1D3EBDE3D1118D838516CC5FA9B3BB84D22408404692E04873 +C7482267713954828DE7C91EA03BACDBD2E53780E260601FD03CB08201C62BBB +B95B268EE00F702907B2F210776046900F80857CF5AB73029584954452E1CFD8 +6AA384D3238AF280DBCC617B8144DE8DF0DB36C18C54CDFB81800ED65DD9EC4B +4ABF20562FE068BEAC88A21059084A3189328AD5CF5AC9015555C896D0D2D096 +B734CE37CAF2ABFCA0504F24869D0004F6976C73D8369DADF0077457A374E601 +7D8120F6918B57F5A3ED0E142835A8FC95CE31A30073D5AF29AECD010D2C80BD +737FFEA417B9CA710CC39B759BFC9129B11544D222C31B165027AA9A981944D8 +E429D11D540538AD0E26B7D6D714A770F8FBB42B969BA55953DE4DC7393051CB +17F74547E2599B43AB9CC178BF0560BD5EF585A67342146D32FBA4B477B6F403 +C97C8CC1DC04B16A21E0CCFEAD2845E4A7943C34378B80201C6033CC8CCFEAF1 +8026EB0AA7F77FC2165E6A2F99BCC0D7D65C4566BFC56B9A1D35B964D6DFCB6F +A2E9FE35915C8AD53861F593589ACB337CAD96DAB5A00F0BF52B7940FCDD915D +03A57E81EAA243C525F5A99B2C9325A65B63937ACE78801D22979306C3927400 +30B3682657443F972DAE9702D1D1709B71622ABEEDEC3EFF4FC3A82B9EC94C5E +6FCD4086A02F8B4A58E00B4B28F054E203734082BD4A7E039CF0403836E439AE +652962FF9907AFBA6C7AC441CD769AC304E243AEE7DBC219C5406320F6D20E6B +B1FFAC7CA30E77A419AD834DDB087C33422C2B1E689794D09CE6FC29204A14F4 +6047A79CBFC04AFD3D68F96C0B8C3A202A304D697FE178F0EDCB34F9B0FE3BB9 +61C2B07A7EE35E8F18071D61F6A98BE7CC573D0135FF9A53560159BBE16F26EB +B171D725905D4A0671FB8BEEBA009B47CA9633362FC0C4553509AAAB43F137C5 +852DCEB47074F71DD6345634065E358CE4EBE88111970F1190CE776EE7709729 +548AF51C38735F6F63BB83E9D91D5A5D2E1F89C7BC8785711452AAC43E77498F +A74D91A1EAA3F29114E49EEABB681B56C5456541F4342D607C477983380FE29B +9A08A61D371950992F17F20D40F8169E3CFB99AE231C40EA020C6C253FAC30C2 +04AAAF5D992E9458877380510AFB91851B289DC03AFA363EC338E21ED01D2186 +C706EAD057ACB2D47CDA1FBDEF9AAF93841C5BAD0668C10541D7B41EB3CB214F +4F214D7ECDD4606A4035795AE25C58C9692845F535762AC3403E2A0CDFE79D27 +B58887D2688C7694D4D271EBE925801E7C1B27C18C8E0BBA3E6F999484033991 +B0F021F1A60419F06CA0758F7C3321D20754888062DB453FC09F3033DAC6BF0D +341BA60AF9A8608E7BDA2DEAE73F83A5DD9FC35BADBEBC2E0C6AB18CBB05FC06 +7B967D6263051E960498B63BEA972BDEEB89650EFA809C88644E8E00ED119DAC +5AD530C519658A82AE9E17EEDE4B91FA83AA1A925F6C7E65119F8A397F11F50B +681E3A69AF664B9B6076E4A9033C3F391BC110289DB31DF9F326826F480B9F4A +D0147924421F1B5528F463E5D97FD84B06C9CC9A35EC2DAFEB9FE70C86C9B843 +6C60F79CA7F7A61B2E58B7C15752AFA82BF0F19F4EB7276D17109D975206FAD3 +A02CB0FE17FAB4AA9F8A649C84F1EE19E2F5026D2CB3847533D7ACA488D5A531 +3C95BC346E9C249E34A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSS10 +%!PS-AdobeFont-1.0: CMSS10 003.002 +%%Title: CMSS10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSS10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSS10 known{/CMSS10 findfont dup/UniqueID known{dup +/UniqueID get 5000803 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSS10 def +/FontBBox {-61 -250 999 759 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSS10.) readonly def +/FullName (CMSS10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 40 /parenleft put +dup 41 /parenright put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 +7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 +DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 +511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 +1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD +028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 +1319147A4A219ECB92D0D9F6228B51A97C295470093CA270C4488BB4EB864B48 +63941B9739638D2E6F3CC778582B46AEB4E466D89D1C211225274356A4BC90F3 +274C6AA56E200249B7D0949A3FD4185DCB3E5286910EFD7CA72D5D8E8052C96F +388D12094B87D3705CE64459558CF024667C0FE96CBB32B0BC9E51037D7BD62B +E4B05FF99384E71D78441A79B0B1DBA1CAE02434A9FAE46596FB86B873B1670D +AE0BAF516445A0DDC127F8FF3ADA0B10EC30A9CC1F7E9248828B5E8AB46C3FE4 +154B80A54128A08777F5F9B8C519C7E3B632B3476F007FA156E9F39FBE57638B +4214CD2BA79BA9DDA0F4C073AED814ABCCC2F7906C57A872C00E67FF03AC1200 +29DAB92376422FA21C67CA98BCEB8C431CA2D3EDDC16972F84BF6DB2F705BAB5 +CAB39C82D139FB1304B9E7BF1F6FF447596081D5690B1519E468D6BE49C329C5 +C9C809023EDEB9DCE4A6D52A8049E0CC134E8B41BFC6558CFCAD3D9D2773EA16 +131567AE6231B3235869767A1E7C1FA6C8D6FC1B276CBB1CAD14D376188C9682 +302836A9290E587D4225EB8BB1DBA2C4580A81FACFDA197174FE948CE757C575 +F23070FD84DE121955D7D9307BF986C5E739FFFB6CB76822C341FBD9FC2E3378 +AC9332B40C07D5B8745D74E30F1D719EAFAEDBF5FBC40D0546F69A66072D8A49 +28D2CC2E76B9B1EFD191E0BC7510C2C8761BD92EFCFDAC263342A01398A56D18 +121A591FF5CD4AD8B25699A7897E60BA940336BC17B9EC9F97C2464D031F958A +A3548D0C97C50C580B6EEFD0FE8330EE2BB0D2E7FD1DAE33448953544A4B1C5D +8EB57798D0ED4B22909FEA78ECDBC4D8A124DA05B9999242D68681017285A0C7 +69041C1F79442279FBE328733EA0A6694D68BA89739FDB9297BE0CF1808C07F7 +BBF6F1538DFE084EC8C0EC24D883F6CC08A51DFEA23EE920F44BA55FFF58E960 +C7BEE551FCD2D5814DE7E3F835608073C2CB80EC57100CFD484C837881674E92 +B217F4D11165427DACCC29C129005874C05CDE5FBB2D912368EA2B98C45AEDD8 +8A0D2493F60EF36809C8C6EBBC7856F6656E8D398BCB29DAACD4F7D4300A0B01 +161CEF51195D2C58DDFBCAFC1C03F49304ADF02789889826F1E20BCC14827565 +F2A45CA57DCC61B52E33638A0C6C5A59B145E82B82571DF1806EC40FC0E8634E +A34A791B1325571E19F3AC2EF6FE68A14B0ABEF7EBE0EDA3942E85E5AE967A14 +0C5AEBFF2A36DCA8866700CB7082D2ABE470864C44AEE1F6D180D511304C8674 +D02FAB12A7079ABF96E1CA3CDF9D75532123E87663B1D524265AEF63EB5C2169 +B67A651A101E1C7EDB008D3DB06DB1FC1A81B41B291D6C4A58FB57989FFCA434 +DA84B3914D1D80B17AA3A55A70BBC06C49DD5F7DDD03FEB0055088558FA192A5 +261477899857CF598DB740E82D035E84CF17B33048CFED2DCBEBC2B75CCAEBEA +B6C5AA1C6978FBB36ED98D9047028360ED430A0AA69AC85A8F83825EA649E1B2 +64B260197B06A24A1DD969CEEEE136FB046D713D0630B246BD41CA285F076038 +F7F8431913BB9A3E70311844D4C22AA446E3CA217A9DFD75A898997130269B29 +AD4AB7D9662856E677FB2DAED7078639CF31C6E6637C74DE2B5D0ACB88BD61F3 +CE3C5D56D3D4B3EC1ACB33EACBE05E53A133EBFE93CE6A0CBC8F24BDC5B31BBF +5B3E55D6B40B1CED389076014667E28BBBD60145A06BDECEE8011A2C6F06D091 +73767A8045CEF2A110B614149FEE783A2351FB2938A9F73CA406538EAD82ACC5 +A3DFD3DE00221E1B4EA977AF8C89661357FF7D2F1FCEAD6CFC9D6AD81F95100D +EA1F328249AD84AE849220E6593D45015B4D7C9527F3063E9F6DB6E572092A1F +1F460696227D5F0FA5A5484B1F0D8B4A35066451663BE448D924DBBFD388B6D6 +D7CFC87C9E75B7CF79A4C9207E29E0BAAAD7FDF529B860F7731EA978E335334C +13CB2F0A4250F5957B44CAA0674AE8356F586A24FD137103973B9A1FC31090C7 +C84DC5D380404BCDF3FE20C6F74FFDD8BD1DE845E99DC6FE09931F003834ECC8 +08C5D962070B6C44F901A787CCEF048A2C584A2285506B4D4E82B1BF130E2220 +B6C8B3240A4CBBCE16AD3676B23A50B75F82CD88D1B8F21D30A12716426112B3 +23DFDE5A348DC9DCCCE5BB5DB5433A5AC125DE1229FFAAE0D8319B2929986EEA +56A93BA1FBDBE617F30852A3DC8C712DF674169C6D656F75E252187A085B2788 +2467CC4DB08D48EE6A98C61BC55E6EFB1938FAA718802B7587B94C8F1477E9BB +DCF6E02B5E67FE3AD9D87C321CD9BC0CCD36B9C4BC601E6BD552EAB8E1C940CE +3A22F3C2501C3C939CB4F17CE97566F0A04602D2A22A05CECDF4A49CAFD6332D +5870E1F31AAA5F86867F71610CDB83E473B9D20BA00D8986D7148E0EED03865D +9622864B52B09D12E0C5FCDD023D29D5AB1CACFA92B6FC14FC84E95F407861D5 +2BEE3301AF399FD7ED04DFDE6679A345A282E7FC08D47E3FC8969D3B00ACD7B7 +F8769647D6D4F4106340EF739583374D023C2702C48FAC1B643B5897D2D7DBCB +73257712A0FDEEEB98A021D218CDDEBBA34687E23C4828D7F96D1ADDFAED7EA5 +B279322E6D55FB486AD8F3A8E7B2C67915564FE56F0C9277A06B29C47FB7D007 +11AFDDB3FC1B173B4E449CC6B198041CCA0624D81B4840FE5B63BE72157AC6E7 +03E5E95D2E2CE2E40BCE8044A8F2AA45F855484A891B9F0F8F70188AC66A8DEE +F4D656CBE216E6D9AC33BA8DD0685D480833E1226784469A221D9FA3CA600AC7 +5574B5226649A9C48CCB43339942FC9010F86BAA2D181AEB487A92A96BF2EDF1 +60F3B93FDFF4137A25A8AEC5ADF8613019CDB103DC4367EF3D8AEB4FED0E6BF7 +622AE0CD3CAA0321D26CA4280CFB60D08D9560AB8AA5698231171B881BE9A27F +BDCF3162134126212C523738D221AA05E31CEE73D9D40F73C450B6AE2C1E70D5 +C37162BDF55943069923A290A6C720042566E55A21CD81C460818883AB016C16 +8FCCD1255A66977DC1C110261D7642199D466DD3D2493A2D47694F842241C474 +1752B00DA03E69CD16A8A14BEB8A431A315D19A39BA978E46EB1189089FEF647 +F9DBB58AAE6B3FBD475E4DCAD241A051DD100ABE81D40ADF18A4C50F53BF749F +D6F7C8E02A5665B4AD18DDAE79096DD447F8BD32C68F9F97F05E0071D9E9AFEE +257B96D48ABD9920418E17C8F027E9E975E4A08DFB1988E7104CBBC1CAF356EA +7750AA7110BE116AF1BA69A94776E4356573B38472A8A1292C63701543B0F315 +611A0E0595B30424A1137478BA6F990AC7C3AB4DB69E75C222B617F373C521D4 +246E954E9857AF59D1E6C36412B643733CF5E1C90389EF0E5E0DA55D3AD12E97 +E7630C315F72A03CAF22E0ACE3AAAFC1D496CF4E5ABC49C2DD5E264BE7EB2698 +AFF36089B5DD2C53DB1C1FCFBE1E89D41A95DDD278CEB29DC85FD1DB8B83CAB1 +EB37C531E9BB8466ED6B8B60258D3C355626CDA43A32834DC89DFB11E5FC6D68 +0F78CFA871113DB81A1690250A6F842ADA15734CB6DF7C6ACED6D8D586BC4E1A +94EF3052FB0F8B9454390B882CBB6E135AF1F9C777AC362C2A758C3A98117120 +73C6E2FAFB580716D4B2889A4331CC658AAE996245685B973D9C184541385680 +AEC2956107DAB00230FB39BE98D3CA898D917E5F2088F26CBA4F8B5B115B6443 +8753331233B10852702FC26D9DD4C990C13CE4D0DCEA23D62A826A4B4FD16070 +5F3638C0A50A3373A33FCAA6F3644975AFD0560EE5F2D1CDF08820373468E4FE +6679A229D6955CFDF7ACAA92A87E6D8571AD18CF59F84F88A674B2946FF20A28 +B9798EAA22442415EB46B9498DDC0F4BA6ADD347AB43E9293CAABEAE80127378 +129D5DC69F6DFFBDAFA5D65580239E8EDF6833D0DE6DF75F0FD090A83CE0974B +AC947BABBD1B1C7194DDAEA37B0CAB477ABF9433FCE0243C8D308409427D1DCB +8EE4FC36C7E5CEE104904B520B3F6E677A5B92F694BDBC2C799991667E0EC14C +B95EAE7DE1854BF4542F05B4AF401CF67FC3E46EA5A0DC362F3CF177B1796DA6 +753AA803E724D1721DDD1BCB0C12CE0859E172D2A370C3697286F80D9E138AFD +A0EE016805F847BD30D11D8B891E54C77AB51A7CABF76BB14B06153C7F811FE4 +93FC4B7CF161051A458EDF767DF94F487DB939A2740B4242BFEE234F75084DDE +207E84533004B933D43C712F0C71DA4A00FFD6D721EBC93AFDC4200E3B8DE433 +3ED3E1DB799BAA27548ADC853AFF5D9D6BD92D644E3CF394789C99D9DC054A26 +7770AF5DC5BD6563929AE11BE341F036584DD573D3F43D9D975201EF77BEEF80 +D1EEDD1D4AD5D4D4DAF6D5B9D4C1736CB111D6FC74C236779C0ADA430323A825 +09EA8D0CB1772220AF28B93098BDB36913159208D1B2D7ED45808BF7B686419C +5C0E3DAB5BC9830FDF3B494D624EE8068BF6F5212BD69EF466B9A213047BD105 +B848F056DC544A8CE66C546B1A4DCB4BA29CF0EB4DCD9C2452F22172AFF33B29 +E97E12D8F0D312B03BD9E5377BF0C81D884F1E79DB66E8144F106DFD2579AD26 +C693C5B68F3AC46BF0D6281032D4D4BAEB2243151AB1AC0BDA2ACDDD4D590C90 +F29B335DF8F57DC593DCC081FB56924028E3161AC4865B49D1B0F63F5EE866D9 +7A71171C09B09A44B0E32F03494D9EA63F3C89F5E772BE25A6557F119299E989 +99BA041694ED805AA4F3BBDF00D88171C9D43A9085A287A36A1F0F9386F2A98A +96815CA51F06E1CDF20B757983C5FDF4003F5438232159F325C6335B734FD982 +1423BA77D0EFD044381AFBD0704E3DE95D23A70E2428E9AA355A9A8A25C6C74B +48488C14DEC93A766E112D74C83576ED355F17A809E8D3F9C65C4E3E14EF484F +4658DFB57597E2A4461D8044E95844391C1275D63F282B37888C842A5151937A +45007547263D70195ACC018A373D498B88C5A028BC66ED96A343EEE74D61EEB3 +D9472B6A549CEB8699F4B35154A0E2ED22867E4F9E4A76311EB2C9F9078FBA81 +838EA49C2966BA64C165434DA3093206B70186BE80600B891D9979F730FDC794 +5DD6D8B2090CC67A634B719F441092A10C447A86ADB78DAE45823ECED5FCEADA +ECA52E363D913D9EFC0ED98A5A1F823DDA3350EE27F09C14E4C7298CC0FB6200 +DEBC640C68C82D70AFB7A7BA668F1D7948686206884736CD03D9F6E6CF9702BF +E3C932CEF3CE07FBBFCEC0476EA6E8D5D4C5C6450C8FB236B89BB82D51886240 +5BA7462F50A88F69228DCBDF26B7250E90B3DF8E94ACA1CADD9EFB5C73EF9DD5 +46052314D445CC92512BA231F79A09A2F0D91976B160B8C9BA055DA4AAC1300D +491193EC66A6DE12BE01EEEDBC3A2291DA1F27AB76596A236B75E19FC5F1FB6A +DA1AD835CA08B6CD03B97B4CA1BFCBDD2500BB09F1A1B0438E4A759370EFA318 +F062BA9F3D352572CE232E6FBADDAA5363807D0DC5320B807FE5485C8CB09B6B +0BED9F5B1300FF370252DEBAC9DB25CE2EC494E8EEA45FC6604B3C104E81B287 +EDD49F3D7430EC9176A16B4FCEC5DF68DCC11ADF90BD5337E2E4B59BEFAC8298 +E5ED2C7FC5928635420FB1955251932713236DCE28012C86F63D12AF1DB634D0 +0B8CB8992B8723548177BD6822A808FF221A9E38B0DCCBC1F3430A9BAEDA89CD +ACEBBDD8CCA5E17F1CC37E35A01E058BAAAB6BE7124314DA19962BADB74EE73D +8FB13FF6AFB6FFF97926CA045B62B98BAA753AB0FC78B881D3FAFF9EE2FE918C +8EDBEF87637F1530E3E13AC090FF81F4136E08D5F3734327E643CDF621278741 +A17AEBC56E21217888A6C8B5ED4269731910E7E25693CFBDD4EB4A32698F2447 +4C45D73E810B627D8719E4E34D8FF378F9B68BFB149AC67B3B1E55F20D097FC1 +AF74D46F5A3923C63DFEBFCA210F6B257F5FF3F2AC34CE41C15C9977634E473C +2235295C05C3DF6B3009C7854BF11CC87471CBE085793AF9C5D05C5479B9E780 +14A5A6F3F6DDE5A18243DA15732CCF26ADE40C566DBC3C62B71D46DE87A12C6A +647CAC923254E2E74AF882DBD5C9E108A9160393C5CD12566AF7C824EFEAC56E +6F05B92C73A76824C5ED1735BCBAC61B98D509250C854CF1500C212F574D18D6 +4426B8510FE9785B814A70E75C9234D42483E736D0689D3561E8EE5650F33A36 +D50127589401D267BA6442E8616E2CDB1F6691D3FC4A2A377E5E154972E890DD +60CB463E9EA9A6EA61087DF452FA5646F69BE879337EAA0F5DA4438FF0365627 +4E3B16851C2F08E976FDA27AF451CCEFED00376FC3D6E0C160F0BC19544DE289 +BECEEF9A067FD71D54DA3A4F73F06E2F522BA07551296214DDA47B1BBB1212E0 +1100ACB5F65FD30C655A3402C83058F8ECFE48FA60B6A3DC86C4996414130194 +6676EC7F37454023AB53E9D9EE60249ABF6953E76DCE3123DD268BBD492412BE +65D7C3E5A5E483C381182A8F19B506F0AF6DCD55532B89852D1D96021B22E9DF +D9D072BD7DD4450577E658B433A84F92752B260AFA2EC4A118747CBFE36AB7D7 +6D5DD96A119AA1BDD0FDCBC3AFDAE5FF72713EB46759A06CD09B5CFABCDAB0E9 +85599506AC07AA525978AB157496163AAB387F079EC9FA1F9E91B9C2FBCDC9EC +7027D77016760539AC03F1C1DB242D28D6EE946C42DD2262D82ED48C3A839853 +BA977046F0EF373AFF884AC3112D2FB319421C3165DFA5710BFB9AB9595A10F4 +9D05704B9E22137CF27F4B2DA9CEF6D8801D5F792969B2E58FB539B8038DF440 +6DE20C0313A7BCD16F279290AD6859B0E657CC3041C7928CAE35B9D3A681F2A3 +2D40F8EDAF1127E754276556C95E1282514B6EB6E43FF4F0FAFF28C715E3F39A +374415B62C1F5F8E31E006D6ABC736057910A3729AC60360CEE1B2C8D9F77336 +39CAC45329A372205FD551B9E9EA5082411207473D9D90E76136AA70180172E6 +AF6EF3EF6B38B1906B904BE9BD5251EF067738840C28877659B649C6C4CA328F +1BEF8A9CEC2CB062702F58CC0B8D2D097FBC278F9FD894E10ACE1DEC4530CBF8 +E4E467B6DB9C596DF0C3D43E6AD70F30B733EEE692C2EBD68756D0C16E1F00B6 +AD011B5DA073A769B53C2DA2E7C9B7ADC6F551BF4DF4C39C66443692C3DC62CD +B1E094013F364D04BE2FBFCD1C7B2836180E9022E0434421FFA4317A50096684 +CF0B8740EF680F27F4A84AAF2AA92C64883BAF57BDC60C6467A8D4E09E6316FF +9BE73053045E5F3586DA3BD1298DC15D751913FB1E72EF80047F6B33591B97D3 +DFAD34EB224D64EF60F5B4ACC6EB42E1BE0CB2812FF2F3C264AD2E44F5EBA441 +670CA0A60E73176ACDC4E42E74F8F489C73481EB5D46A61FDA1C0FF9F8844DBD +99CECAFE2A72833E4522981FA13713AAFAF8F121E60FAA6F379B2C8874CFF23B +8FECE70654E5855E525A403700A96CF7F8111BF2B58386E29640D82F1DD86900 +E0E203F3ED554209CBDA2A61A5641D4B39D98C5C43D4575648D06BB82B6C4D4A +F043EC61B17C208CE8B4F43A7BCBBE588A3D13A183D79A47404223037FCFA4F1 +DD237344E589F161BB9BBF3FAD2E28749350DB9A74C09E894BBCA85B82E704E2 +99788B24642A7D0F0FD96601CF1AE4819EBECAB89824A0DC1C03BA4B546ED36E +DABC8D49CFAA53D2A9A5DD6B3431E364C99ED0323513476CDCEE49BC413E50BF +51EB93563DC03B62F84C5F96ED713F288D109C79179AEC41424822772032035A +40E84014F5BF40948F05E8562C9CA9DDD71F89021BE238E74781A92D64E5F9E5 +AD6C0D954C6686C714BF189E78EE47F1530CDB8376E52631A1A26E3021FAB977 +DBF01167266AD68A779C0180E034A90CB77B86747395BE885E484BE4028B4093 +8BE191D58D0BF85308C72E6384292A2E1CD06130A091F8AF9DC6C3E12B1E4BA2 +BB2C37AB4AAFC0CCC7964C06B9EC1C7E3BDCB6BA265288D9C8625EBA35BD2A49 +BC50472D7AE262237FF1EA8D9DEA3C0DBCF7C3B2DF5AFB1F31E46B48E096517A +0CEDD60F43DDB684BC6E4C3F6F3D70BD58AAB5052936EC4ED7140EDE795223D0 +4E3B95161D16B0402EB45FE97ADAFA0433FCAF55E22BD7E4AD2030D9DC86F55A +8D7EA00901EB1351EE8A0F1BFE75CE46DA4165D78043F8F0741D4D9DE0CCA00E +5F7D89A849AD0F0CEBBCB948613028CFC39617FE9184753372C375A9896F5F1C +7E24255FD49D2109CFF9ADD9A118CA47CF58975A9CD3A960A8A08A078B98A50E +4DE619C8B2D3E15938C879D785539445AC468AABD6A6576AF0E8ED368A9350EC +717B7D3BB55AF58941B47FF639CA2946028CDDFDB84FF0060D330DCDEDF13BE1 +FB1F743317C15C7A9F34408F5FF7CD9745217D9B809DACDDF7DAF9D821C06B37 +25738F0D20F4A86A079EDF71583A9640173B3EC529B98899601F0EBDFE45BEF0 + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTT10 +%!PS-AdobeFont-1.0: CMTT10 003.002 +%%Title: CMTT10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTT10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup +/UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTT10 def +/FontBBox {-4 -233 537 696 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT10.) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 36 /dollar put +dup 37 /percent put +dup 38 /ampersand put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 43 /plus put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 58 /colon put +dup 59 /semicolon put +dup 60 /less put +dup 61 /equal put +dup 62 /greater put +dup 63 /question put +dup 65 /A put +dup 66 /B put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 76 /L put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 89 /Y put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 94 /asciicircum put +dup 95 /underscore put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /braceleft put +dup 124 /bar put +dup 125 /braceright put +dup 126 /asciitilde put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3 +7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260 +6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89 +14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0 +0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397 +3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4 +BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F +D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0 +FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB +556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F +8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E +F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB +B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673 +125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787 +A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77 +4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC +56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178 +E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F +15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385 +2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9 +05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390 +6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD +04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728 +C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4 +70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA +4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A +A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473 +62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364 +240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D +69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2 +ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84 +121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4 +0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB +D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A +0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157 +D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C +550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844 +CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A +9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4 +FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F +7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06 +E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6 +50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A +2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05 +9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2 +44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE +49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9 +385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091 +8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011 +6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C +EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0 +E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB +C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE +484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29 +4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0 +0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C +6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F +5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C +1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3 +909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8 +BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506 +CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0 +2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0 +CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08 +EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811 +0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6 +9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A +D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4 +21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0 +7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F +52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A +FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD +AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7 +F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429 +067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E +E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431 +C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937 +5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B +0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD +CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC +2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD +E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714 +56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957 +F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F +E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F +0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D +67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046 +EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7 +CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8 +9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5 +9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0 +C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861 +327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203 +F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC +60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD +A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4 +B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5 +0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F +1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1 +DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D +55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C +7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E +75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5 +E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149 +8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E +F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB +8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F +D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914 +54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0 +49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9 +CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0 +34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276 +1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA +6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A +DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4 +E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD +4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD +2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC +ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934 +3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE +97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C +FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570 +A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF +639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4 +D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615 +E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2 +1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E +A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3 +F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780 +5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5 +4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50 +664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844 +4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8 +35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04 +1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6 +01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A +5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82 +2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0 +DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C +BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507 +39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1 +C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665 +99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481 +7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE +D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8 +6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184 +5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38 +6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B +F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81 +E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9 +39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81 +7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5 +ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77 +6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882 +2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230 +1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41 +06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE +5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A +288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E +7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F +759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF +E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E +03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A +6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859 +314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266 +74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D +906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36 +673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E +A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901 +931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B +CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390 +E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1 +4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136 +2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE +F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B +E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE +E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE +251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71 +7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6 +46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C +E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33 +DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A27D3813 +F871C07E725D4518013D9A84CEC96782541E5580E33C2EBCDB18F08EB4655A46 +507A8526DB26C854928B81FD502B0CCE4A68943C12078F57C10F4E85FBEE1025 +46D925B8B3B447D4920410FEEB9844FABE985F9228FDD9F26BDA3B469D678F01 +BBD601F46245B0AEF9E844A38F0A186733A8523992CBBF6DFDED8BDE4E6DDEE1 +AA0EE78B943B79CBA4AE311FF4612252D9EEC7DDF88BA8080801F9BC7611DCF9 +D6AA4A8651177CB85010D420CDFB43CD103ED7A1B9C2E885C88F882E29F4C301 +4750C3EFA20150F9AF0A5BCC8DD9C7DD53434855ACC1FF84087D95BE7A2FC2AA +446A89DCD272268178C02DB29FED2749139BF0A51A5A9E0B6B8322558086D62E +BF48C20DCB99FD2BAE6853877991059EA432234EA3DBBEAA7A63B0279661F69F +181917D92AA634ED55BF9736395C609B315ACC4F49566EDF37EE388BB8B5D9A7 +E227219DE137AA06BBBB2F2530EB0082E730BA30DF67E83E8E3E6D47CC0D6183 +D68AFDFDB89A8F7F6B8C3381BF4903576CC2D058CF656F221C153D7EC7C6CFDE +3487F61D3712FACEC12BBDA5C084F01CD52E27B685B7ADDB34D477C47BDA3D6A +F5F94FEEE22ED1CF93F2A4576F53D5E9AB73CAB5CFBE85DD6F4364A8CE71574F +2D6AC3F8AD690AEC0AAC2AAF8CFDEE51FE47B56661DF84FCD8AC27A0C591A39E +769DF23C1D077B7C905CE9FB31C7594CB1E63CD82E119CE68AB58F6B8E3E370C +11D91D32ABD0DFEDAAD93A07401045F38198465E1D503704FDAB902347ABC936 +1F1DEB3601A993B6641E4442154962DDE3812AA8D948B112C9C8C51A5BBDCE0F +31E244844D0C77BD0F206C7399B4687F352DBA807E1D9C5439A9944E0B3949BA +B173C40D43F4A0B97AA73A07B3F016580D2C2DF39EA392F678313B1FA589C0DD +6CAEB67B5E78334A41156A070819698E8D576F5177868FA05D4E66AC6F313967 +C251958A426B160B5645120A7F2E33986B79CD3ABDE16A8320A355A7F18C2FF3 +60AC078C70EE8123060EB9672A7D112A7C1F916DCBBEFBCA48B59B4B497B2992 +CC43893291BD454ACC071A68E6D7664916857E6EA7C34345C13693EC4D94B08F +0EC526563979CAD433B998DC5A0D835C862CBD360AF49D068D07AB1709E1A3FA +4C1F8EEE38FE96A5EE6334C12E55B24E5CA3AD0E78C5B3939A3C69553212C069 +67548E8039596E5C73650E32147ECE269066DD3A4E4CA042DBC2011D60A378DC +45C605A5D6704780155DE769AC843B3C717D41D9E319BE62523BA58583CEBA3F +8AD278952CEC5236F3CDD374766075BA04259A2C9F2539DDAE7F0D4356AD67DE +0786B29ACA9DD362B55E72BF69173DB426EBC75F6E5BA686EB82952C20838199 +8E5BC15A79E2F0F5F998DA7269560B6F65BE4FFEC8131FC9EFA692B60FDA916C +DAA9CEA8793D1AD57558D4B424E591024738132535D310D2121838FF3ADC091B +4D1BA849B4054206AF41262CA2110DC795D988AFBD1B9725D673444D9B5D9A3F +C0F865201B6D797A0575DFAB5C51E5FFC0F52735EE1B21B355C10CEBB2B62D72 +96AE789D63C6413BA44FCBB2C384624038186B76DBFE94A9E85540BAE8B3FD40 +09BAC6A615BC1B497804F55065E3C18BE77DB8563B1730D5CEF7428A9BE8C118 +DE8B1B9EDBF53BA3288B4985B1EF68F2EAA7AF9A2543CC66D3CD11925EB08E2F +2E9293A5AC0245FB4B4704B5C61C49276F5E1F4560A4C0615D26FB097A5D0746 +42239DE3560B0787A347FA3516D012A2C205A3CA4074893F360FD2D6A980E6E4 +F77B93A92506F3F852DB888567C1C1717D06FAE23DC20555C129B998666F0D47 +6985495B8E94E4F3A3A788FC6EA5EA0BCDAC1F5D36B3E0459DF6D683EAA9F7ED +484EB781E72A5B67823F69FA949C74BD03A6AC015ED3C872108B6D2771414119 +6AF2774FCABCE014D681EE6F599F2B675210E8A89132B5FC9701B1802919C192 +242F75BA14EACE61BCE6EC7A980DB15B33EE760A8C80ABA4CB4ACD62856BB083 +987F29347547523481D58DD157C1E71878254F83129FEDC651186F696FA4E015 +554C5EFF61208812DE8473E0CCD8D108670FC49664B666C9A97C07185286A45A +6FAA91966BB3F3EBA629F4DC645A522C763F276B6BC34425FBB4187C77274565 +235CC4B9C902DE9C5B6A9ED253598464AB766CAF4BA3905F431CE64801711723 +7F22BC03056EDE0F03E7154B9227AB5D9DB43729C14FE45044F0368523794A37 +E93EDAEDE1A49769F27E57439B281DD121430D11E87AA64F4F7EEF90C8207CF0 +FBFA73F68F7C2023C63FEF39B8BA4BF429D61DB22B86AE5DA40DB7533CD9C0D7 +8DC6819DF76A5B569C55A9D821A658006E6AD50AA4F9FA0C29AB8B417E2D6012 +59D09EDCD7D968AA2EB4989492ECA5E6FDB6827637A807B3F1910E6F91122095 +30A35F48C0429D7C7F793D432FE423B89CD21D5A9CC3891A934D8A85021512FA +923157FB455E127E007404C2FC5E1B5A43B944C4EB884AFCCD3B642C0A13B0CF +6F4FD1642B917B64E296280261D6AB904738E35E10BA91A1580BE1E4214DEC4F +041E1BC61C5F65DC263FF9FEA39D7FE05F31B85799B786A3D5D0C5AC21C21EB9 +69AC3FCBD19085438FC1E3081B7EE187C0CF717EDE9958FB4ECA83FC2A97AC06 +C42B92571D1CB295A4E739B10738E0854557A1695C9623AF2796A960156A3395 +B63759BFE8E5B14A2C49192BB6103184CF756E1D585B84736D090B827C199BC1 +DCB1EA3B8DA7CBC73B2E26E96B6F0556D49923D63173C465D725223C0D8159F0 +E70ED77B0B380397112BFD024DC0F03CAE4AD3853735B3FB12DDB249A3929B87 +4F77103703EC7D4B4C8D41D0CE65F05CC6ADE30BAD9EF7D41D7DD1DB2BF35B87 +A929238B57DDF01AB94A1E31C10B759315E3E4D58D37142CB1DD6F27D321F6F9 +20FA0E6C2EA968494217E7F75A34F6B050B27F7BE3394CE69FFA957C678F1A5C +A0B3D8CE8ADF168CE01BA90F039DB20A8AC6B76D5036A2DE654CEB00A853B3A0 +7625675AE757C92E06C7E24827E47A09D620E62DEAF04F1FF407AA23C63A895F +E66E14E4A7CAA511423D5DCD020D1385376C3CFBB6FEE585256923F98A702217 +B1096DB80ED911924499572284BCCF297DD8B7CDC1186F6E12E6461039A353E7 +62786A8AC2072569AD069AC5BDE24540A069D26A73705E58D7FF12806610D709 +D3B58073669A255D65AFB23575EA5402380FF69CD6F61E6556B794441F7725AB +C82E82E284CB201B36DC5E37FE3E45D1595F9C5DD72EEB58959B3026F45C1E91 +7ED8E500C5CD1E1AE673CBC5222CF60D25643C9AB66833DBDAE1845B16F9E550 +8AEFA7F0FC8D2EF3EE39EDB8512BDE5077AC9A032CD4B29347B84E1BD602C4BE +83766227DC6B32191DF6743953790BD8AF842A4B5E4EA6409CEA963D8AC3F471 +FBA7C08F4E4C6CD6012B82F79BB6DD247F93BE9D898A7884C9B224ECBD25F85A +33758D69172C1FAC421944E482B7716E839D32027851FAF6F4E0C4D78F680552 +C11461E5E45EC9FC958D7C2D640C3D4FBC85D8D23428B5AB71F6B8827446E5E1 +CC0C38C1B7974F649E6BBA748DD76E1DA9747D7DA222A0FF08B5DBF0E8303664 +8F791FFEE6DBAF4084F1558BAE2FA8E48C807F1C6403D4A91B78ECB1BBE082C1 +A8C0CDDDB7AEADF5E525C03402B8AFB1BAE627D91C479EB198BA6B466A029C89 +BCEE9CFAA8BC88F344091D76EFAB92F5512D1BCA61498405823B231E0A587907 +543A798BD9664259ACE2C4965A15B653B7808B70CC050EE225ECABC1476EE957 +FDDDBCEB75E704EC7E33301443F5A467FA6DE504A055D611C2FA6B07BBE03C76 +9C430F6A3FE1198093A834D90029CAF806FD6A75C999B5E8EFFCAF676DF17CC4 +B256C6FC93F4AE44947B1381B6C475F282667A65708598CA4A4CD006B02F3004 +BE93081B80DAB1467214A6A947EE0E8451E74B5953B2D57E83CDF905D1B86677 +D811628F1D49F1CF5678E8AEE3C57BE4072535B6245E19BC918B29EC7989B698 +01ABA09A7CC82AEC3C0E3F64CB0EE69C71A127CBFF6002C561F3DBC94CAE7C2D +872CA1BE31370821D70098A7A5541DF5E6B6E3D1F9056759DC0AE1DE6F3581B2 +C7BF466AB8C841E0CEB14F965D1C31AEFEC4724F120E58C1706E009B738F1D67 +0B2074B3FAA0F98302A3DF8E093BEC432FF011FBB3C73EC4906D00C846B30501 +4199B83754E9B1A2F80B523B1D9DF5ACCDA9AFAED5F5B2643C5046A0E2A7D873 +ADA9DB69793D60F09D408297302124C10B6915147EAD703FA5AB9DCA1838C590 +7E66B21981FAB8BAB54BB00FB1CE6E36EDC67838F762B7F91B76DD8683EEF42F +1D0537608BAD4BF1191CAC12DBD7C17D0AFBFFDCE31580F7B6465CA5E2D5FD6C +55A8ACBDC91530FA9033413057308627025D4431D175ECE3167D99B1E1B0A2D3 +633FBE69CF0A4E23CCCEAE95F6661EDE0DD6DE0D1F6713901CA13DCEDD01A7CF +737EFCAE29EA421F3CB7887261161D5A33C685E28E11008DF6D366042DA16E0A +475E762E506D59625FB9B6A384A9A3F6B118F6254FF8D4C95CF84030A7A6D914 +6136C77BE7F7D01938226A0ADDD08CFA63B68CB6C0CF532FDBFB0AAA6CC3FF54 +AB5435949968AFC9BB14B7889CAF0C5B1C80F749FD9E966D7FF38D64476076E8 +9C4DAAA24CA211C0D4C0DB27D7A8DE66817F002A76310BBEEC5ED2444F9C0974 +A3DAA9AD65FCAEB77FFAEA91882CA8648A0F27443680EF7D2511ABF85DBD456B +2D72E529851B255CB48E86B537A0CC0127B8EB3F53FB67EEE069ED8BE30301B7 +02458C82CBCD2CF2396F4AB5B781FC69D583FFE8C7B62BCC05B746B5C495009A +BF675F38E811B3292DF31864A1848DDE036DAF7ABBBF17B9E5E655CAD4DB38D5 +5E40EF78371FD46BF1190BDDF34C476FD09DD23CBB54EEB938A538589A03B28B +03A3CCCBC550D90EB73564D4E56354846030B0D8ABA795AF99DD48DAE65EC594 +FC4CCA5CFD39860A6F23AA22D0E7C25A5CC06AE9A1C35EBA87DE6B5029F4BB4B +B308BE301E6C1CA24980D5A72F14A65C6552F8205282BAA07AB56FFBEB77BDAD +2A9B398216116A09A7FDBD0B01A33DE66E4A149E2CBF60715E8FC76A910021F0 +F26859FE2908C529F263D97481F07F784CFEF19369F023C98AEC7AF9A018AE6C +727DD9581662FD83F76FF3A445465D8113D7EE8B5420446804C67624B22883EE +4C31E69D1ACEA21DF7136529E6AAA2CF4FCA394142B3239010BE265F24405452 +8987FB64D9CDED947AC0F2FCA0636046872B6B742921CEDB4AEA45FE61F33A04 +120C7771D3541631B56332AED1B57A404362FDE040780A8A3509BFFD95FAEB93 +F3A2359122F3E9F709242E919AA0A52CED7C69623CE32ACB260FA787268E8312 +511A535827F5AA08C34CDBB689C9D47F31390B89104A698EC20F7B217807ABF4 +CEE3C2FF7D349E766E83510D204F0067D1A4144CACE3E9362FEACF05B95EC18D +BC587E4455B9632CE28D02842C100510B81B1D598AAD6EE21634F6A13A30821E +641D5D7DB3F7B784BD6DF4DAC840AAE74324CC00B515597CB7E4CF77A2DBEB15 +E655781F8D4A7ABF0CCB9A0D09720CF3A1671B256C81BC7C64BCE000DAF280F4 +6E5D749649B582C0639FF0CE11F6D0C36705A67A51404F22C0415A2135922FF8 +D11F8DCB25ED1CCC58E77CE7BD74FBE143B55DBC4AB525D4C4A8B7C392C4CB8D +631540238AAB4B3D9E1892B747B0C273917453C1E2AA7585A77E9427925FD5BE +1377961EE7C6AC55460A134AF811A327FC939A321DA059FB7DDDE88701922C02 +56727A98AAFF0D0FCA54EF784A1633B7EE514317D253780A1A62C7BD98FC4D67 +B49B930D55117F3DE5C5A634376FFDB177EFFFC6FB607B0D4F11591049D63890 +9E8C296F85483FE343D5B1EC41CEA8A3C66A890EC7812640016891AEDF8A64BD +FD923BC5176DCEF2A5BC67948BD55AC844FC1BCE542F8D8F8E1B30A61EC9C422 +AF66942C540E02A9F1449ACDE6F2987734A06088DB9BAB4B9D57C67C4D22E912 +ECE827DA938FB7FA5609A96FE16FD2E74F4E8349FFF9ECC814325EE5D506F6B9 +8B6058716768FA9DE7F172E4E1CAFA98ED651ADE9E6A8D89FC9FDF1EE6F031D3 +F87DD7101EC90192B8314025C118CFDF399C7B9BA72344D5FF3C97867DC3A6CA +76ACA42B4DBFC497B7FFF022B9F43A1876BC60172831DA3BFA9A74B85B195BAE +0AF002039C49DCABF89F2A5619F09107349975D8D8AE6A716A3ED406FBE136B3 +90D46B10EAB91C83A0C06FD4045E1C16DDF3E0A4F0C24805FA130C4FEADAC556 +C7FD67CD11CFE397F006C783462F823C4B66307B1ED99713A1D63004C44AEAE9 +2C7D929F2DE483CDD8D0CD5BC1512352867F5C78AD991EAE5E3D5D50B899B272 +8C7B34FFB491E3DEEE35213C73A0D0D2D3EBC7FAC5EFDEE670C41EA2B6E60EBF +11189DE0BBA33145D5FAC9BD4A62BEED88C4BFAA296A2D0A68DE5163C64014FE +915B8A5E88C97617EDCDB20723F55C5603E0CE7A2DEA778F4CF09F2B521E5954 +1B53966CA35892761B022172B25D45B4796B75A2290A88C39C73FDA467FF0566 +9B35FA83FDA4C902F11878244E47E63CBC35359B3482CE71DC061808FFC130DB +27879AF2A32A1C713256C84BA060722570C770CC0BD59A43EC3A7ECEA2295A06 +A134E2AC9A3559522691DD29E76B25567EA1DCAF787690872D62E780F5166C3C +4590181B36C40444BAF5C381DEBA692FD3B1AAE99C4306C72B11481502653A71 +55A83360304F1C01121CA574AED7EBD9662BC2CC161B4A7BC19143731026E78E +33575784EE8CDBC0BC219542E36A693642E155F57101EBB5AF4A867729ECFE9D +8261F66FED38E6E182213028BBAFDFCBC71F0969AE553240A89BFC72203E07EF +A6BA414540B10990770C6BB36F7F55CEE5676F5FEC5AD00C3530974B80BDC135 +EF6E8A10F2140AA7823B11D4AC4761D336BF634A24D8E89EE29D52C086FE79CD +C870AC65A40713C8C08596FD1AD2AF44C078606A4086F6D41D28C4E5217A27BA +11B172FCC9BD8A160F282A289993707C761CBB9DFA4DD9145CA114D9C0FA2426 +9EC80CA0FA4A86CA30E9021BEA3D463E8F058765191CE2539783A420E3B10472 +8EB4C904F9CC15E089BC5EAE794B9CBA565E3CC35C56B5A3BD20A54A5E430E43 +1029F7BFF82A730956C1D68C8EFB0508CBFAF48631348E8DCFE6479368D3392E +FEDF6E69450013499757AEA2E79E9B4BEF03C17160F84A2339E3A80DE8F036C2 +68C163A24E6FD8FF75DE695FC17BBF155972D54FA4EF7DBD6EEF74252A02EE6A +6F5DD566CD2ACB6B7474139D8443258BB8EEDE8C2CD08888874F872259CBF660 +47A254910600EC40C506243F0492400D897DD57FB4CC256A3408792140FA8138 +1A0293EA225BE55F392562FB47E7E243F27B665EABC0025A2E54EAED4D994837 +8834E6A97B8DBEAF7A937B593CFAC8EF9A40056DC38F59834E3C2502DDDDF1CB +438D4B1FFA2FACA0F3D09D178C7370258C959AC2E8DA574305825F67739926D0 +8AD8949E93B2CFF05C85F56EDEBA1C490DD684F0A9E7C66C20D5B9048C6DBEB1 +C75DE78D6AEAB591C550A1ACCB1435DC126DF38D4FD8B168423D4434D126FE13 +7A1D5ED73746170D164C250CC197EA25265464844A2A1F49483D3ECCB0EE0D9E +3C578291F27369212C3A659E752458AD0E4D5AC667FB6E762036CE103BFFF9FE +E0CC48B5FFA43B59201A7EED5A4EB31749AB153FB776A13D73A39D109E6F8C2E +B8F0E5BA5FDC23AADA736E50C291F78ABD0494B0AD6D376590CA339B091F6289 +7D2096E68D5858AF2F9BB0B162D752786FE1AE23E542121A74C17681095538BB +9EC57F9E89F3B0CA32649C98597DDCDE2138B61450183A798D31FD3462102078 +62C7835F500E7A1FCBC58C37E8DAC9793F584A7F851565C871BDF1042234D3B1 +071F30D573FF2398D3438F49588662686A4AAEA60D8E1D961A48AC069431A9EC +1ED3ECDD0DE5BEEB5D6FE035AFFB6BC509833D32508ED2D495472722D68E0A3F +6B4066BE315FF5E7048300D439ACE70463F4BD72547E26225161B1A9B2F15ED4 +77673AFD583DADB09FE1AC2AB97537B7AF30051030792B08C4BD0C442FCC215E +0257A366DE8CD6D7F601EAB3DCB0B86436B39364A44624C780A99F9CEB12F8AB +7B2ECE4D34176EACCEAC54BFC3E5C35299E26CD8414BB2BC0ADCD9263447BDDB +3858265428E134820D621E0762237F46C2681C296F36F774E705CED8388E2626 +B527ECF6B952B5FB9D151CDE83FEEA36F8C87F0B602975D918BAAB17752C83A2 +D8205FE2A2912282FAFEEBC0818B086464C2AD81EE097A492DBF5C1468AA8802 +88C454ACDA1E44169335FB0AB2BB0D44B2A4A4386AAAA4CEA2E48DB27BD47700 +3FAC7847668891E99EBCA8C5D813378EE7772212101488B4110E92D269A121A9 +18901A8EFF7C57F155C827A558A4F1610807A50EDE9C3630C2FB77969863FC6E +A3AE9E28F27B301963D3DBE231CDA9BB03B6A29B0AF4042F62FA71E1C8A374DF +B34CD305BF9410167948FFB3E8F262BB94AC891068DDB8F66680F5CA9B86000A +D4B408C3F9DFE80A21DFFEF20D7C09EA830FF915509943799880B028FECC64D6 +6D4F17728A750801197EFB3EF5A697F63C2057D54AD79EDD99D7098B71107141 +3BF98DA68572C2EC5407C590CE8A7406239E728DB23304ACB07E1F27E9BC0C10 +B249EB1B76F1527459B8F05E5325F2362CE119A155E352459FC1552FFF069D88 +82D06CF9DA1676AE53DFA9DB50336CAC9A07083212FC04426842F6D08B89801B +E098A9F6318577FCD3DE372FFAB3BB63938F46FDE00158ACB3F536EA91854E5C +2E4B519A78BA54BE9B8E652756D615FB1BBB9F8CC4116A5337D0C82599E76F38 +7577664F70E05A2A0A402771A0BC71400E0F27D4C40D40908EFB641C75AA17E4 +34E02C02812B86CB7C1843BA074F5D7D21D90D93BB6BAB5ECA4AB1C6F2B2B80E +1D3A8F2160DAD92307E5D3C763B0F63B7FB9135C76FCD7BF8AF9637F178ECDF1 +C761F0DDA7281C248711D123FE2FE5BA6408851F72D5061CFE0AF10E1D1EBE11 +1B0E4AEDD4946B6528FEA67D448BF9A06114A202E3136A2B7AB1B6ACC256F287 +EBF97D532A8FBD15064DC3B9D643402F67EEFF350B0EA3C3BDAFFE07C7CB1557 +5910F24C9101BC72440F4A9B8C2B7F48653C13FAE5FC28EB6A6589FDF0DA849C +6569C761BE135F4E10151117FDBC32B94A0E534745B81E424F82EA384389D2A5 +795D3EA358DA26944D1F1ED1A48C11F4C444D7E91A6F23F950DD40BC0EB7FC53 +3C00D2DFF98EA6BBD13A904782CDC66BE179873E44254FFDC031B68AFFF574AC +702EC8D9C462CA4257120B27AD65400EBBECBA4D32723E0E52AE178ECE376B79 +24C7DD2CC62787FC69AD166EC11E4E43D1E3A76175AE4B0282FE62B8EC0D46E7 +37C781B65ACD9E98108FFED418C6EB3F3ECE5093D4C4369FAF179A92B289D582 +811EFD634111CFACBE83975D9BC28875F2AD667F3DF8C7A3A3F5CC6B3E98F73C +2D7A12214A4E6CB03C2C052885742E7FC5693F854EBFEB4A1711D1CEA7911254 +98C51BE323266A08650D51E50967DCC8DA329EAF374F422BE64EC35ABD1D5594 +00AFCEC6A82A4DD47271702552458B24C8B6EC0AA1DED3F6EE8D1A65E0AC0123 +5E81473A2376F47C06E0CDA141B2A3C056885AA41A10FBC37C374988FF497C81 +EE6797CA2C9296A496E6B6C9F56377C3A3C402CA3636372A7910BF35AE2AF3D6 +589DF95AF23E4490914ADAF4E4C605BEA4623231C5F1D4579A51F307F9700F39 +5402CC9B93E13679B2BE641F229A1E1D83BE1CCFB978FE1E8954FF1CC6007034 +B1A2BEAFD7347D8BD97ADCB649F6279E0A0E705C82F27778F7882372B58E00D3 +B94AA2A0582BEC08BF9F240FACD2D12B99F46AD52495B2BE5EFFD0B1AC93E726 +DD72DF4CA1264F21457672BB2802B7AE9B075795BF8AA9C27F743BD89C3BAE7E +C614BCEF16F4A2AEFDF4B72D5CC5DCD7ED751382AB652ED86BEAE2653C384869 +D40CF8BD6FCE59F51CEACD343A92CF833754CBC5C0B80E9363899CB158EB3F54 +745BCEEBEF2659C69E95CC3820F12C6E51D868AF2FA979BFD0241E39A771747F +FD651E157983751D084B16322264BE52D065A3608DBF78E98B416DEE27BD9F2E +8F610100D3C227AFC725139971053273A53E18A6E0D894C932DDF3F432AABDED +39666CAC0E86306384428A81F44006990C25B8144394AE04CF8A1217DE12D046 +A160109658102F279C90E0338541FD04AF587B1F88168463D471EF229009DB3D +ACA474AFF7CC89492A300BF9574AEA8C5F9A9BA76EF789885EDF37C97B8E2C30 +D429111045A9C1490C6F4693B178548CD90BD54D75B6485B8A8186CEE5A86C8B +519DA9B1C577FDC3B317151B3D3D725EB5835860654587A993C717FFA8C7E57E +75D6E0E3E5BC10D241D0763B462F0B4FFA7F2881B92DD101BEDDD83373ACC0A0 +CBCF366F10DDA1FB8EB75224CCB6531AEC9E358EA5F0021F7CA6AF2510904AA6 +2259E75D10E1E492B6047B116FE904E4C9B832A23E3020485A26CD026F7C89F2 +75B8D46C4557C1798DD4BBBD26C814411A7D59D5AEBF6D6B7638F199AFCDD030 +2B2985C6E762A002381732BEB2B958B3D6CA4DC93ABFDA5837B89A5B8BD1FC7D +322C540912F0A93B54117EC76B2E623A08673CF8882658241BAD84D1C7EB1148 +CE183E32DFB96BE256957E9F730CED521E392E56926CB63B681F5A930F32A9B2 +77477908C708D13559F50653DB862F07DCC8F7EE0EA755E728A9FC4A17115418 +835009651989B113A8D2DD613764F19C6F152A8DD23B37822465E483F4E746BA +CA01DDD1135EBAEAF8792EAF022637287A544923CA6701333DFD39B92FCCBEBF +D0ADB4B19A95CC2AFE8CAF3614EEC904602147A72A30DC5D582D147843317226 +8FDECF83A19691D5AE6B590E66120D22508CB30713BD2AB286E58A9E2F435C52 +D15E12C3E1C939E850135A6E2A897BDAD9F54179F2DBC80CB322E85B28A3C345 +3924F7A676B7587BE5CEA130E211B10C9B5C28A616CCB55B206203D05B032084 +123EAB7EFF139D5C1EF2FB00E3B328ADE7AE451471BB9E5F75ABDC03948B0664 +C4552C99DBE4668C7686485E27041D48C5BD4E4A7424E682FF75CF9DFB3D593C +DDB1078AE7B070B1C6BDF8FF5D303B76E8B3B8B41D5958C6CAAC1790A6E40382 +89DA5B36509198E0AC7541112BA0ED7875085BFDB5169E01B75AA2EB2F8E0AA4 +46D7AACFCABD8F86D6753572872C647FF3A83214A44768B74B523D14C1FB8DCC +764D865C31CC427AC247E7D6A233A7F043585B5B5737FE7837940F70AD3C1D00 +E6AB131600166A98DA57FB5A60D6B061971F09B780EE5ECD5F74B93621C54992 +A15D96BA8873D230B98CE56FFF6BC59A043D5AFF06A260B8C6DD848614EC3341 +21490989AFF9DF6BEA57CC93DE2417D171DAEEBCCA1EFC9164AF4C2E02B34E11 +34B7FF1DA19D626114DFA220623A2E667BDB2B79A6C97B8B4AD1793D179C0153 +150F91EA174C102B3EA389DEEEADF3672F0B2AF9B3DCD0D2B5B91A0F180C78E6 +1E0C7787F029A053686DEFA38CCF0730E7B8DAD8D4670BDCF6F5930C8802C60B +E8082320DCE1E5BBE6CDEC6FA39CC6B18F76B56689B4AB685FDD986086BB414F +6F0F2C4B113B6B31536B2C1980D34B4550C57B7EAA9161DD574CACCC82AF26BC +56EECAB8FFD5F50DA8138FAED811DF021FA2C2F4991EB28310CE94BAC3CE70AE +D7C36867C52843FE1AB41CA2D6B8EB9ABAB0DA435637C26E4CA60EDBD8BFD748 +CA958C5B79C6ED35393A2D4602B478524DF5BADCD692E02DFECABF4B99BB8393 +B8D8A2CE41CBB04A3BB9806C9E41A58AEF6E2BF7E7F24778D3042F42DB0FE7DD +522486179BE8D2EB96CABF1EEA0CE577AF846E3CFCDF53CAA22EC3CA04B5D126 +CD68AE6F6E40075E559218857EE7FD5B91C426A7982C132B2A23B77D10E627C1 +891BBC5F4342982819507770FDC22FC96DC1DDB3069D0E3ABCD309D1BEE3F273 +F113EC79AF6FD2A332787E2DF3D9316DEC84DAB94AB9A8B25859BF2553156043 +6A5A084CD002662F0A1B1360941CA96B2EDDD12041EF8D49A5C03ED62FA1D50D +4B4E94B30FF78C7E87DBBBDCF100CDD0D1CCEB4546A81129329B961E477E2EBB +3D500F0DA9F684AFA07FDD0930555E1E828B0656854AC9AB8118A4BAD7111B39 +5BDE6AC93CC061FE73067D807B454654E3AB7A02A38661862B6811FD9857BBB5 +D88AF8BE8EE553D51C871ADD6377FEF4E4AAB4BF0962C377E6526DD3A43C99D3 +1200330943334A86A18E00A9C62CFB783688A489ABC093927E742AC44E6C5D68 +E381CB0577E36D42324075C70D0210146A46769E4EF4E7212A02BCEF21D39866 +45FEA59ACC9D0210DBAAD2D64D2B9C75AC9332DA6ECD127868A2ECA846BDC961 +370CDB39A22B63C3E73E1DA43D127232FFD654A37DE3B77E8691DF2000A95E02 +755A7DC7CE2D3FFD1D4E7A5A630991A727B889B6E80869FEA450B89D07717463 +BE8E7F9F7E7B5E8CDD9EBFBB0B01BF4631C35423EA9A53340BBA9FC493C144D7 +AC4EC43D61AEC9B6813803E59AB2F48B6B167C19E5BB64FD46B494ADDE9BE881 +DC7F1B9B7351196C77B07E7ADF73BCE7A085EAE92457E0031126878D6F2BB471 +FD9B2CB336526BE180479A29D96E5DEFFA21C9368A06964F5D3AF0E14E9137EA +D8A102D1D42E096B89C04E6B44C22E38E2880EA9624C7084DFE92C7CEBB1CA87 +ED4A6269DFE0BFFC2491A2FCCAB7591D868D12FD15C2FB48077B4425BF9C2FB0 +C9CE1C5296278F8A49175A30161ACEEF4411234610C4FE6BFBD2D3AF3B924837 +6490F561BE719424B849D0CCA2D4DA51A1F34097BC6C4B81F65E094610363CD5 +26FD206621ACB77A02A1FFD70E364E32095A7C0173DAF45388E4F8CF02359389 +44180C058889100D5B340919A9EABB32A070AE29D81342D49617F20CB170C67D +3B4A671979ABC06F853D599899A7117571971EFB792229D4D6B051EA3AA66DCC +8D78F3A3FF7B97732E3277314344D32ABFBEB8AC47C4D4DF7F24CF5CCB870672 +C106D2CF44ACA8967586FC51354182B066B6EFAE8FFD916257EC30AF1E67B156 +89C13F96EDFBCD745965B3DCBF0C70496F81DE237779A24683971CBC5346D8A3 +E6BCBB52CDB58E2E2B3C175B7F049357C667D7E5DF9112F6D7787A47679DCCBC +9AD6B4167C0A622AFC2871583D3DFD80A684B10A13D8362F08A39EB211672E8A +8027F3CFA9E5725AFD833DAE86772E528FE5F89CDCED0EF2E2D7B84210BAF4EC +F5FC2DA12451A19FB91E72A710AB9C80D9D964E05D4B7DC69DC229C6D4F2027E +98F114ACFB99DF2487C53734D6C245F844F97640A29706BA79C324B2A499A8BA +33D63244A320E9D2BCB43F59FC073BB6CE91F32F449DE3DAE4CE284E0E40EC9A +299F71E1FF08A2783E1B452345F4CFFC1B17E878E6982198C14AF78F429DDA89 +99D504B49BD397D45DB265DC4242E51EBC3A4FA1078F62FF96A9956B900B7CAA +64DFF8624A85017B0EA6DD905974F9B1A98A81C8A31E8B7F39C667DB89F88A2C +F3E69A662D14C1523CFD64AE198784ADAE2F6524AC51F1DFA7C28653C70BCC7D +974677D88282EB0EA8EF2993DC93EED927A088F00B3F6D45509418105E4EF439 +803DA2E82481019BA263C499696C3A8247773BF93CE18CB941F57E1512A918D3 +4100E497E31BA32A00B38B9F76B837987C7269CBA3FBA9E8487CCA4E0BF2A154 +494B2802E785E80E426C1E9E20A3BCBE1B88D1DF218F8A612237826FCD724236 +60CFB08F417238AE9DB5142D00852E4806BD491A18FC7056BBFAE5A97433FC88 +36E6B85A46DE24E8416891CF551BF8309FED66F4931B07E90DF9CC062ABC734D +77D69ED92278A16BE66D1A5A1A7A6310BB852682FABA134AF0D55FFB09721DAD +6ECC9D6446A54B158F034DD346793F1121B491C3793279520DC18F6EA12F0D30 +9C225BFC2C16B7F7133A282B79C12EC832145F366E800BE79F5E0824AFB0A87D +626DEEFCFF653356F1DC7A02A2ADCC2860E3CC4125BF24ED9270A0EBD9055740 +B40D69633885753F33A58F679A7BB37A88311B4B4F1675780F87F88094FC26FA +09BD993760E7C138D219382E7869FD81279DD4C3203990FA0A1E5A76FD2EE408 +81021AD0A9A3BDB29136F417A647A4BF701A5DBFA3618E0C5455A95B0CDF969E +56B1D4D1EE29CD494FCA5785B10EC35E64D9D7F81E6DB72555AA1782232681E9 +909251570732F104D769D752B09C4ED44D9B00B929CF7C3899A1E4003277000A +50D136D222A38476B166500304AF25D2A691104FEE150C14D6BA805415502752 +7959ED64C77B1F493FD142F635DFF5F9C6C96FAA68C418E1FE57C59ED52DF91D +219E20FEDBBF7CFC56ABBE64B41616B74B6A76CD973CD4556F8141E863650CB5 +1FF734CEC3107FC337F9338EB688500177095021341B9D9F89BB7BDF5BD20255 +DAF041D751FAE3C3265F169800CA76182C63468B2767A0D7AD66A3F4CAC6D230 +E4F125E79DAD4FE6BA2DDD4F2246D3E5516DBF4A85CD3C96E17C8CB90DEE6590 +FF446FEEFB01EBEBB06578FD85687C27FB1F7E114C59523A7621CB251E73F6E3 +9C3B145D3022C716C476E24A4FB28E8D04AAF74372763B244EDA4244B632EA49 +F7D3388E1024CFCAAF76FE2E8C024EF779DAE6C93E4D078D8C28925E29F9A454 +75A2B6C84EFC80B82870C863ED7F8FBB606DC050C9B48B09B5743A2A459E4137 +BAA99EFFE878248247B575E0F51EBEDF5E13FF525F627D917E10192FA3EFA98B +E24F413BB8603D044C5D225E0DA3E60DCD153520F317AA0212DAB75E6CCDD402 +9BD3C4F14443C20DCE7D75C3DAAC6200B07A86DBAD8150429A28EF82C5E1AA37 +DD57E54230D789BF166A074E0745D4A22CC22A2C1B64B2E866B0288ECC3BBA9F +0865C26D28AC2323BEE23A3F8D1F9D2624D8C5CF775DA3D64052C1A6A50BD579 +1122C5FB8881CFE27430951C7BBC506AAA1E17F9CBBDF791FDA2A324B5F20C67 +1E26175E2DAA58D7B0351250AD53C423B5F6A46D106E6980F7AF95A6819964DC +3939E2C92E76AFA64FCF2CD8AA811EFC9DC06C4BA38BF10A10513F02A8A8F855 +B3A04F814708F7D60A0525C3BB1B2DF82047AEFFF231D6B18E51DD38618F3102 +23EDF0C61EE36F887D0CF61AC775E044DAD59CDC9C8894EA4D6208A5F63F37DD +1945592CAE3065D50DC35AC0ABF70F22072D046B624EC124BD023C508EE8B805 +CA44BF658B8CB36E4CCDB2276AC89912D4203425E64294461A0836BAE2E6039E +5D041CB1CAA1F6D1B2638EE7F296AC96E49BAB1C0160FF773A9DE83D696B0C2E +DC034B20387C96D8E5D0D75D3E8BFE12FD2DE65572C01070FE07D96B344638C8 +2DEE5D10642FE4329F83542B90F3CCA58EFD89FFCA8D16DAECFF28CAAE5B6CEB +2B2A3C2AFD87F802AC36C3DF24CF6CAF2E8A822F286DFD647E195D3295466C41 +6AB850823C2891E8C6B94C9378F6EC868EE1BEC466879AF8425652BBA9F8FADB +782B878D4EE3E9908C8BFBD343E077878499AF806A031B211CF9E43F470A5A8D +8BF646AC3CD251393E3F94FD17151ACDC810D3B21C257A721159A6463DD0C954 +D7DBA0CCB7102E4DB5BDB81648520C5D600ADDF06EB808CDEC948AAF188CC6A0 +3327074AB44AAA9752283E94DA061191D10968BD8357D35EE2B7CA6BDBBDB595 +4F831469187CE69E061147F7C7FCED28824D4141783DD8F99B73F4A52A4A7BF0 +E5F7FC1F93B379D7416C816598DE7E660FE2A218653B32A4AE0BE9B5E1CBBE0B +44D40E2CF2BCAC37F7DB2A196BE1B80D22534F8553958874C7BD4E8FE2CBAB87 +00101C71123255385BA182E63913F8AAAE986FB763FDAB631265061A17340890 +789C1E80E82002A6310AB650589809CF3467C6E12E312EB7BE3084750EF5AB0C +6DE37BE767EA9E5EB4635529BCD8740B0B6E2C842EE6EA02D726CEEA20A23BFD +E5DC590FA32502ED1F79941A897F59C3F2FF75324595F0C5753C5E3B65FF95C8 +FDCD5B411F86F8840386528CA77518A2765AB3F428937258A0A1210C86FFAC5E +94D5BCF380417DA59075C4351944DE6934DC45B43C6FADC76D12FCB66B4CE9CB +4C1E8FB398D66B5528E5B207A7B8AE34EC403F92729B2737EBD585028926E76D +B3CF37CFCEF267B77CA5AA619BD3DF563C8C6AC730CA6486B135E817809B8D30 +97028BC290464B283C1AD1D41C59F97A69F06D9D72A0A9B95A45E4972AC4B84D +E97C507869E4030BA5AAF4B710DE81A3502A4D7D736D61C668F63FA6D4669D23 +FE3F0B09A7F4906E6B31FF161ADD8E1E45EB98099B5BE95B5FDFE3F633447974 +CD3A02BE03C555B07CA3BA33F56AD586910707556DD51660D5ED2933858A71F4 +4900E8E51019FDF950E594C3FCC854085B0E165CAFA7E902E1C842E17AB654A1 +CE63493B07E060AD31814318CCC5B3783FEA5BC65DA2BBD27286F743F48D8246 +5E73C07BE09CB22176C40D8F0A55650B2EF6703E5D1325A273417E0CE2E1CF85 +6086CDC94AD6FE36C7A52925C91A3769F6771C6F58367C2B2B2456C5A1CDD38D +09CFF9E577D6877563AD4E1EE5975E609DBFEF85225FEEABC2B49900F716D121 +D49C56F4EC12E412290BCC89B8862EC78AA095855D4B9DAC33CFFB50E9CFA788 +FF7514936A0A284CFC5E790DCB6BB15A49562CE367D96B03C058D63961FD8BDD +F4402A58E1171A94B6B94CDC5E60106540E0012542F563CC79DA1055CBE47EDD +98F049E90177DD9DF0E0D038C610568D13A6F8D59CBFBC5ED9D5733A55F21B74 +F06DC30D353B69FFA47ABAD4C55A874811DE60C6A2B3673C76105E16A466FA19 +20A5780F2E949328E05990573CC3D38CA7A37AD60641DE173893FFFA551AD971 +697DA8ED155818AC16E3DEE6968891225D5E0DD0363A941D20B76CFC6A4531D0 +2110290578D4D1183475AC1644257BFA84AF546324F3AEA5043D7171D4C251CC +8CFF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMBX12 +%!PS-AdobeFont-1.0: CMBX12 003.002 +%%Title: CMBX12 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMBX12. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup +/UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMBX12 def +/FontBBox {-53 -251 1139 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMBX12.) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 44 /comma put +dup 46 /period put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 58 /colon put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE +0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D +2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608 +1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C +42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557 +FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE +78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18 +22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE +A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811 +4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065 +4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7 +95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D +9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC +5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF +9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3 +CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511 +BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65 +9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68 +EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A +D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE +2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE +947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B +0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6 +4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C +BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2 +F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4 +6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514 +D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415 +F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8 +481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24 +FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D +419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6 +7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B +70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988 +2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE +0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC +9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A +C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D +1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2 +A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969 +21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530 +7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198 +17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60 +30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F +3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257 +96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3 +B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950 +1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B +57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE +B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC +8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91 +8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59 +B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E +BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC +21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91 +D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4 +FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F +A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4 +A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082 +A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA +DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38 +7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F +07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9 +BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E +8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89 +E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C +B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5 +45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67 +2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5 +5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF +A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28 +5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975 +E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01 +5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94 +6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30 +8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB +BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6 +9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB +B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B +B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E +8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD +595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E +FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15 +13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A +FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3 +DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB +313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248 +C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89 +F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD +DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844 +8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753 +E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197 +A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3 +C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20 +417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43 +19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4 +9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85 +12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83 +3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1 +A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68 +90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94 +3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5 +B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B +82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550 +1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94 +AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D +9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985 +2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5 +99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A +31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414 +3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86 +F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5 +70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E +5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891 +84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978 +BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047 +8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7 +5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7 +9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B +F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E +94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE +0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC +E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4 +7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581 +596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442 +F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E +7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1 +1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785 +AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE +4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F +744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D +67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA +054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA +6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B +8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE +CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39 +EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4 +C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76 +57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5 +5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F +C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1 +CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2 +848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C +B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB +77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28 +87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58 +3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8 +409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7 +A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B +72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D +99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD +8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB +E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C +82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3 +C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0 +EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634 +23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A +59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F +C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0 +1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C +403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90 +1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893 +75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E +0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35 +82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25 +C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8 +A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC +9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06 +0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C +5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060 +62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D +6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E +1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5 +648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1 +FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6 +754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A +E124929876488AFA97FAD1A68A0C3496BCA768F4AF8016D7A65BBA3AAFD7F5FE +E75FE714FFF3D54D09C9747ACA01CEFD260985C6E87477C9C7843343C7E9E3F4 +0537D461EF019E046DB8B5BA258462B2FAEA1826B3410BA3333480CFE0DECE61 +CE2731FDDF7FCF2AEF7CC2B1EE7095F480B3B27932ADC486BD9CC130D94BBD05 +43872FEBA04FB8866ABCB4D379696E73B84BBE98FBC4A16CFF22F8A7AF754624 +2912C228030FF7EF23D51DD61BEB5171AD31E2B630475E16B6E0F3C78D44AC30 +712D165DB658FDA800798803C3CD32B841E159AF0F748400314FAF5038EAD574 +57D57A34CABDBE4B8D145E439A11585A0CEDB410973892F52DF26E116198F86D +FD876B8299BCA27AEFEB72F9E8B4B7DA1110B52A0F96DE59A839E144184B72B6 +E45614991F03299BF5D1365EF2E0D68B86CF619AED2B9D37876A796997CBFEB6 +451B67B5EAE9120D0F8F9229332F23B6A10837AACB18CE42CA76F50FECE8A7D3 +3213106308756303E821161BBA3576A83820B337E6A7E804D8CA26E226068104 +0EB7484C4D980D7ABAF644B8B2A1BEC7E6506D965BA155349750E79A0C8A1AA6 +5AFC6F9D9C691B47F45AE17E66D1B273AA58D2CBDAC9820F011DD77CB2F40495 +540AE5327597D571CA7E202E2870297213BA4673BEA78368EBA8086EB422A59B +C1B4B85378F2864B176AE297116D4771A393DA50F6905204CA54E10C929D3478 +36DE51581F3D79B158CACE7B22DB5BF4F6B34803DB65FF139F2FE9E789E79035 +47E746283E8BAB12A3592CF7AABD8836313D79BE940D246A1FC83026FD63925A +64D9A8E4A799A0706AE085365144A5DB7D4005EB07A1D1EFB18B8AD517FF5500 +1597D3CB30D83856E4B83456C246AA8418D2BB350547F627611531515CDDB191 +EDD72DBD79FBA622A1F06B48C412E37464B3B5BFD1614F54253D9DA82328E448 +11C6A02E6323738819FEF776149B48D52C83CA39036DED2CC3D8C1E36320F674 +C9B5D10D2DCA8320A2BAE92C9800FEABB7AFC0ACB2710F61DBAD38E8174FDA0C +E8AAFBBE0F602AEA14D675DFB04790905077BB0FEEE4B7DB0A9717D37A627E6E +CCDF58565FF1DFA6408CD17F71BA6BAEA2D4D99FF7628166BA93A5CBBEF1A839 +2332FB0A14671F510DFAE662325952ACDA24EE9D79EE9402679F5B7FB73372BF +641E2C30C24A861F669FC28A2C1447EBD321E3BA9F29737CD880CE07D2295E72 +9D2AB0C24E9A643A1BEB7F32D20A58E6E620C8F1768D3212FFC5ED912CF7C3D8 +D507217D20A988699BBDC9D3FE095C8DAF9939B198F0A21DB77CD4C59FB771FA +9DE3286BB0DCEE0DA3782661356BB2691D830C00688D0B29651BBCC437532DAE +815AB03DE8F44AEC6112971E7231B30CC80D04970EC6C1E42A6AA0642BADC0C2 +EAD884A4C33B25469B5FF3230ADF4EF607499F1EC3401FF7C6F844B93D95B202 +1F661579C30C3E1DA2533836ED3445E59CA532AB1E8613EB4C78536ED00E1EF0 +615359AD748D66F7C8A13B807650C963A962B831C55D25B0CF3EE4300F941C5B +61973842957CF64A65255CFCD3666728FD0CDF7B59DC9C2E3959735BA89C9AD4 +98E0AB04FF7B07A138E77B97991379C4262C03F36DC55420A1DA7983AC156209 +AE245CE6C064071323FEFF68797AD21DAB54A1B8CEF96A787DC9E90CE2DA1C27 +08BE7D84C8491B98151D170434B4880F1550D55632ACE592BBC07466FEE6B7BA +3632C750DAB27A2A33C5BFB2C06B5DCB9A6243CBBA1A31C3D7DE7FF6B41F6E82 +6A44428053C6C606E951A312495B47A6BBC2FAB44A62FC0D4A50E74D77E0BDD0 +206BBE6BC9B1DC7A0FA3CC495CDF1CC5216428CA94D6F6715B920DC818B8463C +9E4120C397B8C9007E04347D305D021D5220E3E98FBC7A30211E6C4B1199488A +EFCC8F2DDA888D213228C360FDD2D27A7B8D3578B3F16D9F73AB6D7DF413A84C +B0B5FB73A7FEE60E68B98FDD312DFFF653D98FF04DFB4AFED129B33E6148FE7E +EFE32787D41E567C0970FD535BBF95FF4C14832FD5181C6AFE9295665C6AFD2B +07DE351D3A9858ACCDA547DA19D30BED27B3A77C01CDDB62EA0C541E26B241AA +EB6BB5D533A091A7C5AE32923E931A98B1A378CEDE4394E7615AEAE807C14E8C +818BBCE624387076111D1EDF5C61EA8809948D4906B2C05C01463C4DF4EA3A7D +6A4DFB643EB5AB2E09DCCC51CC16F68CAE87CDFB82F7A39129119C290A21DD0D +3A46F182963E7267C31F20B98914BACC48CCB4E0611C67BC595D00B633E7FFCE +17E311A7F4588FB6AE658377C08A215B79424635331DB4068BE99D308D6BC1FB +2DF73D26E0C6303F06946636B23742D57FB9D9A3BD099093A1C7BB31C02D5423 +C7FA77892B3E560A5D115FDD512CB4CE82FE58A7AA72A233B02D6B48B90CF72B +6C9D1E25CE02FD2D8BD99802C12AE644185A5D70D63442C3514746A7222DCDA2 +1DBBF4CBCC0B2342CB51BC7FC6423F7E95BC3EB407F0285FD449D8B636642BE6 +131E0AE8A0B810C0D8253B249A103DF83004276605A33119A16BED4A7F2F295C +67757411FEBC5AE386358251D1A57A77C11951BB0533EE75223739B27D2C0EDE +F12FCC8CEFA983BB6FF34301849D59A0282DB77AEACC51E2350636AB56FEEEEC +FDFECCBEFB135A6005DC8D8E21B1484E5345FD64E26B296864D7E8884955679E +35F720AE6E52A89CDA315714FCAE93AAC470D2692650EA28CADDE043534014D5 +17507253E7333EB8B44A5486828BCE2850FD95CAD5ACF132DFAA39E0007FFF26 +497425189ADDD944FA5423B9305239BB25B4430D6AD6D698F9562B10FD9D75E2 +4C7AB5047BE64C912105CD4A4DA988BD5ED3B612FA3D28C805E2A360F464178A +94CF4BA6A9FC5C18E56D8C0890CDEB4D14ED75F494F5D917A57F571760D02147 +1D344B0D80E7064DE9D0A5992C3BBE55A7258C3DB693677765B514782170B8FB +6E0F5AFCBAEF7E3D161717D01090EA2316E0633DA73CF10C77C68BBF8123FB74 +1945F0EDA652BB4F3693FE0F4FB0F5D5F57A6A1793C0F39ECEDA9079A5C497CF +1519DEDFE0FCF60994038D7A9F5374FAE1F132BECB1DC80EE2D09164C674C6FA +D0881743FE49F5727756F05AC1709328C25EE1C4B8AD429CB90EE6023A226709 +33C619C97D92A505C9B82B75241F7CA2604B8C65202E5546E9BD5C15394BC9C6 +2A848D7141F8F57FC25DD20879EF0E968CE16C31FC537B74C429720B0D83A510 +DF7E9C057609E3F35C2DA4EC56CC1C4BE0BD04A4B23AA52FFB3AAF096D6CFC3D +5CAEAF5B4577FAFDBCF41D81148C0226DD29E6D57B8C05E1C141B6D309D7273C +2832AF0AFE91CB8CC9FD1980605C5FE4D8DA726580676FCEB1021121DB2CAFB3 +516426D78EE62D95A84B1ED786324569E604FF8D2E9EE071600B4820EF0CDDF2 +51EBA811EC9A6A8F7E8533090E7D5FAE3592A6F7BE3C7DBEE4729DF5598EFC57 +614441E5AE48AA6B3EF26C78C298B5F0EB05D67213915CBD611298A3492ECC50 +3ACFFC5589E5625DC0BA66F06B15F35F73993CD514F8F952B9AB8550BD573B20 +699B9CC30851C45EFF549F82433198FC6C217E2C6484DB1B349BE6AA81A32716 +DADF7565299A4CCCB83121FD1CDF9E1DF7656273E59B60080928E8CE59184D32 +9868A652C2AE09BF15F3DC3AE6AB5436D0CCF0EAB2AEE3A385A6A8A2F2BBFD4B +B8EFF2818AF015263AA0A5C8215CEA00C62DF4B00540B091CAA144D6F94C093A +77375E33DF12B1928C9D17E6E3D658B8D26B5F9ECAF863FA7A93A53CB1BA6B9A +CB4118471BF92D9DF22C820506CD74492F42CD49903EC50AAB51E9E6115EED20 +08D8CEF153409DDBCF0EA91EF2BEDE757361403A94FD680F74E1B96BB88965E9 +58F7A517FE9E1C781C3CBE6498E6623042E58762A2407A5FB8D24D89B93BACE2 +7D92D50EA78D5BE442D4C49C56F57592C04ED3518C44A4F36B9819C27E93BA1F +2FA7C560668C355AAFB9A9F5BE6388B3E08E2FF8FB820BE492A1B0A067515A1B +5DF479992F4E62D27F713C7EF4B715FB341F35D8C9C4F62834E950C86561591B +8947FADE95A2BED5D595E81B1AAEFA2EC949A6E4610D372C8FFB23E28FC64153 +E6A9F95E8C77FA57ACB91B1C7D6EB78EA40357C88754711D61977F8D1D8836C9 +1D20A3DD14CDB6B7936233E524A990148D8B797ED4CC4D5BA8EC668DCA7C9C67 +413662E9B57DA3233D0DEF0EFBE62B253E56F9FCD5E64B9AD2967BAA036EFD4E +990F9BCFB3113884F87FB79E7BF293FF3A920575795A964C662494B91E934107 +D2E02B221294A4776CC9ECBD69A362E6CF668CC22C9F8DCFA29CE30CB8DE13C2 +79167C1D4BF0751D491109BA8EE1ACD06DA832F48042BA3700CA0EA193D41AB1 +72E1F02AFB3EE2E52A32CF8921A3DE2701541B66325142F9AE079F3A6C21DF90 +EBE1EECB900ECF7FB6F001CFE6C0FA8E6413D39B70F8B4D68A5105F509E384B3 +842F5753A6D78654BD508FAB1CD7E81FE0CE3527E7163EC56EC8BF3E242FAD38 +A600E254EFA5BBD99C48AE102AB2DE4330EE93CE6CA6F61D99406DAD5AFDA2AF +2377B3E1CA0BBB1442DA68C316B0817DECBE32E2A4B7608D3007C740F78905CA +EA5EC147472821B886FB1A678756DD584EFEE26C81F3A9545FDA4EFD44E545F1 +8F936E4FECA8F5E7D3E68D71D3B8C122ABE07476B492685496588BDD8C639500 +DD91F576C77C8C3D4F8E8AC2E6AC308F923BD2F231438AD39AB7FD5FEF428D61 +DBBC7803F12DC84A81EA8CD982D6CA26A63C7776ADAC6A5F300656883AE97BBE +217CC1F3220B498527A826C557669132D2F97E20029BCF14A9A896012837CA40 +EDBA10810F4E7A0BCB0F7EEB88842AA6C8360FE21247FB0C3BAA86A413DDD20E +F5C3E5349A96BC9C7D54AE493AA18763F407040C89464F1F9474CF00DA0A6B49 +02604EDA77354E75B67CBAF2051BC92EEFB603D712A8A6DBA63A0A89F37451FA +E3E99B5039EC4478106FDE29E4D7BE88537C97A2E03372C07EC4D6EC3E159618 +6479EAD51CE224EA90C9C951CBD81E02D30D9DAE9277FAB7533CDB40AF16A1DD +35D5FA847311A5868596C49549BC2CB7FB11334A5DC0235BC107EEDB05B92A85 +B198C70DCDE3B70BCF42FBDA810A3DEF5802821B55B42C4653C61DEABDFEB3E0 +9A595EB54994A4B866A99F23CC95697F90B0A4B460994016D12B85D2CC92B572 +F62B9A1AABF2D9CBDB887D1F58A824E080562A3E4A7C6AA02EAAA47907EE67E5 +46169E42148793FEAB87D15B626EAEB86BDEC8CFFA2B84F52BD34A2056765E09 +63E0BC58FC24B297D68D8A1D3332792C4DD29EE1728FAB873198F893E21C8AFA +D2DEDFB86AA5343984A6E366F837AF76EE986ECC5BDC880F087B6F71CBDBF917 +8B38EA2EFFD281B1A8E46666A74F11D849709F871C45DA532D12541BD8F74899 +95F4B59B9DFE7F6F5FD49789865298C244D95881D2DB1889D0A41FC7A34777D6 +9E6947A3DDE605111352262F0990A9E558274D66601BF2B67D55159C7514F1E1 +1A7E5C074DE75B9A612A762C3153B326C6BDDD276C2066F50899A6EC8D4E1DDC +6FE4C7056EC63A2E1F6872D0C74FBA9700C6C4E3689F8ABA302F49A7E3EA2B4B +BCFB7FBD3420D588F61AFA044EB78DF7C3881017C753DB1DA3F35933B19656CC +3CED882CE92EC2AD79698EF383D113D85C6F3DCC4B0787F3CA994A0830EE3703 +0BA4F77439094180813BD2E230F2010ABD7868EB171307253CE61F9B228C6687 +F849FD6EE7BFDCA93B097A1F1DCFA09E351F1713E4E297F10C1CA62A8F461B5D +A696C14A1917F2C92B885193465E63F94C151DFF3E463DC3767771BA45DACCFE +9A7C1A408A0BA54170D70A72A936CE4C0D4DC4C185040D5530F02A9443615826 +7BF99C96AC1F027CD229A9ED6BEBEFB54752EAD461E112597F63247C83ACDC2D +2F02720E242C0FE40F92ACD4526E93679B6D801A9C6461491A070850CC24B3A8 +78D8E1A70440B37FBB23FE8B3F562191F410C6E68E7286BC35423C1821F06304 +4F4DF0FD723BC06365B3EB2D0C5C83D219F92688D798FE1555BFC2E3AA8E18F0 +58DBDC9827E06520AA3937E0D01E0966FB90C3E32965018AE2B5F2CA42794CE1 +2A22A211CE8D96A5FF98BBBC1DDA78BD9EF66F34D74F9D28F7CD1B4891FF2355 +D05F8609E03969EE85696CD194287A1A1909C091835BBB4C4FDE8AF355B1EA02 +7C3BAF3782E46F2FE41CCA69C346C4F88B640A25C51B85D1535CB65A10316C65 +8AA3914E00671E0DDC0C41D560C66E677BE305B1C9A167496E9BC55E3E61FBF0 +454ED084CA7B8542D09C19A0414782A2EC87700A7DBCABB76F32D20479CAAF1A +B9FE677A9BC68A04FC04211F65CF6B7AE4BCD58D8EDD334101BB4AA9F426404B +73C5E96532F99284B408438EB48650A90FD34A2120977F5F7DD6301E993FD1EF +675A7E6176BF57276D3FAE1380D9B1E4B2CF158046EEA40E87928CE9B19A249C +E2C45BBFE7EC8302D794893656C086031AF9578BFAF49E6A866F98D1CC1DE410 +C2667F4A82EB71BF6436DF43BE28138EEA6A33A04B0B414450950C40708E2058 +2CB26EC69D1645BE59C79BE73F9767C75667463546B650502FC81F21B5C4D406 +DBA42CE9F1CF16561266E05874C91490DB83C01EE0339E7A8DCC5AFF63D3FA4B +552926E42DE881BBB4B0D0BB380E0ED76B72A756B4CAEB91722F993A6B4F49AE +A404FBBCAF83B786A3D5D0C5AC21D499C743D5A9375DDB1697D28E13F47FA43A +FE64426660F078609C14EC6383561C2ED52C3B0F22D404776673B382CC17BBE6 +ADCF4A7F3F7D167DE46D8DEBAE03648685FDBB2367F40B6FDC44090F32AF4802 +BD5EBADD37B82B429A0E22E9278F2E1C6BCC2D8649A949FA59A8E1CBEBD883A5 +430CD0968816244C9D05C948102A9B9D9CF0023B7AB5E3481A1C2EADCB42B6A1 +D5891F3115E42F0A18E30735F156160E24E38D358D4376E0BB35EA62F73DADC5 +0EAF316D1FEFFCBCC1808EF642F285D3B67E279BB617E29B10E46C92496A7568 +900465D114CAFFA796FB47AD526011D42B486078629D6196F9485B66966D0D47 +9C6DC7350979D07D8925A1CD3934495B034456D8BA32203DDDC3C545E1FEEB3C +85A12370148A0ED20D56DA8A34409226A4D38D350433B0590B93DBF4EE792A6C +28F5D36D91A0CC9374BFB366B81EE8FC4A29E287B597A845B45C7486E3F76BD1 +13418C33B8FCBB118BA3419B55D291BE1D200023002FC6DF412DB7FA559C2CEB +2A4E359CCEEEC0B7709C8D41BF93B42448582C8E8A3E8160BD43186A96C66BBE +591DDE7BAD8CD956DE262047E7CF1F174F462FA6DFDD274772F331F95D6B3557 +BB8E02973A3AB6F3B8C0D8BA680777510A0FC83689E15220D618FE48AA0BF540 +11AECC854D11EDBAA8B7A8C95D9F4385407F5E8324A2B249A3E50F983445FFBB +3DC77A4A6D7CA7ABA7341501988E6A446B85484641B0ECD10492D6804F0FE1A3 +7FD639D14146B5AA2899CB7BBD4537A37B3890CD1C2A3B3147F71A5B974E4750 +A0444C4E14BFD00A9A5E7F4E30948CE9FA820D15250A2A1D87E7F1686972D0FE +80DCACE154D3E7AE9D7BB1CF4D2E893B5F010D8B1268116147F6D7328F260BE8 +BAC184DFCC2745560910ED3901D4AA5BC1AF68CB14A3BA66E235299024C2BA29 +65CBE67B56A6A5FD4B4AB404DDD02E520E2084082A6ABBC6F62F3BD146388B26 +A107DB3FFA2DDE3AD94A267D1403E8F0D018948F91349C870AA70AAFBD2CB866 +58D40D1439AD4BEFFCDE627E56AB5E78CE0213C214001FBE22809BE3FDA6D380 +31EDE1E121168BAF879532F11B02A0EDC08A53AE7B0B27605C4D726816E08CD5 +47550ED2014B1062C1F35F3F3A3290018E2B459CEBC43BDFC8AA6B0653A838A1 +D832CAA078C802C0E0F4125911CA9118AB0EF5C38EE0EF4E5A898D4E8E81182A +B2754E36F9846CA5A95D72AECF41F7E2DAAC726AACA518E585261014859EF503 +B0A00369FB384E5321F2EF712053C34B81F235FFB9E95638688FC56360681C19 +5E70974D7C64FA3B885D0C435335C62344F3FB675546CF255B3E350095154EDE +7227589C6D73A140E577645D0A6B45ECDF28A5F7FC3E0AC6A893662E66756A22 +485E8EED9448335A643E67C2EEF06998083C39DB6024884182436DBBD4FF630F +38CA84DEB883C104C6BA4757A8816160F21AC23067BD91DCF8173361372F1E53 +1ACF0FFCEABA31C4E2FD3E5A6E28FF3D480E6062FB210CCBD995BEEC93989852 +FF223550E7100E2CDEBD81C548DD3F0B4FB9C694BF14D7C1D842DA4B50647318 +45452B2E61CCC0992B66DACBD66664AF8E14BD784C309DAAE8336321C2A40625 +94ACC155EAB00D6B5EE04A4A31416B4D1EDD27FF915F43B77DBD567F201F8C12 +DF9B272813D89C9F960A9BB37BEE79CE8701E418B03AEF4604C273DFCD380F54 +350608AEA632A54BED07DC0690448576C5449AD9465CF06B5611ACEE28C94631 +B5CD0E1EE997E23966E494EAC2E397A604AF67D0E55F48B46ACF92DE6E13B8A3 +39C0FBF7B87218D04C6614FE336FEA49E26B7045370DB4847F80A86B3A97933F +4F5BDC84B75E7A01B36D1C2D5A0F4F2C873AE44D804732847525C15F900EB9C4 +65B90F90F343E0420392AA43A4F9F836ECF2CB9FCF4A7AC4E564F71506C04423 +C42CC07FA4F4B4EF5BF5464D4E76976DC5164A0E134329D962EF72E36C2374EC +339DDFEF01B8D43459AFA427B44EA035C41936DB61E512EB99B1B98C94E56775 +442484DE5A25E67F347BB5A4F1DC5E3C50901187F6081C2547A71E13B3657243 +EBADB0BB43F920C15CE4D4ED45E481A40E6A5EBB944B2D44D7E1CF2D130A7B2C +25AB9A8D48CBD56637B3888CD66135BEB00915550CC2EA18229B068E5091B2BB +0EE55CFEDE2695316911B60C66FAE3A47AF8C778399F1E029C8AC3898602E89A +2E83824A18D289A571B9F14D5113543F14D4C085ECBC20CA010503A068530D54 +5966DD29C1E04FC8CC14E684F1D523FF8D5C16E776499A9BCC5546C3019A7363 +8AA39908E2AB0F4236C6B453B2BE8046F6D512929283718F8C0EAE110A7E7F3A +E649D9C76F21F3C98D274E40D1E7F7E9211F6ADE82BD73353095A862EBF943E2 +744D66C11EDD6AB4CA6DFBE231750132A1419F961B75F654957CD33B4D21C038 +D88322B91EA35235D83618A10F040FF284674D7AFC91D58B50BD591B870D9B79 +F79F5E9BFDDEBB9AE3CA2A17A439082898598ADF8DD54A42F82046299153096E +FABA8F1A4FAC50ED0CF9CEA7208B5F39514BD52F4B93BBD32BA4E19A8C02D1BD +764F7CC39729AE94D83620269E1EE32C5E7CB173ED2947580C39F1AF782B1465 +F8A4CAD36261FEB051A0677217FCF3017FFD173DB260DC6C66F907C252CAF4D6 +1DC423516B3487E74E6108DD038E4CCF7E008C3286A9BE150F46DF0D24AED27A +D0AE2B1F60899E9E1872832673EB28E2E465BF0734AC459829D42D7E31EAFDDD +DD5F63364872EF24C99EC5A346F60DED135EAAE1CBF8F9D051CA39DAA3F592AB +34193B2AADFAF020FE42293BEC723633B38A2C8C65FAB0CF772209FA8E1E7A82 +15316ECD908F1A8355BD409B11EBAB00D80AD389BEBE357D107827D49CE9A014 +5A7536AB85AE8206F5F43AC6409F59FFBDACE58AF87D3C4C6EBEACCD801FA923 +AA04E542D23E389415F423065111046BE1AABF234AA8156C0F0E05BE139F82F9 +489A8766716287088F451179E180572C60478099C6A507D2B8A9D2E330872A83 +9A56ABDD97A467F5ADB9E08A9ECD62AB1F600E7A6F4C8905497E7965873448EC +C2529C56986FE1E3C48652DD02495A53089569183CF75C89FAF88E38192987BA +C061B029A1475CFBD00157F1256365A741144EA2EF4FA2039A2555CCB89734CD +A6B4DA0482B2906ADFF83F749C52A1474DF2832A4659B60CE2F203A9B14A8D9A +088B48B32D3D1E13EC4A1587CB18EF1E15933762E7DCEFF2E8671311A092B2C5 +9AC2102CF157EE42B88050AF6B9600745BBC7583999F3CA0962F073FBF7279BA +D3F16ECF48D5973D3610B8CD7F9FCBB48E5D6F8D8FC4BA703F7C92454DFB2BF9 +DE7812C8370F30424E4EEC4C3EA5B1F3137B16E3418A4C73A9EAE3A06E5560E3 +494E71B8159D7CB23FC90FD651AEB07867C8A2E656FA36B193AA9261C98D0C45 +0735570192FC3EA22DA0A8874ADED40D3AE130C051D266ABB4F65DD7E9A68BFB +097E2A5EFF411D26B9581F0D61753440F91C325699E7CEA90107F55F9BD478D6 +F17042E710C9387F975A3BD7654DC113F17182497A4289F3C81A37A48BA8D66D +3DF02BCCAA5C32D71B6E4C7316C9CAFFD1173A352831D6110ACAAADB21C4751D +4F2C35A8490999013485F6AB5E4497880CCBE78CE8ED5BC623BD2F4E230F0DB8 +6522E203445073A11C4663E7D0C1724992072519DB39389662F75CAC57FF20CA +B4AD604ACDD7D40560125B9A77613FF1C51BBB91C75653A2800C40545D446F56 +9663AD7CE3B3E9CC3BA7D907561FF498C1519BE0C9984F7A3A33573F262D9E75 +F547366E8EFC46F1F984E2C6841FF9ACEF44D8804A2A567E0A75F842BB57DB2A +7F4DD6738CEF16A4007A3E8FAABBBD19853CBD70AC8CF599C651E27AF4AC2E4D +4A87A9616732B81947B13AE0223BC0DA77C206072C7538574608C8DFB40E407C +AF01507296F1FED01FE9DAEC841864D857FAC306EF001053DDA9854EEEF09ADD +0C3221E3F45DAA2C747C468D471DE4DB8C091C9CF7A22043B9D9AF23AD2EE11A +154BF601D6DAB725C5CBD7D23B955ACDCC8DA70D53396C0B0D3CF5D7B110E9FF +17DD2D73BBB99594C2262231BBB56FE443015D813C3323929349D06B51275B40 +84A7BD1875411E68FD8FBB062023CB0EC186FF8027AEAC6F35B00EF9669047EB +B0E87B06EB40A9968052CEC8E4BC2354A963CB5956CB300624BF3AB78A3D1A63 +CA4A40270DBFFFAC07F8EE8019DD1003A07CFCA1635ED2A51428362DD52D7826 +DED05A0778ED5024012CC2ECBF1A9914D8F81A02DA5328B2E32BA78FC15CE60C +622021E0CFDE12AF3B284CFCF047867D399A8DD70844D12A34AE7EA5DCAF6CF6 +16C62406927FE0CD3A76A5DDCB6035E2A45A0A1EC85CD2AF59E7275322CAF01A +D54F3C49382A065D5D4932562F964CBF2174D0FA07A6FC3B0BE43EA1CFDA4B88 +BF507F964DD52B6EF9C2844F880271F7639B4C571922A6154AA02FF5D042FEBB +506976CAA4B8DEB70BA2B063E07B874AF5F198D7C45E229AD80D394D7EF7375A +A70B62D2719C6598C6124DDC0B562FE0659BCFD22CB3B1AB5D7E2726CDFCF88F +B13DE122F2A3DEFDC2E99C902C5761E43C7A1A43F677931AB005746566FE3C2E +962BD9163E099B57E0DAB0DEB69497F6E9B851264EE594FD90A67843AD7E05EE +90119F7D88483955AC3FDB0D32B7B1F1E31B7E572AD62CEDA14028F3EAD01434 +9106CD651516E13997EAFA17A8B5026B9506C66151CA9EDAFA128B13C99FF662 +CBC821CBD3768C3D4A7C3DFD2A6C27F643D905181E7E088C7B619D118F4B58E7 +E1A27289F377B188D374682A266BE157CB0B478484016BF6984013572FB3DCE4 +00776B23D3F2DC8DBBAADC2E618AB399061C94FFF2A9A47835AF1E2C92ED0610 +5176407975A0345D5371843EEF46D445082B9780ED5D326AD2AA7591AA726BF6 +9FA17265E93F600D76FEE14C9106A94DA0DEA690A073ED19888E38BE279F22B0 +3651B85A662314C10DF7C74D89848148486C33372D688167F95A956280BD5A83 +8C06D67C02A6AA3C55CF799DB8557FF823F062D9150341F98BC2B2BFB84DD14D +FCAF2CE7042F7FBA8754A59B1BF1476468EDA717B266D35EEA7C4107D4954757 +F762245CCD997C8451E5E9E845A6583D8DCCDD7ACD65136C2F382EF8DFEF4738 +3C8CCEA8F8A5DE43BC6E5968E2DCB22E237FB65357383412A9083B7A9BA06B60 +669A320D295D41B9CC65A05F1C3CF4C860324E424B74B50E68F67F84C176D7E7 +22E2E0E85FA0BEA08476CE11F8930000B6096A512044D54F3FCB7F7BCC719723 +7394DCC3B33C292ADAB50AE17C454333D4F93D938F934E0F1AEFC5F2BC488883 +44CC90AA3FD17CA3B2117E6E2DC1FED5EDE855A4169F238181C77CE4ACEDE8F5 +E77B4A07D17D173C82F0B62D33AAE40213E5BA93C2930DFCFFEB9DAE024BF85A +90BFCCFE3FC5F99D39B2E8D2686AE1417AC1E5BB58D105024703F38AE3D90F30 +EE950E8C86ED718598CA966D841BD379C8FCF356CA568F995846CD2F4B0DBA7B +46FBA479EA98E3B92EE5C76B63AFD766CCDF0560148F30A29BE6EFC725EE60F2 +F5F7EC808795BB8C59B568CB6B927A2E3F8206180A735B57FAE842082ABCBB2B +A65E38BC4E9253D728DA0F8BEA769428F5E8328F4AF412CA14B056B2A8AEA438 +B4AE59E74AE6F3432AB8C729045C302EB3EFABD4D14DD542AB22E67A1D4DDA44 +8D528DC404FF90FC92B736DDE0C2D4E1D8AAD0C4C285AD83E9E16A2BF5D3643E +5334AC1AC57C48A8B0875E379F4A7EDE97DBD65920EE20C60F16128324B23BFB +369A4F92832E679FC855451BC789F97D1997A73A4DBBDAF68D14C7713A4F1B56 +F55CA97A5E120E013FB41A469668B02B3027617FCC9EEA2BC6FBDED8948CB4F6 +C76ED2C725B016741936BB7AD5000E89CDFCD7B51A18037B6CB661E95F3E00F2 +99FAC8D75C1B8AC2F3BD84DE2417C0D7AA6526DF55DB0560BF4BE43EEFB23ABB +9282709C58B1200CD1C967F06CB311BC3BFC8B651CB0F6B34F6E96ECF5C51649 +BD4C142EDF0BCF97AAA83ED6231483539AA4776C92C4A968FEECE297435AD0C1 +F27C45798F0671AE7D36862A7C4AAD5523F96698D1BC679103435FDA131ADC34 +326BBAA7F7BB7C47A232629435AA4C9DCB6A2E1A0DBA73DC6859FAE5FA6F15DB +C38A6DD13B45C55D6EAF468E22A24FE97C854FD8B42B63A456FB62F4B6004A6F +2F81104D3A740690B7896D7140FC5DEE2A803AB13AFF0B26BFD0578B0F2407E4 +A5D5FB3128D0BFD6BB49FB727452F84EA5A2AD6792E91D4E6F55462701F85ECD +8611A2FF2F2EA8DC783774F860D01C616E4B37AC8074EE264D5F5448DC91EA2A +E7E261C7827787D9F4442B969353A49C948B6BDF7E868C8B9AD10AB31E8C2746 +E9AB0ECD16F0AF5BF7DF3570A7663B0E200E26F7745D6CBC1B0E77028A66C6FB +076A779124F2C19E77200F7D74F30CCC8C7574CAC587D7BBB7802AC878AAEA83 +C81BC3880512B7612605EA397468A5C43D666D7D9A6E3384500B516E86F14C81 +6643E5833A2B0D57AC3A39CDFED704DE32519B62532E6CCB85A37FE6B58D8348 +7CA452751F2E75D5287E4DF94C8512014A74977CD682E08D3C884653A495A254 +4ADA8E700D0D39D3A122E720EA9CE938C4711D117B5A27C8FA799E402C4B40CF +91AA834656B4064D8B40F620ECFB315EE9C555CCCF8AF57CB5968A37ECF13DB0 +EFC479FE9716E6B79C9FDB4E22106802EF1D248D664528F37E2E4446F6B10BD2 +A4D5D4179101EAEF55D57898C3784111BF27D744C382058C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMCSC10 +%!PS-AdobeFont-1.0: CMCSC10 003.002 +%%Title: CMCSC10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMCSC10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMCSC10 known{/CMCSC10 findfont dup/UniqueID known{dup +/UniqueID get 5087402 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMCSC10 def +/FontBBox {14 -250 1077 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMCSC10.) readonly def +/FullName (CMCSC10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 97 /a put +dup 99 /c put +dup 103 /g put +dup 105 /i put +dup 110 /n put +dup 115 /s put +dup 117 /u put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BB89566A9BDEC70EB4F2 +048A6EB631F05C014D372103E37FC3FA317EBC9973565A638403DA02E48B7D31 +CFF6C241DC5CDB470561002FF46437C06EF93BC99352DF04393C661FFFBF4BA2 +0723ABD9B3E9CA9E63BA57EFDBAE684655CBBDBA15ADAE43E1A2C98A3CF060A3 +D16AF8FE3A49B50A24C20EEED716E49AF6013D4D38CD9CC41A91C17E4D04D79D +567E1EF49110AA9C34464E95D81A730ECEB2C9AF38FBA6B45E253288438B4CB3 +DC75B3A906D4357293BA41E59C35223A6C9CBD6FF5FC90C2D07CBB376C7320FF +435A6251822BFCBB612CE630EDF826C37E95F541C21B93FCE127591D5E38165E +2B58A34AAE37712BC58B63FFD70AB80F4F24612CFD2F1466BAAF3CA2BCB45148 +D0DEA0E9B8FBA4C4FF5B8B3CB02E461355051842BD1C94F41066B9B909DB83B1 +DCDCBEF7CD00A43E4C0B8191A29600CA197F0BA227FB8309BB539D2A620BAC70 +8A1AB2DFA51ADC9873B8E5582DCD3ED154E5D727D1665F99BD89883D69E6CC2F +DB3A57AEB612171A88E22F038461DE03FC357F771675E34E90D4D19B4B36891C +9D2333960400E97494F4FC4DBCE6A73C34A0409E433BBDC0AAAEBA7D3555066E +1CFBB4515C8B573C9B9DD12ED5B6ECEBE35AD0DDEA9DB004FC6CB540B5117B49 +59CABE5FD74C6F5B6482B42C20B5FF0467D1DBD7CED2CC651CA57852B6FBB402 +A6764DB342889132C911CAA713A7F2FDD8A5E849345D6C81025E02F5B8B682BA +90CC9B467FBC37362436EA6BF8EB62D784B01D5430147945BC09D1F49EE89F2E +3E2B8E6D439248A56F82F2E03EA5C7A922F2813BE6538A3A423BEBC55B345AFB +3B3C125306749E137C647D78028AE1FBF3E1A82C260132832A9668F454D39C41 +736717DED0A99F6B11F005F0E1D07FE84713AAB4C042FDC166AA146D7B5E9198 +E4F485BE5B135EA281FF1C1E616B5AAF02771F58C5840CB5A427FF9794F93E94 +17FD799C78AED1DC4810BCEF4C6C51D3C1504EA2C6F2B29805B7ECF97B5F637D +FE92E168CB9029E90404CB54FB312FC7AA8A9F2F524C03E61F03B1E31D4F061E +1677B39D5D30C9FD4673E1723F4AE3CCF38593AD6D7F61E9DF3C010E51F25085 +35D51105E1464BA146A78D7297D4D310AD91342A0BB942034A3EC0696B467367 +3E39D202D637E6B14D0EBCA6AD3CF22B07D4CA69C0FCBB6C93782B2F0DFC5AC1 +5D8A16CB5EDB671A0C1BA9D10F63CEAFCD0E06E42C730C8EF769CCFD57937245 +658F486036D37E8BDDE5670A212FB488A8753322A5B170C9662750AA958C0BBD +8E97D8239D2A08B30416504DEEC4E506013E037C91785C674F8A6A44E23FEE6F +CCC00CC5E4D355B0871FDB8ECD64F70EE32449BB5D6F84F8C8AA2D5B1A489BA9 +D7FF2DBAA8D0B84054E93D64D3E77850A3724824914A0F821EEC3D605DD851A7 +606936B8B9E24D6E932E16C448140FE94DD96C75AECB73850035ED9C04A1D93C +64B21E7D4657E030483EC5C3554AEF8BE4D0FE5B9743B875340B09E01273DAE8 +F256C50A1A8F2E0417440A8BB0173F59E11523E1CEF2593A4AC5AF2167627B00 +C5EA97D125EB8A4BD4C372877ABF10F5B7B149D73787E0834BFB3084E9508DF7 +072DD71637019599252059738D4D6BC57A9358E4B14F6AF9C4B31DB8E25C29B3 +7A15F9953BD73ACDE5F0445A5DC406BB4635FAE51C1D8202AE31730E6F355317 +1DC197DB0B6177307C60E5D38F4487363EE051B2E609A52BC4D45B14B6558B6B +5E1618748794B8340752CDBE7756C068975B559615D4CD5A97CE30BAA7B2B1A3 +2FEF2E055232B24FD8A21BECDE1B6A479A28EC80AE2CD16DB50B30B4A6CFCF06 +491C7CD5AC29FB964D4846415233947522676DEABDA0D9535F8507D33693930C +B4E4240A02B0CE7EA288516B8A6EF908D7F8BAF9012D052C6AC96D9F8F6ADB07 +8984F3559C5E7E3022A957982155FC9CD599C74E18328D3AB46F9DD15D1C4C3F +9B93ADB4489BA02CFCF57DE6270F3AD2F8597BE71786510EF08142F430EE5568 +4F9DDB792B7C46B6135E341DBBF062FBC50FABA80CD4A384157BAE57CBEA9781 +AA4416323265168AC097DE7E30A0D4750143A4FCE70A863A31876A8FA5327C3E +36E89589E363AA2B1A6E8B09F5AEB8FFFD0396067173465B6503383DE517A6EA +88C0FC08578398C2A721E5AEB29F4AC9BC990A50CD87BD35A11F9E81F68E7B85 +5E5B95A4F9A5D30379EF90D78E1E466DEF867BAEFC4F5ED2C762BFF099C1C2B3 +5E0DA1C2FB33BE1379413CDDB1EE6BB3A495331F72F2FAEB8152E8AD5FD334A8 +AAB0082A71D5574B618EA8D487B8FAF1B445F3395B1E21224F5492A0E06F5152 +7726835C900E2E52BE3B7B654183AEDEC68053DD0AF19EF6DBC10B6FC08EC7D0 +CC0E2C8FAF8C9A4C21FB7C34E074BBA4EE64226BEC8C928A784C1BEE35B72EC8 +E9295240B29DDC2539CD118BAC38DB3917D14CD33AB45FE47E827F2A2B193AFF +53C5396C52CEA4F43F06AC2D08C74CC85D608CBA267175EC31311EE25AB48DD9 +FE811B411AE426C9FC0B6044D1EBF130231623F1566CEA4D1C06D8032FD9808A +94479C842BC41B675CF6B90113BD681F8D43F51D5016D80EDC11D7640FB950D4 +E709A46184406ED90D0892A4CD9062938A8205697A200DBE1F38EB166EFEA0EC +4FCB45CDAF82EA103DD6FDD03D146F3E42EDA6496064DB3F4FC1C5280C9E604B +D5EBCA08BF2AAC90156C11EF68137DC76502EBF216F3AF3EE30DD2676D218428 +F41C655093F8B530FCA378B5769F262A6FDB4B66B83F18F050E77227E28D71F4 +5F4425CB8D51B3DAE872CD86D7804F870BC564A6DA1CA13EDB00D131CE4F6460 +7021661B99612629DCC20C85CF155EDC5111E015A77B0B82A8FC1EBB374B7EF2 +361419BA93B857D5C9944BB5B4AEDD86ABCC261542077FE09701C96370168579 +5F89D5AAA08D700E2643E88C2FB8D1D56D37AAA9744872E7C050B4CE046B47A7 +83F224FA9FD311C955EFBF173042C8FC66524135F579B1397828870D5C9DC71F +8615FADE2A1CFAEA90F732B6C266E2F3048FC43EDA7A6B6D98E9DB793CF457B3 +F5877E7A055C92B0246FEA8C72B3B3456F93BF36E2651D32CD614C3AECC0B4BC +F824C8363E593A6458D37408FC5B09883B280005DD24123E2D4B1B85F4113327 +EEDD9186A4AF2CD6439B46C5C168C125CA80F9EE9E68906620EE126CFBF26E15 +B269838A54224EDCFE2A373EB750D4829BFA410DE5F1541E428BB1E024AF496D +F5F1C151F5A645C8622F2EF9088D57A2811868A8A8BFCDBFCE3ACB8463AC35B4 +8B6F44E1C1232805842F56FA468F81FF37D5D55B81CA56058558544C142EB3BE +07CFB1F75DECB1E48C14D6AFDD455989AA6FFE8B8DC54F462B3C20E31D270BCE +8E68E2B43A6625AC7E9792704FAAD6CE8BBE0B341DA7189EBB3E9D5375B27FD4 +12506D5BCA50AEDC6955E6C3C7BAA84BACAF7ABDF3A270C7734EC3C6EC22793B +E67B0E288F99699D38DA8B79F2D21DD97945FBDDD132A8F0BF947950D3C0B4AA +EB7B2C435AFE54489E1930610311D718AC610C21A644F34CB2D1959B3066F39B +EADEAB5CFC6AF4D191D86B02402B00D1C5262707861C5308730579795EB53207 +A291A27A8B5C4DAE0A87A0C6A260026CA3CB620E1002E066A515D7990F3DEA29 +0FAC962E0B82B7A6C86B1EDC54007822BAECED673FAAEF88C8109777EB79A53F +AF3C58546974F2F56E70E9B5CB59ACB5C27CB01895557B2D82134D7F02029B24 +3331621F38E68717F5CB68A8892D0B9C0A8ED4F8BB56E80505170D44C6856128 +2DED0254ADA4875CF56B4D97372AAE730D4C77A2940DC8C178274DF88A9EE037 +215C6FE7B9D481EE4DE809B124C0270782411ACCCF89906A8B143D0BA8B2CEDE +E9B90465C3E57A4FD9AD2702323450256ABD09A1F8C26F08480317C08B75B720 +70A161C99715A35A94DD5C9647ED0F8A5337B774C8E54F9653AC859485A1FED5 +37B725A7E4BA58711CBCDA6054E34CBD8E9F9460179DA7DBD243D81A1531FDDE +BF2BD425BD9DBE75EAA333B1F5793669A215549A774597E6ADA16D323FE5601A +EDA41092730009A99BF5B5AAE281844A6BF3292D4D4EDE36B4FD8BCAEB6EB72F +AC5D3CD53D0D621CA9EA8D254FDCB2B5161EE9E80B266563F669805A3A15271A +0753983004A1ECC7FBADF62AFEA4DAB49A178C231759857DB910668BDB07CB3F +7E8EC24901863088B3231EE3FA563924032C91CA9D68DB398F9BD9AC0C651EC8 +9051C9F709CD784F3FF5951DECD7E869ACC34B83AECDB011E6594347855EE7F5 +28811F744A4BD70D4E9077EA7EC19FFCF612689F12B34332857AE41F13E6D16A +962DB9B6AAAC167B9FBDF0068EA13412F318384134B29F3F0C399F1973A3564E +F9C3C39B5BDD4C98D81A6CB476E565860B50704BD65ABD630A5F1372F2D826F3 +3AD47C08B8AD3176A170C369EF3CEEB190134006D6135C5B8CCDBE1C11FFF1EC +3F6D8C46E15C4F5EB9ED9F31A129594D542D40DC3815CD075A0DBB648D868AF5 +15A05C4BDB28BF23653A3AD96CF6AFC065DCCCB23D5D9A945F8CBB539DD3BFA8 +DB8F1FBF9B6F25B41EB4309995CA3D5D6ABD70CBB4A2F0C6364E5439AD1045FF +72F6B45A30BD3A548CFAADDCC6C15D46F6D783D3E520215751DC98335A4ED512 +D7D19235CDF911CC69F3CF4365B678EBF3E87C456A4E77339C74930083445588 +462529C22A96A28C5CE87AFA0C981F26CAED5A1C8DBCDDA612624DBE0373F026 +465185A4D8C73CCD8D71EE97116F8F7D341B87FD78F9CCB9FBDA2A7799711607 +6BBA855AE9D5C505870DC85FDFAAA130A351D56AADBFBD6A7D52055E3200F8B7 +8AE9A00092B55DEA8BDE224B4BA7FD4A191CB1FFC4CB995FEE1AC2883AB69E1A +AFFC09AB5B9AE311A030A5BA05E2213F9BBF016C8FA80689C069314D91274B20 +53FCC65C7D7B3A7504887525BFFA060304931672A078BCD7F269595686310E34 +E1ECA868899BC402D17EC36CE40D5041D7CEDA77F7764C9D98793F5334F574DF +E93CB10A5E8ADAE95CE63D2339557091B4B4911A4987CF21B7F1DBADBC2DD605 +8EB72473C1F2EABCC44E0D0339EECB55DA74085606C3F89D57ACFBF5755A5395 +CA8D4BD47E4EE8D8B882D3AB31A1F0C62E74654C7E041E4FF2693A38A9796064 +46526B0A37E6B5BF8E48E80EDEF81E34DA8F6CC9025936A4D0E6D709D61B7B5C +AB550397117F3F9D2F5A542A64DEA8E1178F7337124D6B56BA92F659AAD694D7 +391028731E01284BFEA635314A8DA8DF7A34EA3B6B2F8803BE6DCB423A9E8015 +55EBD90EBAE8A00298B3B6B1C02BA516AF528122C1F2B07EF69F5466C2C36643 +0D665D6561705509B7582D8301AF3C32E2F3B9433E3E04D62117C7E8A368BDE1 +0D4DAA1C415B2A6573116D2A169AFEF700A83F55D88813585E89C94C07802BA8 +3AE8F9BC3CDBFD9C2E35D062B1FD6E79E1EF104FC70B0AB09D12CA027F33F85A +22F0ECBB4AD55FE8C616B82C46CE69A600E4F767BD7A9C5F9B37A3196B038384 +5DEF76A8884425FE598A63AEB19FA698C2AF7CAA4983CEC789268E22BA051EE0 +20A40633D22D8F707626ED30E8273EAAD1C065F0B2E1718B5AC853ABE09330C3 +B0082A71D557169BC1559B6D285A3499D41C4CCF1F74884EC3917EB9C574371E +AFE8578DDCA459B8D22C0188A8D150437B05FB92022C95EB6FBCC954216B5FED +CBC7C90B9A1F061376A9840FB64390A6BA99CFC8279A86A730C6DBFD14C53C4B +7277D676BD42203677E9ABEEC8C97E13DAA626474513B06F8734DD784F2FBBB9 +B3B448B8E8221E380AB4A86D3A683B86A54129519D50DD4FE63B30954D805CED +A9A5D9A39C58B65B08E1C19555E927C6DBF7FD07252B2B57F62B905D6B488201 +213D106A41033B26FFBAC2E616DA6ADA6D560BADF10E68872806CFD6F6E19D7B +57CF1F7A030A7BAD374F16A977E0ECB8742D034ADAF9C247DA19C8AEA74EF6CE +DAFD6B1DC562FD3B77E4D008BDE4D8C7FCA9895DA1AC9EAA01C32A0DA712B082 +9438E77230D38FC4153E1711417B918BA6CC03203A5FF082AF880F48518D8271 +C1121E4F1386B30A7F1BC6F10EA98443F8A65C867A109336B808BC9A8E2A75AC +F950835AA84B56F59DA4C8A18859C3B68F6B6DE09A6675F639EA9107BDB67B0F +54EBC564BC2D781B61C14363A54956BA78A2BB89C9F966C94EEFC29EE9F4E23E +C0BF750144DC289F0DEE1F8A25BB52E54F656FAFEE4BD2DA57E1306BBE648051 +1D0CFD6A23A3DF082E3CF13197BF1B7FB22B2CD427BB78F455C9634DF989DC90 +7BB2AE247B1C99AB2062855B2948341B0F857ACD750B59E370A6698C6A1F5287 +72A4A9628A592E313956C242DF8277EDD2F1FDFB07CDC104275FFBF796D7518A +DF49FF3CDEC3BDFF1D290C382F244DF18005ECDABF0C5C2C64EEC4383E2E07DC +5C82587C071E59B46B7BEF31D268F39D9B12D534344FBA515E9DE8F166FAD1E2 +7D1558967AAAD3829D3F7EC6938D20E5379F414532976ABA844D97A5E9078901 +EAE4D0ED1F4C7EE7A2D80D891A5013D6409A38ACFA497F5A169EB7F9F4890DC4 +62FA6A89EA48267331F086992B9CA9305E16611E6AEE67DCDD588A25D37F45B1 +0DE75C802EE021E574B64B3969DE2E5061ED9364B646C38D4BBA86802CA6338A +94E135D2256920EBFB1AA22D9E90C7D16853F0DF9F2D942748EE540E4FCE63C6 +5380D7AB4ADD6CB00FE8F7867E4862D8DB432F28331428CC350CDF7F447A65ED +D7683ECA35A22ADD06E9FE6BAF060913AEEE7B2B8EE4798E437698CC9EB2428E +74CE73F84D0D2292DE709D71FFF8901C3505370E6F1D4E28E6B7372492C65A88 +159371B1D60D77CEC93B272B6C5394EE1D2EF9969DB2838B8E128553879A1BA5 +2884B0A596E8FC3D1E648B7E26A4AC57DF09B9CE09B2F91D8CA618CA52AB3DBD +D005A56A420366069B73146A6F58E88BA49671A1AB7C2070C3D42AA770285143 +40AE7D7868C0E1993506B07C086AD7D4F28CE2D15853FC5FBCBF9425D8012B9E +DB6E1E5002517659C8DA69DCEACA94F368537668843D281FC11782F1C5F71977 +CA215349EE6F20565DE3D8D8212A40E1227A4B22965FA64A0B02C62BFDE97E6F +C3C54FED4057EF9D258C42D7440C78C5E0CC58A40DD74ECED4152F70A93CE71A +1B3A57C46F74A6D27BF98C97CCD31A8EA487260F224A3E40F52C65490AB4098A +7B9EEB54A5A415C8C88568F7D9EFE74BBB785FA18AA27D9201F28BBC477A20A5 +D1307AA78EB8C7CAD409AB64B29E4115E45F5FADDCC80CA74B296C4265A40614 +37F2ACD8386AC0202D6FDB6711E8CB06442F209D781E940ADDD6D881D4F8E874 +357C533115923B90138FFE31D3577C6AAE60D768970FAAB682CD0DCA3E9A9A68 +6393E4B772691C1013ADFFC90C508D51B02D2518ADCC7E79F7DE5DF9D18B8435 +6129064DD1A3995E5A6F45D78287CC10A0EAFBF47223494C5EA934B1BC2F7C53 +686C5880303F9E3ADC8B100D441D944686E1FD811C646C6DD0224F6CF55FA87F +D132EF50450879A25242A18683BD6D0266F8F333F3768D1952B0F32AA75106D8 +EC0AB703F287E847CB91FFB88CD9DA174B49171822BDE34621CF41EA772230A6 +3088F8D19CF2364A329162D39E166AC728B267758341630B00398D64538FCC4D +E3E6CF103794C29AEF7F7E56970F6B1ABA87DC8D23E280EDC77556593D02DFF3 +154883CFE4EF04E07E7539A4750FA1CF1A994E99B656E728D140C83AE1F196AD +9F049188A4184C84556C0476BE46DDA8ED86888DDA3065C5091D99EEEAC43092 +40B97AE327215024ACC0134CBE91FD761C26A48EDFF9028DA28222985FAED7B6 +A1CC891D07185666E34BEFBBF77C6C32B88FF3F1046E4EB2CD942E70746DDCDE +002E74BA03A2B15E0529E61DCAC207A71F61C89D81B3C53C5B458EAC70ADFC54 +810310CB04E1A21FFBC5DE2429EC0989A3F2B6AE4290A005FBE736750956765D +637B7CABF7F9A593D9FF6C322895835C0007A78771D1404671122F9CF898AB24 +1A5648EF8C40B27FD537612C4CBC6E584FBD058DBD4F0A00C63A79077826D3F1 +859589B221F7F82DBE392601B0A89142648EB40BCD943E382FC7758A10F978FF +6DD9C3C1D284C5642C812DBF29A75A50BF63F788CBEA5883DC1544ABB49289EE +2C99CB03C1BA72C7320904C7EC94736825A793D5629EABFCEFAB8D28B6F23858 +89A6967942A943FAB5E5B26B8567CC9606DE60329C6D890843F700FC1F60656A +38164ED7976AD47A8E54940B9E340D61353AAD260C9273D45772AEC8E9F4F045 +9CC576D152757AF3B74DFB9B6962001EA9FF7F62C2E36F71D9B76BB99DA7631F +774795B8CD1E08480153496DE5E08A1F4BEA681D0C1D6336A49A222B0537ABD9 +75A3A9D27D0B71B8913E9355F8E56C5FB3E14B9D5ACC4F87339FF9D9039ADEEC +660B5CEF75E7C1772D4A3A4D0C8976A165766D9DBD0CA8132D17E5149AE716A9 +2E255277FB5294A96194C462C74AAB251A36941768EDB3EC6DC2C481393ABA6C +8BC2F3AB0BF5A6E5619BE16DF43BB090930493E00607B9F8C32D24F07482266E +09ACF6B41349E00C8B421ED5C40D3C40923D21F107185B5A135B36FBADE488C1 +8F0C2DEF08A6B185F2D25B8FD8DE7EBC71DD9C15C9F590FCD7B4B8E9690079F5 +39D809ABDDD79A632C99FBDFEDE0A89341919C6B397AD1C8FB7F3BF8C52C1B46 +7BFA51A4DA496B810689769986D6A625AEA159AB2F6C7EDA6E04F0B2631E5E0F +942624C194230D8A6EF32B3E1B4A5C37C6092246B328CFC926D17AE3B559ECD6 +2FA448C0FA94956EFED3BD7920EF42BB3F25907F097FA990FBEB88E78FDC74AF +D3D7BC983DE0F33C53780C9A8E98A40C2EFEE93067232133F83C4EB0B2AF0EFE +D1B3417DE2966B2BA85FB7A32A1B6B57D0EC8645FE35571746F760EF7ED4B9FC +53857A279CF19C0625D3FA9733C918A74E592DDA7FC1B088A8E323C9845306B2 +9C474BF8FC5F285E76B64020C2A377AA104483039805B8963116E882A0ED9417 +F56A2B0CC9B0857AB0D1B0FB080AC608952DE7DE07F81AF14AB81F90A76F288F +3B1095F9BD7BF8FAE8294990F0EFA45CDDCE3E24BE64C706C5031856E795A079 +C062F5C28B2429CAE52817C005CB1CB8F97FC6DB2E731FF72D8CD75FE7314C11 +3C83F93A5D1F5A4D928A8D9CBF8F66980FA36717E2BD4D7B52C7F7931CB91E80 +396D5593E022810BA1D5952138AA44DA13E001BE8F854D1AC6773C10F5E8C5E5 +FAC9C1C00D691A1D84FA88AB7A972CB521449280428B3B6B62AA1D7586C5016C +FD2F558F09577665CB2CA7998B1F54661994EDF2B82229F55A9C657B1E0206FF +4F8D30F309A2C988FE06D7E6A77AE5A44765FB88A4CED66F8DC8FD7469C483E1 +9849B7A365121843AA23E554102363A21342EEF1C13688E9FA27ACBC3E479F5B +E64E99C1DB82AC245BE81B1898EAF293D9CE70F1E5B2F5052CF248028DE1944F +E1416FF897BB9855119C4F5D237A38CAAC27F5E4A9696EDAAA485305A3691ECC +C283663B80248DF419E3F267BD10B935E88850FD369A91F34A6F3AA6A11A6254 +63FA3BB611268DCD43DAF1F273CFF5AA40177709DD3B5029D6135A47D7E4A76F +03EDD4DBFAD427D55EDB1D318749E5F3D7F3CFF981214960E8AAD77C0B9BBD24 +29089C360B059722B67B148CA77CC7BD0A3AD65539A373359FDAEAEAF0FB3455 +3D781BB5D8ABE9FCA148C0D612FCB9E33BAD7492CBE37F4ACD720B61B638C141 +CF3F06378534263DF7A7016BC0F159120F2B211FC57203652189D3D1F1EB2FBA +73248CEB7DCEF5DCACF8250B1582BDA94E3C2E4565EE0D7450761F0EE8A8B0B9 +F62F5D5048E22205C8F61EE206359DFA6318C8F9F67FEA6C0A13A9A4E2F195CF +2E83FD136DF96EAD2F930FEC1461C89B7755EB308D92A51834C0D0868CF34731 +4FEBCE3AC5B80C92BC4E3364C61F68C34A146D2901A2E4E2EDD9AAE00D964486 +2DD43FAA44163CBDCDD514EC0C9276900A047CB0FB70E21E618AC4B18495D9E2 +2D227915E49156E06E3753326CBCFADAE75F6505CB19D1E803BC2A83D5F3B200 +E4E8D4BD1CA4A3695FBCD4965AAE58587DC18B677E85E05F80FF870EC8B383C9 +21AEF9EF540EB0D7F7F73A56ED422C876FF091DBDCB4B2B7E3A4A25816EB6F8F +719CDE34FA58AA1738EAF33A81CB0F8B4A35804D62EFF869B14C4E275E4899C4 +9CF66CAE18DD7E93D4DE571177E8B1E3ADA0C216D2C984B9F2E23E8CEB48228E +D76C7CCD00 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.0: CMSY10 003.002 +%%Title: CMSY10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSY10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup +/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSY10 def +/FontBBox {-29 -960 1116 775 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 13 /circlecopyrt put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 +7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 +DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 +511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 +1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD +028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 +1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 +3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 +91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 +E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A +11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 +C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 +D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 +B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 +93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F +10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D +7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF +B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B +491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB +F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 +019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 +915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 +356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 +5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D +9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 +3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 +FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 +720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 +D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 +BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 +7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 +DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 +AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 +A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E +0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 +AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 +CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 +0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD +5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B +5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F +E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB +54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 +E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F +A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 +4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 +4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 +038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 +B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 +5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC +B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 +A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD +2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D +CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 +455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE +FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 +16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C +16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F +483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 +67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 +3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 +1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 +93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA +051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B +8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 +8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 +6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 +06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 +84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 +D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 +DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB +0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD +8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC +C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 +754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 +1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 +CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 +1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F +153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 +905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 +617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 +8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A +98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 +53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B +888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D +052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A +CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 +A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F +07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 +B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 +10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 +CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D +3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 +D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F +849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 +648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE +84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA +2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD +2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 +9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 +B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B +D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 +135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE +EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 +C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 +7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 +4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 +9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 +050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 +3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 +C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 +843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 +CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B +B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 +3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 +19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 +FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 +17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 +8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B +CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 +F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 +1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E +4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 +2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 +9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 +E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB +8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB +BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 +04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 +C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 +ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C +4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 +84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 +C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 +09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 +D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 +56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF +035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB +FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 +CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 +B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A +F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD +CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B +0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C +B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 +33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 +4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D +F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E +2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A +CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 +88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 +17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 +55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A +A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 +2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 +406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 +AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B +60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 +C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 +5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 +822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E +94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 +D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA +343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE +894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 +DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 +DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F +8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 +A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA +DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 +E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 +DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC +4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 +5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 +02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 +88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A +60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E +71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52 +9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016 +A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44 +AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829 +F1795501020D5FF0AD25584C1D47BE08ED6CE96278050BA67680A3B973613647 +A93FAEC756FC253B3693FA2D6491B276EF45751EFB306961788E7C15297A5822 +AFC5A2DABD0DBBFF0BE135267EA6B9D1B4E4760ED14895FFE1F8C3F564830001 +EFA901B8442BD2D98561BAB9A0FD939E0F856E4D2EB04A9A4496704109B8A84C +EA06AB0999427B3B1BE776004AE906D0F22159C051D88CF573A0255D99B56781 +CF326CD11919AA40B096769CD6D0ADF3ACEC7957621084ACF21AF1F265416628 +86B67FCBDE9370D4F5C6F5CC67EBB0A2727E074090DBCA459AFA1A4778AED4C9 +AE5400775223E684BFCB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +TeXDict begin 40258431 52099146 1000 600 600 (history.dvi) +@start /Fa 197[21 58[{}1 74.7198 /CMMI9 rf /Fb 134[41 +41 1[41 1[30 30 30 1[43 38 43 4[21 43 38 1[34 43 34 1[38 +13[43 10[58 14[38 1[38 5[38 38 48[{}22 74.7198 /CMR9 +rf /Fc 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39 2[39 +3[39 97[{}13 74.7198 /CMSLTT10 rf /Fd 167[62 3[60 46 +2[57 1[62 76 52 1[43 1[62 65 54 1[63 60 67[{}13 83.022 +/CMR10 rf /Fe 130[39 39 39 39 39 39 39 39 39 39 39 39 +39 39 39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 +39 1[39 39 39 1[39 2[39 39 39 39 39 1[39 1[39 1[39 2[39 +39 39 39 39 39 39 39 39 2[39 39 39 39 39 3[39 1[39 39 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 +33[{}77 74.7198 /CMTT9 rf /Ff 134[53 53 72 53 55 39 39 +39 53 55 50 55 83 28 2[28 55 50 30 44 55 44 1[50 7[75 +4[72 55 73 2[77 75 4[36 75 2[68 3[75 20[28 1[50 29[55 +58 11[{}36 99.6264 /CMSL10 rf /Fg 214[35 35 40[{}2 90.9091 +/CMSS10 rf /Fh 133[52 52 52 52 52 52 52 52 52 52 52 52 +52 52 52 52 1[52 52 52 52 52 52 52 52 52 1[52 5[52 4[52 +52 52 2[52 52 4[52 52 2[52 3[52 22[52 42[{}37 99.6264 +/CMTT10 rf /Fi 134[48 48 48 1[48 48 48 48 2[48 48 1[48 +2[48 1[48 48 48 48 49[48 48 49[{}17 90.9091 /CMSLTT10 +rf /Fj 133[55 65 65 1[65 68 48 48 50 1[68 61 68 102 34 +2[34 68 61 37 56 68 55 68 60 9[127 3[68 5[116 74 2[46 +96 1[77 81 94 2[93 9[61 61 61 61 61 61 61 2[34 33[68 +12[{}41 109.091 /CMBX12 rf /Fk 134[48 48 66 48 51 35 +36 36 48 51 45 51 76 25 2[25 51 45 28 40 51 40 51 45 +3[25 1[25 40[45 45 6[45 29[51 53 11[{}30 90.9091 /CMSL10 +rf /Fl 138[56 1[42 4[56 4[27 1[58 3[54 1[56 97[{}7 90.9091 +/CMCSC10 rf /Fm 134[85 85 117 85 90 63 64 66 1[90 81 +90 134 45 2[45 90 81 49 74 90 72 90 78 10[122 124 112 +3[110 1[126 1[97 2[60 126 127 101 1[124 117 115 122 14[81 +81 49[{}38 143.462 /CMBX12 rf /Fn 242[91 13[{}1 90.9091 +/CMSY10 rf /Fo 134[71 71 97 71 75 52 53 55 1[75 67 75 +112 37 2[37 75 67 41 61 75 60 75 65 9[139 102 103 1[75 +100 1[92 1[105 128 81 2[50 105 1[85 88 103 97 96 102 +6[37 4[67 67 67 67 67 2[37 1[37 44[{}47 119.552 /CMBX12 +rf /Fp 129[48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 +48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 1[48 48 48 +48 48 1[48 3[48 48 48 48 1[48 48 48 1[48 2[48 48 48 48 +48 48 1[48 48 1[48 48 48 48 48 48 7[48 48 48 48 48 48 +1[48 48 48 48 48 48 48 48 48 48 48 33[{}73 90.9091 /CMTT10 +rf /Fq 131[91 45 40 48 48 66 48 51 35 36 36 48 51 45 +51 76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 45 +25 56 68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 47 +33 68 71 59 62 69 66 64 68 1[43 3[25 25 45 45 45 45 45 +45 45 45 45 45 45 25 30 25 2[35 35 25 4[45 25 18[76 51 +51 53 11[{}84 90.9091 /CMR10 rf /Fr 134[102 4[75 76 79 +2[97 5[54 6[108 94 11[149 6[151 1[116 3[151 152 71[{}13 +172.154 /CMBX12 rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: Letter +/setpagedevice where +{ pop << /PageSize [612 792] >> setpagedevice } +{ /letter where { pop letter } if } +ifelse +%%EndPaperSize + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 150 1318 a Fr(GNU)65 b(History)h(Library)p +150 1418 3600 34 v 1920 1515 a Fq(Edition)31 b(8.2,)h(for)e +Fp(History)e(Library)h Fq(V)-8 b(ersion)31 b(8.2.)3118 +1623 y(Septem)m(b)s(er)f(2022)150 4927 y Fo(Chet)45 b(Ramey)-11 +b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150 +5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F) +-11 b(oundation)p 150 5141 3600 17 v eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 150 4413 a Fq(This)43 b(do)s(cumen)m(t)g(describ) +s(es)g(the)h(GNU)g(History)h(library)e(\(v)m(ersion)h(8.2,)49 +b(19)44 b(Septem)m(b)s(er)f(2022\),)50 b(a)150 4523 y(programming)32 +b(to)s(ol)h(that)f(pro)m(vides)g(a)h(consisten)m(t)g(user)e(in)m +(terface)j(for)d(recalling)j(lines)e(of)g(previously)150 +4633 y(t)m(yp)s(ed)e(input.)150 4767 y(Cop)m(yrigh)m(t)602 +4764 y(c)577 4767 y Fn(\015)g Fq(1988{2022)35 b(F)-8 +b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 +4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h(to)g(cop)m(y)-8 +b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s(cumen)m(t)f +(under)f(the)390 5011 y(terms)25 b(of)h(the)f(GNU)h(F)-8 +b(ree)27 b(Do)s(cumen)m(tation)g(License,)g(V)-8 b(ersion)26 +b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion)390 5121 y(published)43 +b(b)m(y)h(the)h(F)-8 b(ree)46 b(Soft)m(w)m(are)g(F)-8 +b(oundation;)53 b(with)44 b(no)g(In)m(v)-5 b(arian)m(t)46 +b(Sections,)j(no)390 5230 y(F)-8 b(ron)m(t-Co)m(v)m(er)31 +b(T)-8 b(exts,)30 b(and)f(no)f(Bac)m(k-Co)m(v)m(er)k(T)-8 +b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390 +5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8 +b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end +%%Page: -1 3 +TeXDict begin -1 2 bop 3725 -116 a Fq(i)150 299 y Fm(T)-13 +b(able)53 b(of)h(Con)l(ten)l(ts)p eop end +%%Page: 1 4 +TeXDict begin 1 3 bop 3705 -116 a Fq(1)150 299 y Fm(1)80 +b(Using)53 b(History)g(In)l(teractiv)l(ely)150 502 y +Fq(This)42 b(c)m(hapter)h(describ)s(es)f(ho)m(w)g(to)h(use)g(the)f +Fl(gnu)h Fq(History)g(Library)e(in)m(teractiv)m(ely)-8 +b(,)50 b(from)42 b(a)h(user's)150 612 y(standp)s(oin)m(t.)76 +b(It)42 b(should)f(b)s(e)h(considered)g(a)g(user's)g(guide.)76 +b(F)-8 b(or)43 b(information)f(on)g(using)g(the)g Fl(gnu)150 +721 y Fq(History)36 b(Library)e(in)h(y)m(our)f(o)m(wn)i(programs,)g +(see)f(Chapter)g(2)g([Programming)g(with)g(GNU)h(History],)150 +831 y(page)31 b(4.)150 1059 y Fo(1.1)68 b(History)46 +b(Expansion)150 1219 y Fq(The)f(History)h(library)e(pro)m(vides)i(a)f +(history)g(expansion)g(feature)h(that)g(is)f(similar)h(to)g(the)f +(history)150 1328 y(expansion)g(pro)m(vided)f(b)m(y)h +Fp(csh)p Fq(.)83 b(This)44 b(section)i(describ)s(es)e(the)h(syn)m(tax)h +(used)e(to)i(manipulate)f(the)150 1438 y(history)30 b(information.)275 +1566 y(History)h(expansions)f(in)m(tro)s(duce)g(w)m(ords)g(from)g(the)h +(history)f(list)h(in)m(to)g(the)g(input)f(stream,)h(making)150 +1676 y(it)g(easy)g(to)g(rep)s(eat)g(commands,)f(insert)g(the)h(argumen) +m(ts)f(to)h(a)g(previous)f(command)g(in)m(to)i(the)e(curren)m(t)150 +1785 y(input)f(line,)i(or)g(\014x)f(errors)f(in)h(previous)g(commands)g +(quic)m(kly)-8 b(.)275 1914 y(History)37 b(expansion)f(tak)m(es)i +(place)g(in)e(t)m(w)m(o)i(parts.)59 b(The)36 b(\014rst)g(is)h(to)g +(determine)g(whic)m(h)f(line)h(from)150 2023 y(the)42 +b(history)f(list)h(should)e(b)s(e)h(used)f(during)g(substitution.)74 +b(The)40 b(second)i(is)f(to)h(select)h(p)s(ortions)e(of)150 +2133 y(that)31 b(line)g(for)f(inclusion)h(in)m(to)g(the)g(curren)m(t)f +(one.)42 b(The)30 b(line)h(selected)h(from)e(the)h(history)f(is)h +(called)h(the)150 2242 y Fk(ev)m(en)m(t)p Fq(,)e(and)c(the)i(p)s +(ortions)e(of)i(that)f(line)h(that)g(are)f(acted)i(up)s(on)c(are)j +(called)g Fk(w)m(ords)p Fq(.)39 b(V)-8 b(arious)28 b +Fk(mo)s(di\014ers)150 2352 y Fq(are)33 b(a)m(v)-5 b(ailable)36 +b(to)d(manipulate)h(the)f(selected)h(w)m(ords.)48 b(The)32 +b(line)i(is)f(brok)m(en)f(in)m(to)i(w)m(ords)f(in)f(the)i(same)150 +2461 y(fashion)23 b(that)g(Bash)g(do)s(es,)h(so)f(that)h(sev)m(eral)g +(w)m(ords)e(surrounded)e(b)m(y)j(quotes)g(are)g(considered)g(one)g(w)m +(ord.)150 2571 y(History)37 b(expansions)g(are)g(in)m(tro)s(duced)f(b)m +(y)h(the)g(app)s(earance)g(of)g(the)g(history)f(expansion)h(c)m +(haracter,)150 2681 y(whic)m(h)30 b(is)h(`)p Fp(!)p Fq(')f(b)m(y)g +(default.)275 2809 y(History)c(expansion)g(implemen)m(ts)h(shell-lik)m +(e)h(quoting)f(con)m(v)m(en)m(tions:)40 b(a)27 b(bac)m(kslash)g(can)f +(b)s(e)g(used)f(to)150 2919 y(remo)m(v)m(e)h(the)e(sp)s(ecial)g +(handling)g(for)g(the)g(next)g(c)m(haracter;)k(single)d(quotes)g +(enclose)g(v)m(erbatim)g(sequences)150 3028 y(of)k(c)m(haracters,)i +(and)e(can)g(b)s(e)g(used)f(to)i(inhibit)f(history)g(expansion;)g(and)g +(c)m(haracters)i(enclosed)e(within)150 3138 y(double)h(quotes)i(ma)m(y) +f(b)s(e)f(sub)5 b(ject)31 b(to)h(history)f(expansion,)g(since)g(bac)m +(kslash)g(can)h(escap)s(e)f(the)g(history)150 3247 y(expansion)e(c)m +(haracter,)j(but)d(single)h(quotes)g(ma)m(y)h(not,)f(since)g(they)g +(are)g(not)f(treated)i(sp)s(ecially)f(within)150 3357 +y(double)g(quotes.)150 3544 y Fj(1.1.1)63 b(Ev)m(en)m(t)39 +b(Designators)150 3691 y Fq(An)32 b(ev)m(en)m(t)j(designator)e(is)g(a)g +(reference)g(to)h(a)f(command)f(line)h(en)m(try)g(in)g(the)g(history)g +(list.)48 b(Unless)33 b(the)150 3800 y(reference)e(is)f(absolute,)i(ev) +m(en)m(ts)f(are)g(relativ)m(e)i(to)e(the)f(curren)m(t)g(p)s(osition)h +(in)f(the)h(history)f(list.)150 3947 y Fp(!)432 b Fq(Start)34 +b(a)f(history)h(substitution,)g(except)g(when)f(follo)m(w)m(ed)i(b)m(y) +e(a)h(space,)h(tab,)f(the)g(end)f(of)630 4057 y(the)e(line,)g(or)f(`)p +Fp(=)p Fq('.)150 4204 y Fp(!)p Fi(n)384 b Fq(Refer)30 +b(to)i(command)e(line)g Fk(n)p Fq(.)150 4351 y Fp(!-)p +Fi(n)336 b Fq(Refer)30 b(to)i(the)e(command)g Fk(n)g +Fq(lines)h(bac)m(k.)150 4498 y Fp(!!)384 b Fq(Refer)30 +b(to)i(the)e(previous)g(command.)40 b(This)30 b(is)g(a)h(synon)m(ym)f +(for)g(`)p Fp(!-1)p Fq('.)150 4645 y Fp(!)p Fi(string)144 +b Fq(Refer)25 b(to)h(the)f(most)h(recen)m(t)g(command)f(preceding)g +(the)g(curren)m(t)g(p)s(osition)g(in)g(the)g(history)630 +4755 y(list)31 b(starting)g(with)f Fk(string)p Fq(.)150 +4902 y Fp(!?)p Fi(string)p Fp([?])630 5011 y Fq(Refer)25 +b(to)h(the)f(most)h(recen)m(t)g(command)f(preceding)g(the)g(curren)m(t) +g(p)s(osition)g(in)g(the)g(history)630 5121 y(list)32 +b(con)m(taining)i Fk(string)p Fq(.)45 b(The)31 b(trailing)i(`)p +Fp(?)p Fq(')f(ma)m(y)g(b)s(e)f(omitted)i(if)f(the)g Fk(string)39 +b Fq(is)32 b(follo)m(w)m(ed)630 5230 y(immediately)f(b)m(y)e(a)h +(newline.)40 b(If)29 b Fk(string)38 b Fq(is)29 b(missing,)h(the)g +(string)f(from)g(the)h(most)g(recen)m(t)630 5340 y(searc)m(h)h(is)f +(used;)g(it)h(is)g(an)f(error)g(if)g(there)h(is)f(no)g(previous)g +(searc)m(h)h(string.)p eop end +%%Page: 2 5 +TeXDict begin 2 4 bop 150 -116 a Fq(Chapter)30 b(1:)41 +b(Using)30 b(History)h(In)m(teractiv)m(ely)2016 b(2)150 +299 y Fp(^)p Fi(string1)p Fp(^)p Fi(string2)p Fp(^)630 +408 y Fq(Quic)m(k)32 b(Substitution.)44 b(Rep)s(eat)32 +b(the)g(last)h(command,)f(replacing)g Fk(string1)40 b +Fq(with)31 b Fk(string2)p Fq(.)630 518 y(Equiv)-5 b(alen)m(t)31 +b(to)g Fp(!!:s^)p Fi(string1)p Fp(^)p Fi(string2)p Fp(^)p +Fq(.)150 673 y Fp(!#)384 b Fq(The)30 b(en)m(tire)h(command)f(line)h(t)m +(yp)s(ed)f(so)h(far.)150 867 y Fj(1.1.2)63 b(W)-10 b(ord)41 +b(Designators)150 1014 y Fq(W)-8 b(ord)27 b(designators)h(are)g(used)e +(to)i(select)h(desired)d(w)m(ords)h(from)f(the)i(ev)m(en)m(t.)41 +b(A)27 b(`)p Fp(:)p Fq(')g(separates)h(the)f(ev)m(en)m(t)150 +1124 y(sp)s(eci\014cation)38 b(from)e(the)h(w)m(ord)f(designator.)61 +b(It)37 b(ma)m(y)h(b)s(e)e(omitted)i(if)e(the)h(w)m(ord)g(designator)g +(b)s(egins)150 1233 y(with)30 b(a)g(`)p Fp(^)p Fq(',)g(`)p +Fp($)p Fq(',)g(`)p Fp(*)p Fq(',)h(`)p Fp(-)p Fq(',)f(or)g(`)p +Fp(\045)p Fq('.)41 b(W)-8 b(ords)30 b(are)g(n)m(um)m(b)s(ered)e(from)i +(the)g(b)s(eginning)f(of)h(the)g(line,)g(with)g(the)150 +1343 y(\014rst)f(w)m(ord)f(b)s(eing)h(denoted)h(b)m(y)f(0)h(\(zero\).) +41 b(W)-8 b(ords)30 b(are)g(inserted)f(in)m(to)h(the)g(curren)m(t)f +(line)g(separated)h(b)m(y)150 1452 y(single)h(spaces.)275 +1584 y(F)-8 b(or)31 b(example,)150 1739 y Fp(!!)384 b +Fq(designates)37 b(the)f(preceding)g(command.)57 b(When)35 +b(y)m(ou)i(t)m(yp)s(e)f(this,)h(the)f(preceding)g(com-)630 +1849 y(mand)30 b(is)g(rep)s(eated)g(in)g(toto.)150 2003 +y Fp(!!:$)288 b Fq(designates)23 b(the)g(last)g(argumen)m(t)g(of)f(the) +h(preceding)f(command.)38 b(This)22 b(ma)m(y)h(b)s(e)e(shortened)630 +2113 y(to)31 b Fp(!$)p Fq(.)150 2267 y Fp(!fi:2)240 b +Fq(designates)30 b(the)g(second)f(argumen)m(t)h(of)f(the)h(most)f +(recen)m(t)i(command)e(starting)h(with)f(the)630 2377 +y(letters)j Fp(fi)p Fq(.)275 2531 y(Here)e(are)h(the)g(w)m(ord)f +(designators:)150 2686 y Fp(0)g(\(zero\))114 b Fq(The)30 +b Fp(0)p Fq(th)g(w)m(ord.)40 b(F)-8 b(or)31 b(man)m(y)g(applications,)h +(this)e(is)g(the)h(command)f(w)m(ord.)150 2840 y Fi(n)432 +b Fq(The)30 b Fk(n)p Fq(th)g(w)m(ord.)150 2995 y Fp(^)432 +b Fq(The)30 b(\014rst)f(argumen)m(t;)j(that)f(is,)f(w)m(ord)g(1.)150 +3150 y Fp($)432 b Fq(The)30 b(last)h(argumen)m(t.)150 +3304 y Fp(\045)432 b Fq(The)40 b(\014rst)h(w)m(ord)f(matc)m(hed)i(b)m +(y)f(the)g(most)g(recen)m(t)h(`)p Fp(?)p Fi(string)p +Fp(?)p Fq(')d(searc)m(h,)44 b(if)d(the)g(searc)m(h)630 +3414 y(string)30 b(b)s(egins)g(with)g(a)h(c)m(haracter)h(that)f(is)f +(part)h(of)f(a)h(w)m(ord.)150 3568 y Fi(x)p Fp(-)p Fi(y)336 +b Fq(A)30 b(range)h(of)g(w)m(ords;)f(`)p Fp(-)p Fi(y)p +Fq(')g(abbreviates)h(`)p Fp(0-)p Fi(y)p Fq('.)150 3723 +y Fp(*)432 b Fq(All)28 b(of)g(the)g(w)m(ords,)g(except)h(the)e +Fp(0)p Fq(th.)40 b(This)27 b(is)g(a)h(synon)m(ym)f(for)h(`)p +Fp(1-$)p Fq('.)39 b(It)28 b(is)g(not)g(an)f(error)630 +3832 y(to)j(use)g(`)p Fp(*)p Fq(')f(if)h(there)g(is)g(just)f(one)h(w)m +(ord)f(in)g(the)h(ev)m(en)m(t;)i(the)d(empt)m(y)i(string)e(is)h +(returned)e(in)630 3942 y(that)j(case.)150 4097 y Fi(x)p +Fp(*)384 b Fq(Abbreviates)31 b(`)p Fi(x)p Fp(-$)p Fq(')150 +4251 y Fi(x)p Fp(-)384 b Fq(Abbreviates)27 b(`)p Fi(x)p +Fp(-$)p Fq(')g(lik)m(e)h(`)p Fi(x)p Fp(*)p Fq(',)g(but)e(omits)i(the)f +(last)h(w)m(ord.)39 b(If)27 b(`)p Fp(x)p Fq(')g(is)g(missing,)g(it)h +(defaults)630 4361 y(to)j(0.)275 4515 y(If)i(a)h(w)m(ord)g(designator)g +(is)g(supplied)f(without)h(an)g(ev)m(en)m(t)h(sp)s(eci\014cation,)h +(the)e(previous)f(command)150 4625 y(is)d(used)g(as)h(the)f(ev)m(en)m +(t.)150 4819 y Fj(1.1.3)63 b(Mo)s(di\014ers)150 4966 +y Fq(After)29 b(the)g(optional)g(w)m(ord)g(designator,)g(y)m(ou)g(can)g +(add)f(a)h(sequence)g(of)g(one)g(or)f(more)h(of)g(the)f(follo)m(wing) +150 5076 y(mo)s(di\014ers,)33 b(eac)m(h)h(preceded)f(b)m(y)g(a)h(`)p +Fp(:)p Fq('.)50 b(These)33 b(mo)s(dify)-8 b(,)33 b(or)h(edit,)g(the)g +(w)m(ord)f(or)g(w)m(ords)g(selected)h(from)150 5185 y(the)d(history)f +(ev)m(en)m(t.)150 5340 y Fp(h)432 b Fq(Remo)m(v)m(e)32 +b(a)f(trailing)g(pathname)g(comp)s(onen)m(t,)g(lea)m(ving)h(only)e(the) +h(head.)p eop end +%%Page: 3 6 +TeXDict begin 3 5 bop 150 -116 a Fq(Chapter)30 b(1:)41 +b(Using)30 b(History)h(In)m(teractiv)m(ely)2016 b(3)150 +299 y Fp(t)432 b Fq(Remo)m(v)m(e)32 b(all)f(leading)h(pathname)e(comp)s +(onen)m(ts,)h(lea)m(ving)h(the)e(tail.)150 458 y Fp(r)432 +b Fq(Remo)m(v)m(e)32 b(a)f(trailing)g(su\016x)f(of)g(the)h(form)f(`)p +Fp(.)p Fi(suffix)p Fq(',)f(lea)m(ving)j(the)f(basename.)150 +618 y Fp(e)432 b Fq(Remo)m(v)m(e)32 b(all)f(but)f(the)h(trailing)g +(su\016x.)150 777 y Fp(p)432 b Fq(Prin)m(t)30 b(the)h(new)f(command)g +(but)g(do)g(not)g(execute)i(it.)150 936 y Fp(s/)p Fi(old)p +Fp(/)p Fi(new)p Fp(/)630 1046 y Fq(Substitute)f Fk(new)39 +b Fq(for)32 b(the)g(\014rst)f(o)s(ccurrence)h(of)f Fk(old)36 +b Fq(in)31 b(the)h(ev)m(en)m(t)h(line.)46 b(An)m(y)31 +b(c)m(haracter)630 1156 y(ma)m(y)k(b)s(e)e(used)h(as)g(the)h(delimiter) +g(in)f(place)h(of)f(`)p Fp(/)p Fq('.)53 b(The)33 b(delimiter)i(ma)m(y)g +(b)s(e)f(quoted)g(in)630 1265 y Fk(old)40 b Fq(and)c +Fk(new)44 b Fq(with)36 b(a)h(single)g(bac)m(kslash.)60 +b(If)36 b(`)p Fp(&)p Fq(')h(app)s(ears)e(in)i Fk(new)p +Fq(,)g(it)h(is)e(replaced)h(b)m(y)630 1375 y Fk(old)p +Fq(.)k(A)31 b(single)g(bac)m(kslash)g(will)g(quote)g(the)g(`)p +Fp(&)p Fq('.)41 b(If)31 b Fk(old)j Fq(is)c(n)m(ull,)h(it)g(is)g(set)g +(to)g(the)g(last)g Fk(old)630 1484 y Fq(substituted,)j(or,)g(if)f(no)g +(previous)g(history)g(substitutions)g(to)s(ok)h(place,)h(the)e(last)h +Fk(string)630 1594 y Fq(in)d(a)g(!?)p Fk(string)8 b Fp([?])30 +b Fq(searc)m(h.)44 b(If)31 b Fk(new)38 b Fq(is)31 b(n)m(ull,)h(eac)m(h) +g(matc)m(hing)g Fk(old)j Fq(is)c(deleted.)44 b(The)30 +b(\014nal)630 1704 y(delimiter)h(is)g(optional)g(if)f(it)h(is)g(the)f +(last)h(c)m(haracter)h(on)f(the)f(input)g(line.)150 1863 +y Fp(&)432 b Fq(Rep)s(eat)31 b(the)f(previous)g(substitution.)150 +2022 y Fp(g)150 2132 y(a)432 b Fq(Cause)38 b(c)m(hanges)i(to)f(b)s(e)f +(applied)h(o)m(v)m(er)h(the)f(en)m(tire)g(ev)m(en)m(t)h(line.)66 +b(Used)39 b(in)f(conjunction)630 2242 y(with)30 b(`)p +Fp(s)p Fq(',)h(as)f(in)h Fp(gs/)p Fi(old)p Fp(/)p Fi(new)p +Fp(/)p Fq(,)c(or)j(with)h(`)p Fp(&)p Fq('.)150 2401 y +Fp(G)432 b Fq(Apply)30 b(the)g(follo)m(wing)i(`)p Fp(s)p +Fq(')f(or)f(`)p Fp(&)p Fq(')h(mo)s(di\014er)e(once)i(to)g(eac)m(h)h(w)m +(ord)e(in)g(the)g(ev)m(en)m(t.)p eop end +%%Page: 4 7 +TeXDict begin 4 6 bop 3705 -116 a Fq(4)150 299 y Fm(2)80 +b(Programming)54 b(with)f(GNU)h(History)150 544 y Fq(This)41 +b(c)m(hapter)i(describ)s(es)e(ho)m(w)h(to)h(in)m(terface)g(programs)f +(that)g(y)m(ou)h(write)f(with)f(the)i Fl(gnu)e Fq(History)150 +654 y(Library)-8 b(.)48 b(It)33 b(should)e(b)s(e)i(considered)f(a)h +(tec)m(hnical)i(guide.)48 b(F)-8 b(or)34 b(information)f(on)g(the)g(in) +m(teractiv)m(e)i(use)150 763 y(of)c Fl(gnu)f Fq(History)-8 +b(,)31 b(see)g(Chapter)f(1)h([Using)g(History)g(In)m(teractiv)m(ely],)i +(page)e(1.)150 1010 y Fo(2.1)68 b(In)l(tro)t(duction)45 +b(to)g(History)150 1169 y Fq(Man)m(y)31 b(programs)f(read)g(input)g +(from)f(the)i(user)f(a)g(line)h(at)g(a)g(time.)41 b(The)30 +b Fl(gnu)g Fq(History)h(library)f(is)g(able)150 1279 +y(to)f(k)m(eep)h(trac)m(k)g(of)f(those)g(lines,)h(asso)s(ciate)g +(arbitrary)f(data)g(with)g(eac)m(h)h(line,)f(and)g(utilize)h +(information)150 1388 y(from)g(previous)g(lines)g(in)g(comp)s(osing)h +(new)f(ones.)275 1527 y(A)24 b(programmer)g(using)g(the)h(History)g +(library)f(has)h(a)m(v)-5 b(ailable)27 b(functions)d(for)g(remem)m(b)s +(ering)g(lines)h(on)150 1636 y(a)30 b(history)f(list,)h(asso)s(ciating) +i(arbitrary)d(data)h(with)f(a)g(line,)i(remo)m(ving)f(lines)f(from)g +(the)h(list,)g(searc)m(hing)150 1746 y(through)35 b(the)g(list)h(for)f +(a)h(line)f(con)m(taining)i(an)e(arbitrary)g(text)h(string,)h(and)e +(referencing)g(an)m(y)h(line)f(in)150 1855 y(the)c(list)g(directly)-8 +b(.)43 b(In)30 b(addition,)h(a)g(history)g Fk(expansion)g +Fq(function)f(is)h(a)m(v)-5 b(ailable)33 b(whic)m(h)d(pro)m(vides)h +(for)g(a)150 1965 y(consisten)m(t)h(user)d(in)m(terface)j(across)f +(di\013eren)m(t)g(programs.)275 2103 y(The)c(user)g(using)g(programs)h +(written)g(with)g(the)g(History)g(library)g(has)f(the)h(b)s(ene\014t)f +(of)h(a)h(consisten)m(t)150 2213 y(user)38 b(in)m(terface)j(with)e(a)g +(set)g(of)h(w)m(ell-kno)m(wn)f(commands)g(for)g(manipulating)g(the)g +(text)h(of)f(previous)150 2323 y(lines)28 b(and)f(using)g(that)h(text)g +(in)g(new)f(commands.)39 b(The)27 b(basic)h(history)g(manipulation)f +(commands)h(are)150 2432 y(similar)j(to)g(the)f(history)h(substitution) +f(pro)m(vided)g(b)m(y)g Fp(csh)p Fq(.)275 2570 y(The)f(programmer)h +(can)h(also)g(use)g(the)f(Readline)h(library)-8 b(,)31 +b(whic)m(h)f(includes)g(some)h(history)f(manip-)150 2680 +y(ulation)h(b)m(y)f(default,)h(and)f(has)g(the)h(added)e(adv)-5 +b(an)m(tage)33 b(of)d(command)g(line)h(editing.)275 2818 +y(Before)39 b(declaring)f(an)m(y)h(functions)e(using)h(an)m(y)g +(functionalit)m(y)i(the)e(History)h(library)e(pro)m(vides)h(in)150 +2928 y(other)29 b(co)s(de,)g(an)g(application)h(writer)f(should)e +(include)i(the)g(\014le)f Fp()23 +b Fq(in)29 b(an)m(y)g(\014le)150 3037 y(that)c(uses)e(the)h(History)h +(library's)e(features.)39 b(It)24 b(supplies)f(extern)h(declarations)i +(for)d(all)i(of)f(the)g(library's)150 3147 y(public)30 +b(functions)g(and)f(v)-5 b(ariables,)32 b(and)d(declares)j(all)f(of)f +(the)h(public)f(data)h(structures.)150 3393 y Fo(2.2)68 +b(History)46 b(Storage)150 3553 y Fq(The)30 b(history)g(list)h(is)g(an) +f(arra)m(y)h(of)f(history)h(en)m(tries.)41 b(A)31 b(history)f(en)m(try) +h(is)f(declared)h(as)f(follo)m(ws:)390 3691 y Fp(typedef)46 +b(void)g(*histdata_t;)390 3910 y(typedef)g(struct)g(_hist_entry)f({)485 +4020 y(char)i(*line;)485 4129 y(char)g(*timestamp;)485 +4239 y(histdata_t)e(data;)390 4349 y(})i(HIST_ENTRY;)275 +4487 y Fq(The)29 b(history)i(list)g(itself)g(migh)m(t)g(therefore)g(b)s +(e)f(declared)g(as)390 4625 y Fp(HIST_ENTRY)45 b(**the_history_list;) +275 4763 y Fq(The)29 b(state)j(of)f(the)f(History)h(library)f(is)h +(encapsulated)g(in)m(to)g(a)g(single)g(structure:)390 +4902 y Fp(/*)438 5011 y(*)47 b(A)h(structure)d(used)i(to)g(pass)f +(around)g(the)h(current)f(state)h(of)g(the)g(history.)438 +5121 y(*/)390 5230 y(typedef)f(struct)g(_hist_state)f({)485 +5340 y(HIST_ENTRY)g(**entries;)g(/*)j(Pointer)d(to)j(the)f(entries)e +(themselves.)g(*/)p eop end +%%Page: 5 8 +TeXDict begin 5 7 bop 150 -116 a Fq(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1780 b(5)485 +299 y Fp(int)47 b(offset;)523 b(/*)48 b(The)f(location)e(pointer)h +(within)g(this)h(array.)f(*/)485 408 y(int)h(length;)523 +b(/*)48 b(Number)e(of)h(elements)e(within)i(this)f(array.)g(*/)485 +518 y(int)h(size;)619 b(/*)48 b(Number)e(of)h(slots)f(allocated)g(to)h +(this)f(array.)g(*/)485 628 y(int)h(flags;)390 737 y(})g +(HISTORY_STATE;)275 890 y Fq(If)29 b(the)i(\015ags)g(mem)m(b)s(er)e +(includes)h Fp(HS_STIFLED)p Fq(,)e(the)j(history)f(has)g(b)s(een)g +(sti\015ed.)150 1157 y Fo(2.3)68 b(History)46 b(F)-11 +b(unctions)150 1317 y Fq(This)33 b(section)j(describ)s(es)d(the)i +(calling)g(sequence)g(for)f(the)g(v)-5 b(arious)34 b(functions)g(exp)s +(orted)g(b)m(y)g(the)g Fl(gnu)150 1426 y Fq(History)d(library)-8 +b(.)150 1644 y Fj(2.3.1)63 b(Initializing)40 b(History)i(and)f(State)f +(Managemen)m(t)150 1791 y Fq(This)21 b(section)i(describ)s(es)f +(functions)f(used)g(to)i(initialize)h(and)e(manage)h(the)f(state)h(of)g +(the)f(History)g(library)150 1900 y(when)29 b(y)m(ou)i(w)m(an)m(t)g(to) +g(use)f(the)h(history)f(functions)g(in)g(y)m(our)h(program.)3350 +2120 y([F)-8 b(unction])-3599 b Fh(void)54 b(using_history)49 +b Fg(\()p Ff(v)m(oid)p Fg(\))390 2230 y Fq(Begin)41 b(a)f(session)g(in) +g(whic)m(h)f(the)h(history)g(functions)f(migh)m(t)i(b)s(e)e(used.)69 +b(This)39 b(initializes)j(the)390 2339 y(in)m(teractiv)m(e)33 +b(v)-5 b(ariables.)3350 2560 y([F)d(unction])-3599 b +Fh(HISTORY_STATE)56 b(*)d(history_get_history_st)q(ate)f +Fg(\()p Ff(v)m(oid)p Fg(\))390 2669 y Fq(Return)30 b(a)g(structure)g +(describing)g(the)h(curren)m(t)f(state)i(of)e(the)h(input)e(history)-8 +b(.)3350 2890 y([F)g(unction])-3599 b Fh(void)54 b +(history_set_history_stat)q(e)e Fg(\()p Ff(HISTOR)-8 +b(Y)p 2262 2890 30 5 v 44 w(ST)g(A)g(TE)32 b(*state)p +Fg(\))390 2999 y Fq(Set)f(the)f(state)i(of)e(the)h(history)f(list)h +(according)h(to)f Fk(state)p Fq(.)150 3216 y Fj(2.3.2)63 +b(History)41 b(List)g(Managemen)m(t)150 3363 y Fq(These)32 +b(functions)f(manage)i(individual)f(en)m(tries)g(on)g(the)g(history)g +(list,)h(or)f(set)h(parameters)f(managing)150 3473 y(the)f(list)g +(itself.)3350 3693 y([F)-8 b(unction])-3599 b Fh(void)54 +b(add_history)48 b Fg(\()p Ff(const)34 b(c)m(har)g(*string)p +Fg(\))390 3803 y Fq(Place)j Fk(string)44 b Fq(at)37 b(the)g(end)e(of)i +(the)f(history)g(list.)59 b(The)36 b(asso)s(ciated)h(data)g(\014eld)f +(\(if)g(an)m(y\))h(is)f(set)390 3912 y(to)44 b Fp(NULL)p +Fq(.)79 b(If)44 b(the)f(maxim)m(um)h(n)m(um)m(b)s(er)e(of)i(history)f +(en)m(tries)i(has)e(b)s(een)g(set)h(using)f Fp(stifle_)390 +4022 y(history\(\))p Fq(,)28 b(and)h(the)h(new)f(n)m(um)m(b)s(er)g(of)h +(history)g(en)m(tries)h(w)m(ould)e(exceed)i(that)g(maxim)m(um,)f(the) +390 4131 y(oldest)h(history)f(en)m(try)h(is)f(remo)m(v)m(ed.)3350 +4352 y([F)-8 b(unction])-3599 b Fh(void)54 b(add_history_time)c +Fg(\()p Ff(const)34 b(c)m(har)g(*string)p Fg(\))390 4461 +y Fq(Change)c(the)h(time)g(stamp)f(asso)s(ciated)i(with)e(the)h(most)f +(recen)m(t)i(history)e(en)m(try)h(to)g Fk(string)p Fq(.)3350 +4681 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(remove_history)d +Fg(\()p Ff(in)m(t)33 b(whic)m(h)p Fg(\))390 4791 y Fq(Remo)m(v)m(e)47 +b(history)f(en)m(try)f(at)i(o\013set)f Fk(whic)m(h)f +Fq(from)g(the)h(history)-8 b(.)86 b(The)45 b(remo)m(v)m(ed)i(elemen)m +(t)g(is)390 4901 y(returned)29 b(so)i(y)m(ou)g(can)f(free)h(the)f +(line,)h(data,)h(and)d(con)m(taining)j(structure.)3350 +5121 y([F)-8 b(unction])-3599 b Fh(histdata_t)55 b(free_history_entry)c +Fg(\()p Ff(HIST)p 1992 5121 V 44 w(ENTR)-8 b(Y)33 b(*histen)m(t)p +Fg(\))390 5230 y Fq(F)-8 b(ree)29 b(the)f(history)g(en)m(try)g +Fk(histen)m(t)j Fq(and)c(an)m(y)i(history)e(library)h(priv)-5 +b(ate)28 b(data)h(asso)s(ciated)g(with)f(it.)390 5340 +y(Returns)h(the)i(application-sp)s(eci\014c)h(data)f(so)g(the)f(caller) +i(can)e(disp)s(ose)g(of)h(it.)p eop end +%%Page: 6 9 +TeXDict begin 6 8 bop 150 -116 a Fq(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1780 b(6)3350 +299 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e +(replace_history_entry)f Fg(\()p Ff(in)m(t)33 b(whic)m(h,)h(const)g(c)m +(har)g(*line,)565 408 y(histdata)p 927 408 30 5 v 44 +w(t)f(data)p Fg(\))390 518 y Fq(Mak)m(e)c(the)f(history)f(en)m(try)h +(at)h(o\013set)f Fk(whic)m(h)g Fq(ha)m(v)m(e)g Fk(line)33 +b Fq(and)27 b Fk(data)p Fq(.)41 b(This)27 b(returns)f(the)i(old)g(en)m +(try)390 628 y(so)37 b(the)h(caller)g(can)f(disp)s(ose)g(of)g(an)m(y)g +(application-sp)s(eci\014c)i(data.)61 b(In)37 b(the)g(case)h(of)f(an)g +(in)m(v)-5 b(alid)390 737 y Fk(whic)m(h)p Fq(,)30 b(a)h +Fp(NULL)e Fq(p)s(oin)m(ter)i(is)f(returned.)3350 941 +y([F)-8 b(unction])-3599 b Fh(void)54 b(clear_history)49 +b Fg(\()p Ff(v)m(oid)p Fg(\))390 1051 y Fq(Clear)31 b(the)f(history)h +(list)g(b)m(y)f(deleting)h(all)h(the)e(en)m(tries.)3350 +1254 y([F)-8 b(unction])-3599 b Fh(void)54 b(stifle_history)49 +b Fg(\()p Ff(in)m(t)34 b(max)p Fg(\))390 1364 y Fq(Sti\015e)j(the)f +(history)h(list,)i(remem)m(b)s(ering)d(only)h(the)f(last)i +Fk(max)43 b Fq(en)m(tries.)60 b(The)36 b(history)g(list)i(will)390 +1473 y(con)m(tain)32 b(only)e Fk(max)37 b Fq(en)m(tries)31 +b(at)g(a)g(time.)3350 1677 y([F)-8 b(unction])-3599 b +Fh(int)53 b(unstifle_history)e Fg(\()p Ff(v)m(oid)p Fg(\))390 +1787 y Fq(Stop)27 b(sti\015ing)h(the)f(history)-8 b(.)40 +b(This)27 b(returns)f(the)h(previously-set)h(maxim)m(um)f(n)m(um)m(b)s +(er)f(of)i(history)390 1896 y(en)m(tries)g(\(as)f(set)g(b)m(y)g +Fp(stifle_history\(\))p Fq(\).)35 b(The)27 b(v)-5 b(alue)27 +b(is)g(p)s(ositiv)m(e)g(if)g(the)g(history)g(w)m(as)g(sti\015ed,)390 +2006 y(negativ)m(e)33 b(if)d(it)h(w)m(asn't.)3350 2210 +y([F)-8 b(unction])-3599 b Fh(int)53 b(history_is_stifled)e +Fg(\()p Ff(v)m(oid)p Fg(\))390 2319 y Fq(Returns)29 b(non-zero)i(if)g +(the)f(history)h(is)f(sti\015ed,)g(zero)i(if)e(it)h(is)f(not.)150 +2528 y Fj(2.3.3)63 b(Information)42 b(Ab)s(out)f(the)g(History)g(List) +150 2675 y Fq(These)30 b(functions)g(return)f(information)i(ab)s(out)f +(the)h(en)m(tire)g(history)f(list)h(or)g(individual)e(list)i(en)m +(tries.)3350 2879 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 +b(**)e(history_list)c Fg(\()p Ff(v)m(oid)p Fg(\))390 +2989 y Fq(Return)30 b(a)h Fp(NULL)e Fq(terminated)i(arra)m(y)g(of)f +Fp(HIST_ENTRY)e(*)i Fq(whic)m(h)g(is)h(the)g(curren)m(t)f(input)f +(history)-8 b(.)390 3098 y(Elemen)m(t)31 b(0)g(of)g(this)f(list)h(is)f +(the)h(b)s(eginning)f(of)g(time.)42 b(If)29 b(there)i(is)f(no)h +(history)-8 b(,)31 b(return)e Fp(NULL)p Fq(.)3350 3302 +y([F)-8 b(unction])-3599 b Fh(int)53 b(where_history)d +Fg(\()p Ff(v)m(oid)p Fg(\))390 3411 y Fq(Returns)29 b(the)i(o\013set)g +(of)g(the)g(curren)m(t)f(history)g(elemen)m(t.)3350 3615 +y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(current_history)d +Fg(\()p Ff(v)m(oid)p Fg(\))390 3725 y Fq(Return)24 b(the)h(history)g +(en)m(try)g(at)h(the)f(curren)m(t)f(p)s(osition,)j(as)e(determined)f(b) +m(y)h Fp(where_history\(\))p Fq(.)390 3834 y(If)30 b(there)g(is)h(no)f +(en)m(try)h(there,)g(return)e(a)i Fp(NULL)e Fq(p)s(oin)m(ter.)3350 +4038 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(history_get)c +Fg(\()p Ff(in)m(t)33 b(o\013set)p Fg(\))390 4148 y Fq(Return)e(the)g +(history)h(en)m(try)g(at)g(p)s(osition)g Fk(o\013set)p +Fq(.)45 b(The)31 b(range)h(of)g(v)-5 b(alid)31 b(v)-5 +b(alues)32 b(of)g Fk(o\013set)j Fq(starts)390 4257 y(at)d +Fp(history_base)c Fq(and)i(ends)h(at)g Fk(history)p 1885 +4257 28 4 v 40 w(length)h Fq(-)f(1)h(\(see)g(Section)g(2.4)g([History)g +(V)-8 b(ariables],)390 4367 y(page)27 b(9\).)40 b(If)26 +b(there)g(is)g(no)g(en)m(try)h(there,)g(or)f(if)g Fk(o\013set)j +Fq(is)e(outside)f(the)g(v)-5 b(alid)27 b(range,)g(return)f(a)g +Fp(NULL)390 4476 y Fq(p)s(oin)m(ter.)3350 4680 y([F)-8 +b(unction])-3599 b Fh(time_t)54 b(history_get_time)c +Fg(\()p Ff(HIST)p 1678 4680 30 5 v 45 w(ENTR)-8 b(Y)32 +b(*en)m(try)p Fg(\))390 4790 y Fq(Return)g(the)i(time)g(stamp)f(asso)s +(ciated)h(with)f(the)g(history)g(en)m(try)h Fk(en)m(try)p +Fq(.)49 b(If)33 b(the)g(timestamp)h(is)390 4899 y(missing)c(or)h(in)m +(v)-5 b(alid,)31 b(return)e(0.)3350 5103 y([F)-8 b(unction])-3599 +b Fh(int)53 b(history_total_bytes)e Fg(\()p Ff(v)m(oid)p +Fg(\))390 5213 y Fq(Return)27 b(the)h(n)m(um)m(b)s(er)e(of)i(b)m(ytes)g +(that)g(the)g(primary)e(history)i(en)m(tries)g(are)g(using.)39 +b(This)27 b(function)390 5322 y(returns)i(the)i(sum)e(of)i(the)f +(lengths)h(of)f(all)i(the)e(lines)h(in)f(the)g(history)-8 +b(.)p eop end +%%Page: 7 10 +TeXDict begin 7 9 bop 150 -116 a Fq(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1780 b(7)150 +299 y Fj(2.3.4)63 b(Mo)m(ving)41 b(Around)h(the)f(History)g(List)150 +446 y Fq(These)30 b(functions)g(allo)m(w)i(the)e(curren)m(t)h(index)f +(in)m(to)h(the)f(history)h(list)g(to)g(b)s(e)f(set)h(or)f(c)m(hanged.) +3350 624 y([F)-8 b(unction])-3599 b Fh(int)53 b(history_set_pos)d +Fg(\()p Ff(in)m(t)34 b(p)s(os)p Fg(\))390 734 y Fq(Set)j(the)g(curren)m +(t)f(history)g(o\013set)i(to)f Fk(p)s(os)p Fq(,)h(an)f(absolute)g +(index)f(in)m(to)i(the)e(list.)60 b(Returns)36 b(1)h(on)390 +844 y(success,)31 b(0)g(if)f Fk(p)s(os)j Fq(is)e(less)f(than)h(zero)g +(or)f(greater)i(than)e(the)g(n)m(um)m(b)s(er)f(of)i(history)f(en)m +(tries.)3350 1022 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 +b(*)e(previous_history)d Fg(\()p Ff(v)m(oid)p Fg(\))390 +1132 y Fq(Bac)m(k)30 b(up)e(the)h(curren)m(t)g(history)f(o\013set)i(to) +g(the)f(previous)f(history)h(en)m(try)-8 b(,)30 b(and)e(return)g(a)h(p) +s(oin)m(ter)390 1241 y(to)i(that)g(en)m(try)-8 b(.)41 +b(If)30 b(there)h(is)f(no)h(previous)f(en)m(try)-8 b(,)31 +b(return)e(a)i Fp(NULL)e Fq(p)s(oin)m(ter.)3350 1420 +y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(next_history)c +Fg(\()p Ff(v)m(oid)p Fg(\))390 1530 y Fq(If)20 b(the)h(curren)m(t)f +(history)h(o\013set)g(refers)g(to)g(a)g(v)-5 b(alid)21 +b(history)f(en)m(try)-8 b(,)24 b(incremen)m(t)d(the)g(curren)m(t)f +(history)390 1639 y(o\013set.)41 b(If)27 b(the)g(p)s(ossibly-incremen)m +(ted)g(history)h(o\013set)g(refers)f(to)h(a)f(v)-5 b(alid)28 +b(history)f(en)m(try)-8 b(,)29 b(return)390 1749 y(a)i(p)s(oin)m(ter)f +(to)h(that)g(en)m(try;)g(otherwise,)g(return)e(a)i Fp(BNULL)e +Fq(p)s(oin)m(ter.)150 1944 y Fj(2.3.5)63 b(Searc)m(hing)40 +b(the)h(History)h(List)150 2091 y Fq(These)36 b(functions)g(allo)m(w)i +(searc)m(hing)f(of)f(the)h(history)f(list)h(for)f(en)m(tries)h(con)m +(taining)h(a)f(sp)s(eci\014c)f(string.)150 2201 y(Searc)m(hing)28 +b(ma)m(y)g(b)s(e)f(p)s(erformed)f(b)s(oth)h(forw)m(ard)f(and)h(bac)m +(kw)m(ard)h(from)f(the)h(curren)m(t)f(history)h(p)s(osition.)150 +2310 y(The)j(searc)m(h)h(ma)m(y)g(b)s(e)e Fk(anc)m(hored)p +Fq(,)i(meaning)g(that)g(the)f(string)h(m)m(ust)f(matc)m(h)h(at)g(the)g +(b)s(eginning)e(of)i(the)150 2420 y(history)e(en)m(try)-8 +b(.)3350 2599 y([F)g(unction])-3599 b Fh(int)53 b(history_search)d +Fg(\()p Ff(const)34 b(c)m(har)g(*string,)e(in)m(t)i(direction)p +Fg(\))390 2708 y Fq(Searc)m(h)29 b(the)g(history)g(for)g +Fk(string)p Fq(,)g(starting)h(at)f(the)g(curren)m(t)g(history)g +(o\013set.)41 b(If)28 b Fk(direction)i Fq(is)f(less)390 +2818 y(than)40 b(0,)j(then)c(the)h(searc)m(h)h(is)f(through)f(previous) +h(en)m(tries,)j(otherwise)d(through)g(subsequen)m(t)390 +2927 y(en)m(tries.)i(If)30 b Fk(string)38 b Fq(is)30 +b(found,)g(then)g(the)g(curren)m(t)h(history)f(index)g(is)g(set)h(to)h +(that)f(history)f(en)m(try)-8 b(,)390 3037 y(and)33 b(the)g(v)-5 +b(alue)34 b(returned)e(is)i(the)g(o\013set)g(in)f(the)h(line)f(of)h +(the)g(en)m(try)f(where)g Fk(string)41 b Fq(w)m(as)34 +b(found.)390 3147 y(Otherwise,)c(nothing)h(is)f(c)m(hanged,)h(and)f(a)h +(-1)g(is)f(returned.)3350 3325 y([F)-8 b(unction])-3599 +b Fh(int)53 b(history_search_prefix)f Fg(\()p Ff(const)34 +b(c)m(har)g(*string,)f(in)m(t)g(direction)p Fg(\))390 +3435 y Fq(Searc)m(h)41 b(the)g(history)f(for)g Fk(string)p +Fq(,)k(starting)d(at)g(the)g(curren)m(t)f(history)h(o\013set.)72 +b(The)40 b(searc)m(h)h(is)390 3544 y(anc)m(hored:)f(matc)m(hing)31 +b(lines)f(m)m(ust)f(b)s(egin)g(with)g Fk(string)p Fq(.)40 +b(If)29 b Fk(direction)h Fq(is)g(less)f(than)g(0,)i(then)e(the)390 +3654 y(searc)m(h)j(is)f(through)g(previous)g(en)m(tries,)h(otherwise)g +(through)e(subsequen)m(t)h(en)m(tries.)44 b(If)31 b Fk(string)39 +b Fq(is)390 3764 y(found,)33 b(then)f(the)h(curren)m(t)g(history)g +(index)g(is)g(set)g(to)h(that)g(en)m(try)-8 b(,)34 b(and)f(the)g +(return)f(v)-5 b(alue)33 b(is)g(0.)390 3873 y(Otherwise,)d(nothing)h +(is)f(c)m(hanged,)h(and)f(a)h(-1)g(is)f(returned.)3350 +4052 y([F)-8 b(unction])-3599 b Fh(int)53 b(history_search_pos)e +Fg(\()p Ff(const)34 b(c)m(har)g(*string,)f(in)m(t)g(direction,)g(in)m +(t)g(p)s(os)p Fg(\))390 4161 y Fq(Searc)m(h)h(for)g Fk(string)42 +b Fq(in)34 b(the)h(history)f(list,)i(starting)f(at)g +Fk(p)s(os)p Fq(,)g(an)f(absolute)h(index)e(in)m(to)j(the)e(list.)390 +4271 y(If)i Fk(direction)g Fq(is)g(negativ)m(e,)k(the)c(searc)m(h)h +(pro)s(ceeds)f(bac)m(kw)m(ard)g(from)g Fk(p)s(os)p Fq(,)h(otherwise)f +(forw)m(ard.)390 4381 y(Returns)43 b(the)h(absolute)h(index)f(of)g(the) +g(history)g(elemen)m(t)h(where)f Fk(string)52 b Fq(w)m(as)44 +b(found,)i(or)e(-1)390 4490 y(otherwise.)150 4686 y Fj(2.3.6)63 +b(Managing)41 b(the)g(History)h(File)150 4833 y Fq(The)26 +b(History)h(library)f(can)h(read)g(the)f(history)h(from)f(and)g(write)h +(it)g(to)g(a)g(\014le.)40 b(This)26 b(section)h(do)s(cumen)m(ts)150 +4942 y(the)k(functions)e(for)i(managing)g(a)g(history)f(\014le.)3350 +5121 y([F)-8 b(unction])-3599 b Fh(int)53 b(read_history)c +Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename)p Fg(\))390 +5230 y Fq(Add)29 b(the)h(con)m(ten)m(ts)h(of)f Fk(\014lename)k +Fq(to)d(the)f(history)f(list,)i(a)f(line)g(at)g(a)g(time.)41 +b(If)29 b Fk(\014lename)35 b Fq(is)30 b Fp(NULL)p Fq(,)390 +5340 y(then)g(read)g(from)g Fp(~/.history)p Fq(.)38 b(Returns)30 +b(0)g(if)h(successful,)f(or)g Fp(errno)f Fq(if)i(not.)p +eop end +%%Page: 8 11 +TeXDict begin 8 10 bop 150 -116 a Fq(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1780 b(8)3350 +299 y([F)-8 b(unction])-3599 b Fh(int)53 b(read_history_range)e +Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename,)g(in)m(t)f(from,)g(in)m(t) +g(to)p Fg(\))390 408 y Fq(Read)28 b(a)g(range)h(of)f(lines)g(from)f +Fk(\014lename)p Fq(,)i(adding)e(them)h(to)h(the)f(history)g(list.)40 +b(Start)28 b(reading)g(at)390 518 y(line)f Fk(from)e +Fq(and)h(end)f(at)i Fk(to)p Fq(.)41 b(If)25 b Fk(from)h +Fq(is)g(zero,)i(start)f(at)g(the)f(b)s(eginning.)39 b(If)26 +b Fk(to)31 b Fq(is)c(less)f(than)g Fk(from)p Fq(,)390 +628 y(then)33 b(read)g(un)m(til)g(the)g(end)g(of)g(the)g(\014le.)49 +b(If)33 b Fk(\014lename)38 b Fq(is)33 b Fp(NULL)p Fq(,)g(then)g(read)g +(from)f Fp(~/.history)p Fq(.)390 737 y(Returns)d(0)i(if)g(successful,)f +(or)g Fp(errno)f Fq(if)i(not.)3350 898 y([F)-8 b(unction])-3599 +b Fh(int)53 b(write_history)d Fg(\()p Ff(const)34 b(c)m(har)g +(*\014lename)p Fg(\))390 1007 y Fq(W)-8 b(rite)36 b(the)e(curren)m(t)h +(history)f(to)h Fk(\014lename)p Fq(,)h(o)m(v)m(erwriting)g +Fk(\014lename)k Fq(if)34 b(necessary)-8 b(.)54 b(If)34 +b Fk(\014lename)390 1117 y Fq(is)27 b Fp(NULL)p Fq(,)g(then)g(write)g +(the)h(history)f(list)g(to)h Fp(~/.history)p Fq(.)37 +b(Returns)26 b(0)i(on)f(success,)h(or)f Fp(errno)f Fq(on)390 +1227 y(a)31 b(read)f(or)g(write)h(error.)3350 1387 y([F)-8 +b(unction])-3599 b Fh(int)53 b(append_history)d Fg(\()p +Ff(in)m(t)33 b(nelemen)m(ts,)i(const)f(c)m(har)f(*\014lename)p +Fg(\))390 1497 y Fq(App)s(end)g(the)i(last)g Fk(nelemen)m(ts)k +Fq(of)c(the)g(history)f(list)i(to)f Fk(\014lename)p Fq(.)54 +b(If)34 b Fk(\014lename)40 b Fq(is)34 b Fp(NULL)p Fq(,)h(then)390 +1606 y(app)s(end)29 b(to)i Fp(~/.history)p Fq(.)38 b(Returns)29 +b(0)i(on)f(success,)h(or)f Fp(errno)f Fq(on)i(a)f(read)h(or)f(write)h +(error.)3350 1767 y([F)-8 b(unction])-3599 b Fh(int)53 +b(history_truncate_file)f Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename,) +f(in)m(t)h(nlines)p Fg(\))390 1876 y Fq(T)-8 b(runcate)39 +b(the)f(history)h(\014le)f Fk(\014lename)p Fq(,)j(lea)m(ving)f(only)f +(the)g(last)g Fk(nlines)j Fq(lines.)65 b(If)38 b Fk(\014lename)44 +b Fq(is)390 1986 y Fp(NULL)p Fq(,)29 b(then)i Fp(~/.history)c +Fq(is)k(truncated.)40 b(Returns)30 b(0)g(on)h(success,)g(or)f +Fp(errno)f Fq(on)h(failure.)150 2169 y Fj(2.3.7)63 b(History)41 +b(Expansion)150 2316 y Fq(These)30 b(functions)g(implemen)m(t)h +(history)f(expansion.)3350 2477 y([F)-8 b(unction])-3599 +b Fh(int)53 b(history_expand)d Fg(\()p Ff(c)m(har)34 +b(*string,)f(c)m(har)h(**output)p Fg(\))390 2586 y Fq(Expand)f +Fk(string)p Fq(,)j(placing)f(the)f(result)h(in)m(to)g +Fk(output)p Fq(,)g(a)g(p)s(oin)m(ter)f(to)h(a)g(string)f(\(see)i +(Section)f(1.1)390 2696 y([History)c(In)m(teraction],)i(page)e(1\).)41 +b(Returns:)390 2839 y Fp(0)432 b Fq(If)37 b(no)g(expansions)g(to)s(ok)i +(place)f(\(or,)i(if)d(the)h(only)f(c)m(hange)i(in)e(the)g(text)i(w)m +(as)f(the)870 2949 y(remo)m(v)-5 b(al)31 b(of)g(escap)s(e)f(c)m +(haracters)i(preceding)e(the)g(history)g(expansion)g(c)m(haracter\);) +390 3093 y Fp(1)432 b Fq(if)30 b(expansions)g(did)g(tak)m(e)i(place;) +390 3236 y Fp(-1)384 b Fq(if)30 b(there)h(w)m(as)g(an)f(error)g(in)g +(expansion;)390 3380 y Fp(2)432 b Fq(if)28 b(the)f(returned)g(line)g +(should)g(b)s(e)g(displa)m(y)m(ed,)i(but)e(not)h(executed,)h(as)f(with) +f(the)h Fp(:p)870 3489 y Fq(mo)s(di\014er)h(\(see)j(Section)f(1.1.3)h +([Mo)s(di\014ers],)e(page)i(2\).)390 3633 y(If)e(an)g(error)g(o)s +(ccurred)g(in)g(expansion,)g(then)g Fk(output)i Fq(con)m(tains)g(a)f +(descriptiv)m(e)g(error)f(message.)3350 3793 y([F)-8 +b(unction])-3599 b Fh(char)54 b(*)e(get_history_event)f +Fg(\()p Ff(const)34 b(c)m(har)g(*string,)e(in)m(t)h(*cindex,)h(in)m(t) +565 3903 y(qc)m(har)p Fg(\))390 4012 y Fq(Returns)45 +b(the)g(text)i(of)e(the)h(history)f(ev)m(en)m(t)i(b)s(eginning)e(at)h +Fk(string)53 b Fp(+)45 b Fk(*cindex)p Fq(.)87 b Fk(*cindex)52 +b Fq(is)390 4122 y(mo)s(di\014ed)28 b(to)i(p)s(oin)m(t)f(to)h(after)g +(the)g(ev)m(en)m(t)h(sp)s(eci\014er.)39 b(A)m(t)31 b(function)e(en)m +(try)-8 b(,)30 b Fk(cindex)36 b Fq(p)s(oin)m(ts)29 b(to)h(the)390 +4232 y(index)35 b(in)m(to)i Fk(string)44 b Fq(where)35 +b(the)h(history)g(ev)m(en)m(t)h(sp)s(eci\014cation)g(b)s(egins.)57 +b Fk(qc)m(har)42 b Fq(is)36 b(a)g(c)m(haracter)390 4341 +y(that)27 b(is)g(allo)m(w)m(ed)i(to)f(end)e(the)h(ev)m(en)m(t)h(sp)s +(eci\014cation)g(in)f(addition)g(to)g(the)g(\\normal")h(terminating)390 +4451 y(c)m(haracters.)3350 4611 y([F)-8 b(unction])-3599 +b Fh(char)54 b(**)e(history_tokenize)f Fg(\()p Ff(const)34 +b(c)m(har)g(*string)p Fg(\))390 4721 y Fq(Return)c(an)h(arra)m(y)g(of)g +(tok)m(ens)h(parsed)e(out)h(of)g Fk(string)p Fq(,)h(m)m(uc)m(h)e(as)i +(the)f(shell)g(migh)m(t.)43 b(The)30 b(tok)m(ens)390 +4830 y(are)h(split)g(on)f(the)h(c)m(haracters)h(in)e(the)h +Fk(history)p 2006 4830 28 4 v 40 w(w)m(ord)p 2241 4830 +V 39 w(delimiters)k Fq(v)-5 b(ariable,)32 b(and)e(shell)g(quoting)390 +4940 y(con)m(v)m(en)m(tions)i(are)f(ob)s(ey)m(ed)g(as)f(describ)s(ed)g +(b)s(elo)m(w.)3350 5101 y([F)-8 b(unction])-3599 b Fh(char)54 +b(*)e(history_arg_extract)f Fg(\()p Ff(in)m(t)34 b(\014rst,)f(in)m(t)g +(last,)g(const)h(c)m(har)f(*string)p Fg(\))390 5210 y +Fq(Extract)41 b(a)g(string)f(segmen)m(t)i(consisting)f(of)f(the)h +Fk(\014rst)g Fq(through)f Fk(last)j Fq(argumen)m(ts)e(presen)m(t)f(in) +390 5320 y Fk(string)p Fq(.)h(Argumen)m(ts)30 b(are)h(split)f(using)g +Fp(history_tokenize)p Fq(.)p eop end +%%Page: 9 12 +TeXDict begin 9 11 bop 150 -116 a Fq(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1780 b(9)150 +299 y Fo(2.4)68 b(History)46 b(V)-11 b(ariables)150 458 +y Fq(This)26 b(section)i(describ)s(es)e(the)h(externally-visible)i(v)-5 +b(ariables)28 b(exp)s(orted)e(b)m(y)h(the)g Fl(gnu)g +Fq(History)g(Library)-8 b(.)3371 641 y([V)g(ariable])-3598 +b Fh(int)53 b(history_base)390 750 y Fq(The)30 b(logical)j(o\013set)e +(of)g(the)f(\014rst)g(en)m(try)g(in)h(the)f(history)g(list.)3371 +933 y([V)-8 b(ariable])-3598 b Fh(int)53 b(history_length)390 +1043 y Fq(The)30 b(n)m(um)m(b)s(er)f(of)h(en)m(tries)i(curren)m(tly)e +(stored)h(in)f(the)g(history)g(list.)3371 1225 y([V)-8 +b(ariable])-3598 b Fh(int)53 b(history_max_entries)390 +1335 y Fq(The)45 b(maxim)m(um)h(n)m(um)m(b)s(er)f(of)h(history)g(en)m +(tries.)88 b(This)45 b(m)m(ust)h(b)s(e)f(c)m(hanged)i(using)e +Fp(stifle_)390 1444 y(history\(\))p Fq(.)3371 1627 y([V)-8 +b(ariable])-3598 b Fh(int)53 b(history_write_timesta)q(mps)390 +1736 y Fq(If)44 b(non-zero,)49 b(timestamps)c(are)g(written)g(to)g(the) +g(history)f(\014le,)49 b(so)c(they)f(can)h(b)s(e)f(preserv)m(ed)390 +1846 y(b)s(et)m(w)m(een)31 b(sessions.)41 b(The)30 b(default)g(v)-5 +b(alue)31 b(is)f(0,)h(meaning)g(that)g(timestamps)g(are)g(not)f(sa)m(v) +m(ed.)390 1980 y(The)41 b(curren)m(t)g(timestamp)h(format)g(uses)f(the) +h(v)-5 b(alue)42 b(of)f Fk(history)p 2697 1980 28 4 v +41 w(commen)m(t)p 3098 1980 V 41 w(c)m(har)48 b Fq(to)42 +b(delimit)390 2090 y(timestamp)h(en)m(tries)g(in)f(the)g(history)h +(\014le.)76 b(If)42 b(that)h(v)-5 b(ariable)43 b(do)s(es)f(not)g(ha)m +(v)m(e)i(a)f(v)-5 b(alue)42 b(\(the)390 2199 y(default\),)31 +b(timestamps)g(will)g(not)f(b)s(e)g(written.)3371 2382 +y([V)-8 b(ariable])-3598 b Fh(char)54 b(history_expansion_char)390 +2491 y Fq(The)35 b(c)m(haracter)i(that)e(in)m(tro)s(duces)g(a)h +(history)f(ev)m(en)m(t.)57 b(The)34 b(default)i(is)f(`)p +Fp(!)p Fq('.)56 b(Setting)35 b(this)h(to)g(0)390 2601 +y(inhibits)30 b(history)g(expansion.)3371 2783 y([V)-8 +b(ariable])-3598 b Fh(char)54 b(history_subst_char)390 +2893 y Fq(The)40 b(c)m(haracter)i(that)g(in)m(v)m(ok)m(es)g(w)m(ord)f +(substitution)f(if)h(found)e(at)i(the)g(start)g(of)g(a)g(line.)72 +b(The)390 3003 y(default)31 b(is)f(`)p Fp(^)p Fq('.)3371 +3185 y([V)-8 b(ariable])-3598 b Fh(char)54 b(history_comment_char)390 +3295 y Fq(During)37 b(tok)m(enization,)43 b(if)38 b(this)f(c)m +(haracter)j(is)e(seen)f(as)h(the)g(\014rst)f(c)m(haracter)j(of)e(a)g(w) +m(ord,)h(then)390 3404 y(it)44 b(and)e(all)j(subsequen)m(t)d(c)m +(haracters)j(up)d(to)i(a)g(newline)f(are)h(ignored,)i(suppressing)c +(history)390 3514 y(expansion)30 b(for)g(the)h(remainder)f(of)g(the)h +(line.)41 b(This)29 b(is)i(disabled)f(b)m(y)g(default.)3371 +3696 y([V)-8 b(ariable])-3598 b Fh(char)54 b(*)e +(history_word_delimiter)q(s)390 3806 y Fq(The)27 b(c)m(haracters)i +(that)f(separate)h(tok)m(ens)f(for)f Fp(history_tokenize\(\))p +Fq(.)35 b(The)27 b(default)h(v)-5 b(alue)28 b(is)f Fp(")390 +3916 y(\\t\\n\(\)<>;&|")p Fq(.)3371 4098 y([V)-8 b(ariable])-3598 +b Fh(char)54 b(*)e(history_search_delimit)q(er_)q(cha)q(rs)390 +4208 y Fq(The)26 b(list)g(of)g(additional)h(c)m(haracters)h(whic)m(h)e +(can)g(delimit)h(a)f(history)g(searc)m(h)h(string,)g(in)f(addition)390 +4317 y(to)31 b(space,)g(T)-8 b(AB,)32 b(`)p Fp(:)p Fq(')e(and)g(`)p +Fp(?)p Fq(')g(in)g(the)h(case)g(of)g(a)g(substring)e(searc)m(h.)41 +b(The)30 b(default)h(is)f(empt)m(y)-8 b(.)3371 4500 y([V)g(ariable]) +-3598 b Fh(char)54 b(*)e(history_no_expand_char)q(s)390 +4609 y Fq(The)29 b(list)i(of)f(c)m(haracters)h(whic)m(h)e(inhibit)h +(history)g(expansion)f(if)h(found)e(immediately)j(follo)m(wing)390 +4719 y Fk(history)p 672 4719 V 40 w(expansion)p 1104 +4719 V 40 w(c)m(har)p Fq(.)41 b(The)30 b(default)g(is)h(space,)g(tab,)g +(newline,)f(carriage)i(return,)e(and)g(`)p Fp(=)p Fq('.)3371 +4902 y([V)-8 b(ariable])-3598 b Fh(int)53 b(history_quotes_inhibi)q +(t_ex)q(pan)q(sio)q(n)390 5011 y Fq(If)33 b(non-zero,)j(the)d(history)h +(expansion)f(co)s(de)h(implemen)m(ts)g(shell-lik)m(e)i(quoting:)48 +b(single-quoted)390 5121 y(w)m(ords)37 b(are)h(not)g(scanned)f(for)g +(the)h(history)f(expansion)g(c)m(haracter)i(or)f(the)f(history)h +(commen)m(t)390 5230 y(c)m(haracter,)48 b(and)42 b(double-quoted)h(w)m +(ords)g(ma)m(y)g(ha)m(v)m(e)h(history)f(expansion)g(p)s(erformed,)i +(since)390 5340 y(single)31 b(quotes)g(are)g(not)f(sp)s(ecial)h(within) +f(double)g(quotes.)41 b(The)30 b(default)h(v)-5 b(alue)30 +b(is)h(0.)p eop end +%%Page: 10 13 +TeXDict begin 10 12 bop 150 -116 a Fq(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1734 b(10)3371 +299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(history_quoting_state)390 +408 y Fq(An)27 b(application)j(ma)m(y)e(set)g(this)g(v)-5 +b(ariable)29 b(to)f(indicate)h(that)g(the)f(curren)m(t)f(line)h(b)s +(eing)g(expanded)390 518 y(is)e(sub)5 b(ject)26 b(to)h(existing)g +(quoting.)40 b(If)26 b(set)g(to)h(`)p Fp(')p Fq(',)g(the)g(history)f +(expansion)g(function)g(will)g(assume)390 628 y(that)i(the)f(line)h(is) +f(single-quoted)h(and)f(inhibit)f(expansion)h(un)m(til)h(it)g(reads)e +(an)i(unquoted)e(closing)390 737 y(single)41 b(quote;)46 +b(if)40 b(set)h(to)f(`)p Fp(")p Fq(',)j(history)e(expansion)f(will)g +(assume)g(the)g(line)h(is)f(double)g(quoted)390 847 y(un)m(til)26 +b(it)g(reads)f(an)g(unquoted)g(closing)h(double)f(quote.)40 +b(If)25 b(set)g(to)i(zero,)g(the)f(default,)g(the)g(history)390 +956 y(expansion)21 b(function)g(will)g(assume)g(the)g(line)h(is)f(not)g +(quoted)g(and)g(treat)h(quote)g(c)m(haracters)g(within)390 +1066 y(the)29 b(line)g(as)g(describ)s(ed)f(ab)s(o)m(v)m(e.)42 +b(This)28 b(is)h(only)g(e\013ectiv)m(e)i(if)e Fk(history)p +2726 1066 28 4 v 40 w(quotes)p 3021 1066 V 40 w(inhibit)p +3324 1066 V 40 w(expansion)390 1176 y Fq(is)h(set.)3371 +1379 y([V)-8 b(ariable])-3598 b Fh(rl_linebuf_func_t)57 +b(*)c(history_inhibit_expans)q(ion)q(_fu)q(ncti)q(on)390 +1489 y Fq(This)32 b(should)h(b)s(e)f(set)i(to)g(the)g(address)e(of)i(a) +f(function)g(that)h(tak)m(es)h(t)m(w)m(o)g(argumen)m(ts:)46 +b(a)34 b Fp(char)29 b(*)390 1598 y Fq(\()p Fk(string)8 +b Fq(\))27 b(and)f(an)g Fp(int)g Fq(index)g(in)m(to)i(that)f(string)f +(\()p Fk(i)5 b Fq(\).)40 b(It)27 b(should)f(return)f(a)i(non-zero)g(v) +-5 b(alue)27 b(if)g(the)390 1708 y(history)i(expansion)g(starting)h(at) +g Fk(string[i])j Fq(should)28 b(not)i(b)s(e)e(p)s(erformed;)h(zero)h +(if)f(the)g(expansion)390 1817 y(should)i(b)s(e)g(done.)45 +b(It)32 b(is)g(in)m(tended)g(for)g(use)g(b)m(y)f(applications)i(lik)m +(e)h(Bash)e(that)g(use)g(the)g(history)390 1927 y(expansion)e(c)m +(haracter)i(for)e(additional)i(purp)s(oses.)39 b(By)30 +b(default,)h(this)f(v)-5 b(ariable)31 b(is)g(set)g(to)g +Fp(NULL)p Fq(.)150 2182 y Fo(2.5)68 b(History)46 b(Programming)g +(Example)150 2342 y Fq(The)30 b(follo)m(wing)i(program)e(demonstrates)h +(simple)f(use)g(of)h(the)f Fl(gnu)g Fq(History)h(Library)-8 +b(.)390 2463 y Fe(#include)41 b()390 2550 y(#include)g +()390 2725 y(main)f(\(argc,)h(argv\))586 +2812 y(int)f(argc;)586 2899 y(char)g(**argv;)390 2986 +y({)468 3073 y(char)h(line[1024],)g(*t;)468 3161 y(int)f(len,)g(done)h +(=)e(0;)468 3335 y(line[0])i(=)f(0;)468 3509 y(using_history)j(\(\);) +468 3597 y(while)e(\(!done\))547 3684 y({)625 3771 y(printf)g +(\("history$)g("\);)625 3858 y(fflush)g(\(stdout\);)625 +3945 y(t)f(=)f(fgets)i(\(line,)f(sizeof)h(\(line\))f(-)g(1,)g(stdin\);) +625 4032 y(if)g(\(t)g(&&)f(*t\))704 4120 y({)782 4207 +y(len)h(=)g(strlen)g(\(t\);)782 4294 y(if)g(\(t[len)h(-)e(1])h(==)f +('\\n'\))861 4381 y(t[len)h(-)g(1])f(=)h('\\0';)704 4468 +y(})625 4643 y(if)g(\(!t\))704 4730 y(strcpy)g(\(line,)h("quit"\);)625 +4904 y(if)f(\(line[0]\))704 4991 y({)782 5078 y(char)g(*expansion;)782 +5166 y(int)g(result;)782 5340 y(result)h(=)e(history_expand)k(\(line,)d +(&expansion\);)p eop end +%%Page: 11 14 +TeXDict begin 11 13 bop 150 -116 a Fq(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1734 b(11)782 +299 y Fe(if)40 b(\(result\))861 386 y(fprintf)h(\(stderr,)g +("\045s\\n",)f(expansion\);)782 560 y(if)g(\(result)h(<)e(0)h(||)f +(result)i(==)f(2\))861 648 y({)939 735 y(free)g(\(expansion\);)939 +822 y(continue;)861 909 y(})782 1083 y(add_history)i(\(expansion\);)782 +1171 y(strncpy)f(\(line,)g(expansion,)g(sizeof)g(\(line\))f(-)g(1\);) +782 1258 y(free)g(\(expansion\);)704 1345 y(})625 1519 +y(if)g(\(strcmp)h(\(line,)f("quit"\))h(==)f(0\))704 1606 +y(done)g(=)f(1;)625 1694 y(else)h(if)g(\(strcmp)h(\(line,)g("save"\))f +(==)g(0\))704 1781 y(write_history)i(\("history_file"\);)625 +1868 y(else)e(if)g(\(strcmp)h(\(line,)g("read"\))f(==)g(0\))704 +1955 y(read_history)i(\("history_file"\);)625 2042 y(else)e(if)g +(\(strcmp)h(\(line,)g("list"\))f(==)g(0\))704 2130 y({)782 +2217 y(register)h(HIST_ENTRY)h(**the_list;)782 2304 y(register)f(int)f +(i;)782 2478 y(the_list)h(=)f(history_list)i(\(\);)782 +2565 y(if)e(\(the_list\))861 2653 y(for)g(\(i)f(=)h(0;)f(the_list[i];)j +(i++\))939 2740 y(printf)f(\("\045d:)f(\045s\\n",)h(i)e(+)h +(history_base,)i(the_list[i]->line\);)704 2827 y(})625 +2914 y(else)e(if)g(\(strncmp)h(\(line,)g("delete",)g(6\))f(==)f(0\))704 +3001 y({)782 3088 y(int)h(which;)782 3176 y(if)g(\(\(sscanf)h(\(line)f +(+)g(6,)g("\045d",)g(&which\)\))h(==)f(1\))861 3263 y({)939 +3350 y(HIST_ENTRY)i(*entry)e(=)g(remove_history)i(\(which\);)939 +3437 y(if)e(\(!entry\))1018 3524 y(fprintf)g(\(stderr,)i("No)d(such)i +(entry)f(\045d\\n",)h(which\);)939 3611 y(else)1018 3699 +y({)1096 3786 y(free)f(\(entry->line\);)1096 3873 y(free)g(\(entry\);) +1018 3960 y(})861 4047 y(})782 4134 y(else)861 4222 y({)939 +4309 y(fprintf)h(\(stderr,)g("non-numeric)h(arg)e(given)g(to)g +(`delete'\\n"\);)861 4396 y(})704 4483 y(})547 4570 y(})390 +4658 y(})p eop end +%%Page: 12 15 +TeXDict begin 12 14 bop 3659 -116 a Fq(12)150 299 y Fm(App)t(endix)52 +b(A)81 b(GNU)54 b(F)-13 b(ree)53 b(Do)t(cumen)l(tation)e(License)1359 +502 y Fq(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390 +635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fn(\015)e +Fq(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31 +b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745 +y Fp(http://fsf.org/)390 964 y Fq(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f +(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390 +1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f +(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330 +1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g +(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330 +1450 y(useful)29 b(do)s(cumen)m(t)h Fk(free)36 b Fq(in)29 +b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j +(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f +(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i +(either)f(commercially)h(or)e(non-)330 1669 y(commercially)-8 +b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f +(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 1778 +y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g +(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330 +1888 y(made)30 b(b)m(y)h(others.)330 2021 y(This)22 b(License)i(is)f(a) +h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5 +b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330 +2131 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g +(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330 +2240 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed) +e(for)g(free)h(soft)m(w)m(are.)330 2373 y(W)-8 b(e)31 +b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h +(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330 +2483 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:) +65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330 +2592 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w) +m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g +(to)330 2702 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g +(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5 +b(ject)30 b(matter)i(or)330 2812 y(whether)f(it)h(is)f(published)f(as)i +(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h +(License)g(principally)f(for)330 2921 y(w)m(orks)f(whose)h(purp)s(ose)d +(is)j(instruction)f(or)g(reference.)199 3054 y(1.)61 +b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3187 y(This)39 +b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i +(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3297 +y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying) +h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330 +3407 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f +(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d +(in)330 3516 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j +(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330 +3626 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h +(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g +(a)h(licensee,)i(and)330 3735 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40 +b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8 +b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330 +3845 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop) +m(yrigh)m(t)j(la)m(w.)330 3978 y(A)i(\\Mo)s(di\014ed)f(V)-8 +b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f +(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4088 y(a)k(p)s(ortion)f +(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s +(di\014cations)f(and/or)h(translated)g(in)m(to)330 4197 +y(another)31 b(language.)330 4330 y(A)26 b(\\Secondary)g(Section")h(is) +f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f +(the)g(Do)s(cumen)m(t)330 4440 y(that)c(deals)g(exclusiv)m(ely)h(with)e +(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f +(Do)s(cumen)m(t)330 4549 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m +(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con) +m(tains)h(nothing)f(that)330 4659 y(could)j(fall)h(directly)g(within)f +(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42 +b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330 +4769 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section) +h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40 +b(The)330 4878 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e +(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27 +b(or)g(with)g(related)330 4988 y(matters,)38 b(or)d(of)h(legal,)i +(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s +(osition)f(regarding)330 5097 y(them.)330 5230 y(The)25 +b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g +(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330 +5340 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27 +b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s +(cumen)m(t)g(is)g(released)p eop end +%%Page: 13 16 +TeXDict begin 13 15 bop 150 -116 a Fq(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(13)330 299 y(under)26 b(this)i(License.)40 b(If)27 +b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h +(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 408 +y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5 +b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero) +e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25 +b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v) +-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330 +669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short) +g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8 +b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er) +j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f +(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40 +b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26 +b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m +(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m +(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g +(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8 +b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s +(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g +(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s +(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors) +f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g +(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g +(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587 +y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g +(formatters)f(or)g(for)g(automatic)i(translation)f(to)330 +1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input) +g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g +(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g +(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f +(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g +(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8 +b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35 +b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g +(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g +(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i +(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T) +-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fl(asci)r(i)g +Fq(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j +(LaT)1759 2414 y(E)1810 2395 y(X)e(input)f(format,)j +Fd(SGML)f Fq(or)f Fd(XML)g Fq(using)g(a)g(publicly)330 +2504 y(a)m(v)-5 b(ailable)42 b Fd(DTD)p Fq(,)h(and)c +(standard-conforming)g(simple)h Fd(HTML)p Fq(,)i(P)m(ostScript)e(or)f +Fd(PDF)h Fq(designed)330 2614 y(for)e(h)m(uman)f(mo)s(di\014cation.)65 +b(Examples)38 b(of)h(transparen)m(t)f(image)h(formats)g(include)f +Fd(PNG)p Fq(,)i Fd(X)n(CF)330 2724 y Fq(and)e Fd(JPG)p +Fq(.)64 b(Opaque)38 b(formats)h(include)f(proprietary)h(formats)f(that) +h(can)g(b)s(e)f(read)h(and)f(edited)330 2833 y(only)54 +b(b)m(y)f(proprietary)h(w)m(ord)f(pro)s(cessors,)59 b +Fd(SGML)54 b Fq(or)f Fd(XML)h Fq(for)g(whic)m(h)f(the)h +Fd(DTD)g Fq(and/or)330 2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g +(generally)i(a)m(v)-5 b(ailable,)71 b(and)60 b(the)h(mac)m +(hine-generated)j Fd(HTML)p Fq(,)330 3052 y(P)m(ostScript)31 +b(or)f Fd(PDF)h Fq(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s +(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330 +3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m(ted)f(b) +s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f(follo)m +(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8 +b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f +(in)h(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28 +b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e +(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330 +3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s +(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330 +3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330 +3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit) +m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330 +3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g +(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h +(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m +(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f +(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40 +b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f +(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m +(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f +(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491 +y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s +(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330 +4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g +(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W) +-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m +(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f +(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36 +b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m +(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f +(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g +(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39 +b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330 +5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199 +5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end +%%Page: 14 17 +TeXDict begin 14 16 bop 150 -116 a Fq(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(14)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h +(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h +(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 +b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j +(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e +(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e +(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h +(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f +(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 +737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h +(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330 +847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28 +b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d +(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f +(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g +(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200 +y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g +(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g +(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443 +y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25 +b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g +(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330 +1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f +(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330 +1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i +(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36 +b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m +(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41 +b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44 +b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330 +2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m) +m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f +(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34 +b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i +(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e +(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g +(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330 +2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v) +m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the) +330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d +(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330 +2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e +(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g +(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f +(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the) +g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330 +2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051 +y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f +(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330 +3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g +(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque) +330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h +(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d +(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e +(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m +(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8 +b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g +(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h +(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e +(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g +(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38 +b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330 +3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s +(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h +(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i +(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h +(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330 +4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g +(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330 +4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s +(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m +(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g +(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8 +b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a) +h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under) +e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v) +m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f +(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29 +b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30 +b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f +(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h +(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s +(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30 +b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s +(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33 +b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e +(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510 +5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m +(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8 +b(,)p eop end +%%Page: 15 18 +TeXDict begin 15 17 bop 150 -116 a Fq(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(15)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g +(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same) +h(title)h(as)510 408 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original) +i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 +545 y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h +(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c +(for)510 655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g +(Mo)s(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h +(\014v)m(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s +(cumen)m(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g +(few)m(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g +(y)m(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60 +b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g +(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32 +b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31 +b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.) +363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i +(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g +(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641 +y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g +(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510 +1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8 +b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g +(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353 +1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f +(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e +(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f +(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244 +y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.) +392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g +(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g +(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d +(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8 +b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45 +b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e +(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f +(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s +(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i +(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8 +b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m +(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s +(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m +(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30 +b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net) +m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m +(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45 +b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395 +y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net) +m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h +(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e +(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher) +d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s +(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m +(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k +(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d +(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone) +h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m +(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368 +4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5 +b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f +(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58 +b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5 +b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510 +4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33 +b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42 +b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510 +4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357 +4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f +(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g +(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31 +b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8 +b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g +(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f +(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g +(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h +(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h +(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5 +b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p +eop end +%%Page: 16 19 +TeXDict begin 16 18 bop 150 -116 a Fq(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(16)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 +b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8 +b(ersion's)36 b(license)g(notice.)57 b(These)330 408 +y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g +(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section) +i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g +(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s +(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30 +b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770 +y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro) +m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330 +880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8 +b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m +(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8 +b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e +(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i +(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s +(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f +(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m +(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351 +y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\)) +g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t) +g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g +(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m +(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m +(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g +(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the) +f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e +(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330 +1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s +(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s +(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g +(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g +(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61 +b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m +(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h +(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g +(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f +(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655 +y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5 +b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s +(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g +(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined) +g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32 +b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8 +b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m +(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,) +i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5 +b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h +(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m +(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g +(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f +(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f +(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g +(the)g(original)h(author)f(or)330 3455 y(publisher)23 +b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m +(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330 +3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5 +b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h +(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m +(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g +(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330 +3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h +(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330 +4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31 +b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47 +b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m +(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28 +b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f +(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g +(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k +(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f +(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single) +g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48 +b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38 +b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g +(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330 +4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32 +b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h +(collection,)i(and)d(distribute)g(it)h(individu-)330 +5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g +(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330 +5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g +(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330 +5340 y(that)d(do)s(cumen)m(t.)p eop end +%%Page: 17 20 +TeXDict begin 17 19 bop 150 -116 a Fq(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(17)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h +(W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f +(its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep) +s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h +(on)f(a)g(v)m(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g +(is)h(called)330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i +(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g +(the)330 770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e +(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39 +b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g +(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g +(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h +(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h +(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8 +b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f +(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241 +y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f +(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m +(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m +(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h +(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5 +b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f +(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330 +1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f +(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61 +b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a) +i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e +(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h +(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5 +b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f +(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i +(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24 +b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25 +b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330 +2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44 +b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f +(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the) +h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42 +b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513 +y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g +(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330 +2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33 +b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f +(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f +(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m +(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28 +b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m +(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330 +3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m +(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330 +3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61 +b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8 +b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h +(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38 +b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g +(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330 +3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically) +i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330 +3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i +(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h +(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h +(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g +(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h +(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8 +b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34 +b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h +(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288 +y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d +(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h +(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h +(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g +(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m +(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f +(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330 +4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g +(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h +(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28 +b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h +(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38 +b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g +(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e) +330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g +(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f +(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f +(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end +%%Page: 18 21 +TeXDict begin 18 20 bop 150 -116 a Fq(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(18)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 +433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8 +b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g +(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34 +b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31 +b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330 +653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f +(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330 +762 y(See)c Fp(http://www.gnu.org/copy)o(left)o(/)p Fq(.)330 +897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g +(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29 +b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g +(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h +(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33 +b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i +(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330 +1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m +(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g +(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8 +b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s +(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445 +y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m +(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the) +h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46 +b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f +(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f +(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen) +m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m +(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g +(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330 +2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or) +e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330 +2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m +(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h +(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g +(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i +(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33 +b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s +(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330 +2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m +(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330 +2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m +(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330 +2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a) +g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330 +2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29 +b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions) +f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g +(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e +(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h +(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330 +3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h +(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330 +3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h +(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330 +3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f +(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts) +330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j +(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s +(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h +(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site) +g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g +(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is) +330 4005 y(eligible)h(for)e(relicensing.)p eop end +%%Page: 19 22 +TeXDict begin 19 21 bop 150 -116 a Fq(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(19)150 299 y Fo(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f +(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Fq(T)-8 b(o)35 +b(use)f(this)h(License)g(in)f(a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e) +i(written,)g(include)f(a)f(cop)m(y)i(of)f(the)f(License)h(in)g(the)150 +568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh) +m(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468 +680 y Fe(Copyright)42 b(\(C\))79 b Fc(year)g(your)40 +b(name)p Fe(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h +(distribute)g(and/or)g(modify)f(this)g(document)468 854 +y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i +(License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h +(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468 +1029 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g +(and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f +(license)i(is)f(included)h(in)f(the)g(section)g(entitled)h(``GNU)468 +1203 y(Free)g(Documentation)h(License''.)275 1337 y Fq(If)d(y)m(ou)h +(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8 +b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k +(T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6 +b(.)22 b(.)g(.)12 b(T)-8 b(exts.")41 b(line)31 b(with)f(this:)547 +1559 y Fe(with)40 b(the)g(Invariant)h(Sections)g(being)g +Fc(list)f(their)g(titles)p Fe(,)h(with)547 1646 y(the)f(Front-Cover)i +(Texts)e(being)g Fc(list)p Fe(,)h(and)f(with)g(the)g(Back-Cover)h +(Texts)547 1733 y(being)f Fc(list)p Fe(.)275 1868 y Fq(If)34 +b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f +(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g +(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g +(alternativ)m(es)i(to)e(suit)f(the)h(situation.)275 2112 +y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g +(examples)g(of)f(program)f(co)s(de,)j(w)m(e)e(recommend)g(releasing)150 +2222 y(these)44 b(examples)f(in)g(parallel)h(under)e(y)m(our)h(c)m +(hoice)i(of)e(free)g(soft)m(w)m(are)h(license,)k(suc)m(h)43 +b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s +(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p +eop end +%%Page: 20 23 +TeXDict begin 20 22 bop 150 -116 a Fq(App)s(endix)29 +b(B:)i(Concept)f(Index)2391 b(20)150 100 y Fm(App)t(endix)52 +b(B)81 b(Concept)51 b(Index)146 434 y Fo(A)150 550 y +Fb(anc)n(hored)26 b(searc)n(h)12 b Fa(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fb(7)146 782 y Fo(E)150 +898 y Fb(ev)n(en)n(t)e(designators)7 b Fa(:)14 b(:)f(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fb(1)146 1140 y Fo(H)150 +1256 y Fb(history)k(ev)n(en)n(ts)12 b Fa(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fb(1)150 +1344 y(history)f(expansion)18 b Fa(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)34 b Fb(1)150 1431 y(History)26 b(Searc)n(hing)16 +b Fa(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)31 +b Fb(7)p eop end +%%Page: 21 24 +TeXDict begin 21 23 bop 150 -116 a Fq(App)s(endix)29 +b(C:)h(F)-8 b(unction)31 b(and)f(V)-8 b(ariable)32 b(Index)1832 +b(21)150 100 y Fm(App)t(endix)52 b(C)81 b(F)-13 b(unction)52 +b(and)h(V)-13 b(ariable)53 b(Index)150 400 y Fe(history_base)10 +b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)25 b Fb(9)150 487 y Fe(history_comment_char)7 b Fa(:)17 +b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(9)150 574 y Fe +(history_expansion_char)i Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 +b Fb(9)150 661 y Fe(history_inhibit_expansion_fun)q(ctio)q(n)26 +b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fb(10)150 +749 y Fe(history_length)25 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)37 b Fb(9)150 836 y Fe(history_max_entries)9 +b Fa(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 b Fb(9)150 +923 y Fe(history_no_expand_chars)16 b Fa(:)i(:)c(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31 +b Fb(9)150 1010 y Fe(history_quotes_inhibit_expans)q(ion)11 +b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25 +b Fb(9)150 1097 y Fe(history_quoting_state)f Fa(:)13 +b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)33 b Fb(10)150 1184 y Fe +(history_search_delimiter_char)q(s)15 b Fa(:)k(:)13 b(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fb(9)150 1272 y Fe +(history_subst_char)12 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +27 b Fb(9)150 1359 y Fe(history_word_delimiters)16 b +Fa(:)i(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)31 b Fb(9)150 1446 y Fe(history_write_timestamps)13 +b Fa(:)19 b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)28 b Fb(9)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/doc/history.texi b/doc/history.texi new file mode 100644 index 0000000..721118b --- /dev/null +++ b/doc/history.texi @@ -0,0 +1,85 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header (This is for running Texinfo on a region.) +@setfilename history.info +@settitle GNU History Library +@include version.texi + +@c %**end of header (This is for running Texinfo on a region.) + +@copying +This document describes the GNU History library +(version @value{VERSION}, @value{UPDATED}), +a programming tool that provides a consistent user interface for +recalling lines of previously typed input. + +Copyright @copyright{} 1988--2022 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled +``GNU Free Documentation License''. + +@end quotation +@end copying + +@dircategory Libraries +@direntry +* History: (history). The GNU history library API. +@end direntry + +@titlepage +@title GNU History Library +@subtitle Edition @value{EDITION}, for @code{History Library} Version @value{VERSION}. +@subtitle @value{UPDATED-MONTH} +@author Chet Ramey, Case Western Reserve University +@author Brian Fox, Free Software Foundation + +@page + +@vskip 0pt plus 1filll +@insertcopying + +@end titlepage + +@contents + +@ifnottex +@node Top +@top GNU History Library + +This document describes the GNU History library, a programming tool that +provides a consistent user interface for recalling lines of previously +typed input. + +@menu +* Using History Interactively:: GNU History User's Manual. +* Programming with GNU History:: GNU History Programmer's Manual. +* GNU Free Documentation License:: License for copying this manual. +* Concept Index:: Index of concepts described in this manual. +* Function and Variable Index:: Index of externally visible functions + and variables. +@end menu +@end ifnottex + +@syncodeindex fn vr + +@include hsuser.texi +@include hstech.texi + +@node GNU Free Documentation License +@appendix GNU Free Documentation License + +@include fdl.texi + +@node Concept Index +@appendix Concept Index +@printindex cp + +@node Function and Variable Index +@appendix Function and Variable Index +@printindex vr + +@bye diff --git a/doc/history_3.ps b/doc/history_3.ps new file mode 100644 index 0000000..4440b3f --- /dev/null +++ b/doc/history_3.ps @@ -0,0 +1,896 @@ +%!PS-Adobe-3.0 +%%Creator: groff version 1.22.4 +%%CreationDate: Fri Sep 23 09:52:37 2022 +%%DocumentNeededResources: font Times-Roman +%%+ font Times-Bold +%%+ font Times-Italic +%%DocumentSuppliedResources: procset grops 1.22 4 +%%Pages: 7 +%%PageOrder: Ascend +%%DocumentMedia: Default 612 792 0 () () +%%Orientation: Portrait +%%EndComments +%%BeginDefaults +%%PageMedia: Default +%%EndDefaults +%%BeginProlog +%%BeginResource: procset grops 1.22 4 +%!PS-Adobe-3.0 Resource-ProcSet +/setpacking where{ +pop +currentpacking +true setpacking +}if +/grops 120 dict dup begin +/SC 32 def +/A/show load def +/B{0 SC 3 -1 roll widthshow}bind def +/C{0 exch ashow}bind def +/D{0 exch 0 SC 5 2 roll awidthshow}bind def +/E{0 rmoveto show}bind def +/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def +/G{0 rmoveto 0 exch ashow}bind def +/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/I{0 exch rmoveto show}bind def +/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def +/K{0 exch rmoveto 0 exch ashow}bind def +/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/M{rmoveto show}bind def +/N{rmoveto 0 SC 3 -1 roll widthshow}bind def +/O{rmoveto 0 exch ashow}bind def +/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/Q{moveto show}bind def +/R{moveto 0 SC 3 -1 roll widthshow}bind def +/S{moveto 0 exch ashow}bind def +/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/SF{ +findfont exch +[exch dup 0 exch 0 exch neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/MF{ +findfont +[5 2 roll +0 3 1 roll +neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/level0 0 def +/RES 0 def +/PL 0 def +/LS 0 def +/MANUAL{ +statusdict begin/manualfeed true store end +}bind def +/PLG{ +gsave newpath clippath pathbbox grestore +exch pop add exch pop +}bind def +/BP{ +/level0 save def +1 setlinecap +1 setlinejoin +DEFS/BPhook known{DEFS begin BPhook end}if +72 RES div dup scale +LS{ +90 rotate +}{ +0 PL translate +}ifelse +1 -1 scale +}bind def +/EP{ +level0 restore +showpage +}def +/DA{ +newpath arcn stroke +}bind def +/SN{ +transform +.25 sub exch .25 sub exch +round .25 add exch round .25 add exch +itransform +}bind def +/DL{ +SN +moveto +SN +lineto stroke +}bind def +/DC{ +newpath 0 360 arc closepath +}bind def +/TM matrix def +/DE{ +TM currentmatrix pop +translate scale newpath 0 0 .5 0 360 arc closepath +TM setmatrix +}bind def +/RC/rcurveto load def +/RL/rlineto load def +/ST/stroke load def +/MT/moveto load def +/CL/closepath load def +/Fr{ +setrgbcolor fill +}bind def +/setcmykcolor where{ +pop +/Fk{ +setcmykcolor fill +}bind def +}if +/Fg{ +setgray fill +}bind def +/FL/fill load def +/LW/setlinewidth load def +/Cr/setrgbcolor load def +/setcmykcolor where{ +pop +/Ck/setcmykcolor load def +}if +/Cg/setgray load def +/RE{ +findfont +dup maxlength 1 index/FontName known not{1 add}if dict begin +{ +1 index/FID ne +2 index/UniqueID ne +and +{def}{pop pop}ifelse +}forall +/Encoding exch def +dup/FontName exch def +currentdict end definefont pop +}bind def +/DEFS 0 def +/EBEGIN{ +moveto +DEFS begin +}bind def +/EEND/end load def +/CNT 0 def +/level1 0 def +/PBEGIN{ +/level1 save def +translate +div 3 1 roll div exch scale +neg exch neg exch translate +0 setgray +0 setlinecap +1 setlinewidth +0 setlinejoin +10 setmiterlimit +[]0 setdash +/setstrokeadjust where{ +pop +false setstrokeadjust +}if +/setoverprint where{ +pop +false setoverprint +}if +newpath +/CNT countdictstack def +userdict begin +/showpage{}def +/setpagedevice{}def +mark +}bind def +/PEND{ +cleartomark +countdictstack CNT sub{end}repeat +level1 restore +}bind def +end def +/setpacking where{ +pop +setpacking +}if +%%EndResource +%%EndProlog +%%BeginSetup +%%BeginFeature: *PageSize Default +<< /PageSize [ 612 792 ] /ImagingBBox null >> setpagedevice +%%EndFeature +%%IncludeResource: font Times-Roman +%%IncludeResource: font Times-Bold +%%IncludeResource: font Times-Italic +grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 +def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron +/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent +/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen +/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O +/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex +/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y +/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft +/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl +/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut +/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash +/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen +/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft +/logicalnot/minus/registered/macron/degree/plusminus/twosuperior +/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior +/ordmasculine/guilsinglright/onequarter/onehalf/threequarters +/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE +/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn +/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla +/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis +/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash +/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE +/Times-Roman@0 ENC0/Times-Roman RE +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library) +-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E/F1 +10.95/Times-Bold@0 SF -.219(NA)72 84 S(ME).219 E F0 +(history \255 GNU History Library)108 96 Q F1(COPYRIGHT)72 112.8 Q F0 +(The GNU History Library is Cop)108 124.8 Q +(yright \251 1989-2020 by the Free Softw)-.1 E(are F)-.1 E +(oundation, Inc.)-.15 E F1(DESCRIPTION)72 141.6 Q F0(Man)108 153.6 Q +2.81(yp)-.15 G .31(rograms read input from the user a line at a time.) +-2.81 F .309(The GNU History library is able to k)5.309 F .309 +(eep track of)-.1 F .024(those lines, associate arbitrary data with eac\ +h line, and utilize information from pre)108 165.6 R .024 +(vious lines in composing)-.25 F(ne)108 177.6 Q 2.5(wo)-.25 G(nes.)-2.5 +E F1(HIST)72 194.4 Q(OR)-.197 E 2.738(YE)-.383 G(XP)-2.738 E(ANSION)-.81 +E F0 .823(The history library supports a history e)108 206.4 R .822 +(xpansion feature that is identical to the history e)-.15 F .822 +(xpansion in)-.15 F/F2 10/Times-Bold@0 SF(bash.)3.322 E F0 +(This section describes what syntax features are a)108 218.4 Q -.25(va) +-.2 G(ilable.).25 E 1.305(History e)108 235.2 R 1.305 +(xpansions introduce w)-.15 F 1.306(ords from the history list into the\ + input stream, making it easy to repeat)-.1 F .21 +(commands, insert the ar)108 247.2 R .21(guments to a pre)-.18 F .209 +(vious command into the current input line, or \214x errors in pre)-.25 +F(vious)-.25 E(commands quickly)108 259.2 Q(.)-.65 E 1.296(History e)108 +276 R 1.297(xpansion is usually performed immediately after a complete \ +line is read.)-.15 F 1.297(It tak)6.297 F 1.297(es place in tw)-.1 F(o) +-.1 E 2.855(parts. The)108 288 R .354(\214rst is to determine which lin\ +e from the history list to use during substitution.)2.855 F .354 +(The second is to)5.354 F .116 +(select portions of that line for inclusion into the current one.)108 +300 R .117(The line selected from the history is the)5.116 F/F3 10 +/Times-Italic@0 SF -.15(ev)2.617 G(ent).15 E F0(,)A .846 +(and the portions of that line that are acted upon are)108 312 R F3(wor) +3.346 E(ds)-.37 E F0 5.846(.V)C(arious)-6.956 E F3(modi\214er)3.346 E(s) +-.1 E F0 .846(are a)3.346 F -.25(va)-.2 G .845(ilable to manipulate).25 +F .304(the selected w)108 324 R 2.804(ords. The)-.1 F .304(line is brok) +2.804 F .304(en into w)-.1 F .304(ords in the same f)-.1 F .304 +(ashion as)-.1 F F2(bash)2.804 E F0 .305(does when reading input, so) +2.804 F .539(that se)108 336 R -.15(ve)-.25 G .539(ral w).15 F .539 +(ords that w)-.1 F .539 +(ould otherwise be separated are considered one w)-.1 F .538 +(ord when surrounded by quotes)-.1 F .307(\(see the description of)108 +348 R F2(history_tok)2.807 E(enize\(\))-.1 E F0(belo)2.807 E 2.807 +(w\). History)-.25 F -.15(ex)2.807 G .307 +(pansions are introduced by the appearance of).15 F .52(the history e) +108 360 R .52(xpansion character)-.15 F 3.02(,w)-.4 G .52(hich is)-3.02 +F F2(!)3.853 E F0 .52(by def)3.853 F 3.02(ault. Only)-.1 F .52 +(backslash \()3.02 F F2(\\).833 E F0 3.02(\)a).833 G .52 +(nd single quotes can quote the)-3.02 F(history e)108 372 Q +(xpansion character)-.15 E(.)-.55 E F2(Ev)87 388.8 Q(ent Designators)-.1 +E F0 .204(An e)108 400.8 R -.15(ve)-.25 G .204(nt designator is a refer\ +ence to a command line entry in the history list.).15 F .205 +(Unless the reference is abso-)5.204 F(lute, e)108 412.8 Q -.15(ve)-.25 +G(nts are relati).15 E .3 -.15(ve t)-.25 H 2.5(ot).15 G +(he current position in the history list.)-2.5 E F2(!)108 429.6 Q F0 +(Start a history substitution, e)144 429.6 Q(xcept when follo)-.15 E +(wed by a)-.25 E F2(blank)2.5 E F0 2.5(,n)C -.25(ew)-2.5 G +(line, = or \(.).25 E F2(!)108 441.6 Q F3(n)A F0(Refer to command line) +144 441.6 Q F3(n)2.86 E F0(.).24 E F2<21ad>108 453.6 Q F3(n)A F0 +(Refer to the current command minus)144 453.6 Q F3(n)2.86 E F0(.).24 E +F2(!!)108 465.6 Q F0(Refer to the pre)144 465.6 Q(vious command.)-.25 E +(This is a synon)5 E(ym for `!\2551'.)-.15 E F2(!)108 477.6 Q F3(string) +A F0 .865(Refer to the most recent command preceding the current positi\ +on in the history list starting with)144 477.6 R F3(string)144.34 489.6 +Q F0(.).22 E F2(!?)108 501.6 Q F3(string)A F2([?])A F0 1.503(Refer to t\ +he most recent command preceding the current position in the history li\ +st containing)144 513.6 R F3(string)144.34 525.6 Q F0 5.497(.T).22 G +.497(he trailing)-5.497 F F2(?)2.997 E F0 .497(may be omitted if)2.997 F +F3(string)3.337 E F0 .496(is follo)3.216 F .496(wed immediately by a ne) +-.25 F 2.996(wline. If)-.25 F F3(string)2.996 E F0(is)2.996 E .39(missi\ +ng, the string from the most recent search is used; it is an error if t\ +here is no pre)144 537.6 R .391(vious search)-.25 F(string.)144 549.6 Q +/F4 12/Times-Bold@0 SF(^)108 566.6 Q F3(string1)-5 I F4(^)5 I F3 +(string2)-5 I F4(^)5 I F0 2.599(Quick substitution.)144 573.6 R 2.598 +(Repeat the last command, replacing)7.599 F F3(string1)5.438 E F0(with) +5.098 E F3(string2)5.438 E F0 7.598(.E).02 G(qui)-7.598 E -.25(va)-.25 G +2.598(lent to).25 F -.74(``)144 585.6 S(!!:s).74 E/F5 12/Times-Roman@0 +SF(^)5 I F3(string1)-5 I F5(^)5 I F3(string2)-5 I F5(^)5 I F0 1.48 -.74 +('' \()-5 L(see).74 E F2(Modi\214ers)2.5 E F0(belo)2.5 E(w\).)-.25 E F2 +(!#)108 597.6 Q F0(The entire command line typed so f)144 597.6 Q(ar)-.1 +E(.)-.55 E F2 -.75(Wo)87 614.4 S(rd Designators).75 E F0 -.8(Wo)108 +626.4 S 1.313(rd designators are used to select desired w).8 F 1.314 +(ords from the e)-.1 F -.15(ve)-.25 G 3.814(nt. A).15 F F2(:)3.814 E F0 +1.314(separates the e)3.814 F -.15(ve)-.25 G 1.314(nt speci\214cation) +.15 F .53(from the w)108 638.4 R .529(ord designator)-.1 F 5.529(.I)-.55 +G 3.029(tm)-5.529 G .529(ay be omitted if the w)-3.029 F .529 +(ord designator be)-.1 F .529(gins with a)-.15 F F2(^)3.029 E F0(,)A F2 +($)3.029 E F0(,)A F2(*)3.029 E F0(,)A F23.029 E F0 3.029(,o)C(r) +-3.029 E F2(%)3.029 E F0 5.529(.W)C(ords)-6.329 E .515 +(are numbered from the be)108 650.4 R .516 +(ginning of the line, with the \214rst w)-.15 F .516 +(ord being denoted by 0 \(zero\).)-.1 F -.8(Wo)5.516 G .516(rds are in-) +.8 F(serted into the current line separated by single spaces.)108 662.4 +Q F2 2.5(0\()108 679.2 S(zer)-2.5 E(o\))-.18 E F0(The zeroth w)144 691.2 +Q 2.5(ord. F)-.1 F(or the shell, this is the command w)-.15 E(ord.)-.1 E +F3(n)108.36 703.2 Q F0(The)144 703.2 Q F3(n)2.5 E F0(th w)A(ord.)-.1 E +F2(^)108 715.2 Q F0(The \214rst ar)144 715.2 Q 2.5(gument. That)-.18 F +(is, w)2.5 E(ord 1.)-.1 E(GNU History 8.1)72 768 Q(2020 July 17)139.005 +E(1)203.165 E 0 Cg EP +%%Page: 2 2 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library) +-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E/F1 +10/Times-Bold@0 SF($)108 84 Q F0 .064(The last w)144 84 R 2.564 +(ord. This)-.1 F .064(is usually the last ar)2.564 F .064(gument, b)-.18 +F .064(ut will e)-.2 F .064(xpand to the zeroth w)-.15 F .063 +(ord if there is only)-.1 F(one w)144 96 Q(ord in the line.)-.1 E F1(%) +108 108 Q F0 1.419(The \214rst w)144 108 R 1.419 +(ord matched by the most recent `?)-.1 F/F2 10/Times-Italic@0 SF(string) +A F0 1.42(?' search, if the search string be)B 1.42(gins with a)-.15 F +(character that is part of a w)144 120 Q(ord.)-.1 E F2(x)108.77 132 Q F1 +A F2(y)A F0 2.5(Ar)144 132 S(ange of w)-2.5 E(ords; `\255)-.1 E F2 +(y)A F0 2.5('a)C(bbre)-2.5 E(viates `0\255)-.25 E F2(y)A F0('.)A F1(*) +108 144 Q F0 .316(All of the w)144 144 R .316(ords b)-.1 F .316 +(ut the zeroth.)-.2 F .315(This is a synon)5.315 F .315(ym for `)-.15 F +F2(1\255$)A F0 2.815('. It)B .315(is not an error to use)2.815 F F1(*) +2.815 E F0 .315(if there is)2.815 F(just one w)144 156 Q(ord in the e) +-.1 E -.15(ve)-.25 G(nt; the empty string is returned in that case.).15 +E F1(x*)108 168 Q F0(Abbre)144 168 Q(viates)-.25 E F2(x\255$)2.5 E F0(.) +A F1<78ad>108 180 Q F0(Abbre)144 180 Q(viates)-.25 E F2(x\255$)2.5 E F0 +(lik)2.5 E(e)-.1 E F1(x*)2.5 E F0 2.5(,b)C(ut omits the last w)-2.7 E +2.5(ord. If)-.1 F F1(x)2.5 E F0(is missing, it def)2.5 E(aults to 0.)-.1 +E(If a w)108 196.8 Q(ord designator is supplied without an e)-.1 E -.15 +(ve)-.25 G(nt speci\214cation, the pre).15 E +(vious command is used as the e)-.25 E -.15(ve)-.25 G(nt.).15 E F1 +(Modi\214ers)87 213.6 Q F0 .183(After the optional w)108 225.6 R .183 +(ord designator)-.1 F 2.683(,t)-.4 G .184 +(here may appear a sequence of one or more of the follo)-2.683 F .184 +(wing modi\214ers,)-.25 F(each preceded by a `:'.)108 237.6 Q +(These modify)5 E 2.5(,o)-.65 G 2.5(re)-2.5 G(dit, the w)-2.5 E +(ord or w)-.1 E(ords selected from the history e)-.1 E -.15(ve)-.25 G +(nt.).15 E F1(h)108 254.4 Q F0(Remo)144 254.4 Q .3 -.15(ve a t)-.15 H +(railing \214le name component, lea).15 E(ving only the head.)-.2 E F1 +(t)108 266.4 Q F0(Remo)144 266.4 Q .3 -.15(ve a)-.15 H +(ll leading \214le name components, lea).15 E(ving the tail.)-.2 E F1(r) +108 278.4 Q F0(Remo)144 278.4 Q .3 -.15(ve a t)-.15 H(railing suf).15 E +(\214x of the form)-.25 E F2(.xxx)2.5 E F0 2.5(,l)C(ea)-2.5 E +(ving the basename.)-.2 E F1(e)108 290.4 Q F0(Remo)144 290.4 Q .3 -.15 +(ve a)-.15 H(ll b).15 E(ut the trailing suf)-.2 E(\214x.)-.25 E F1(p)108 +302.4 Q F0(Print the ne)144 302.4 Q 2.5(wc)-.25 G(ommand b)-2.5 E +(ut do not e)-.2 E -.15(xe)-.15 G(cute it.).15 E F1(q)108 314.4 Q F0 +(Quote the substituted w)144 314.4 Q +(ords, escaping further substitutions.)-.1 E F1(x)108 326.4 Q F0 .386 +(Quote the substituted w)144 326.4 R .386(ords as with)-.1 F F1(q)2.886 +E F0 2.886(,b)C .386(ut break into w)-3.086 F .385(ords at)-.1 F F1 +(blanks)2.885 E F0 .385(and ne)2.885 F 2.885(wlines. The)-.25 F F1(q) +2.885 E F0(and)2.885 E F1(x)2.885 E F0(modi\214ers are mutually e)144 +338.4 Q(xclusi)-.15 E -.15(ve)-.25 G 2.5(;t).15 G +(he last one supplied is used.)-2.5 E F1(s/)108 350.4 Q F2(old)A F1(/)A +F2(ne)A(w)-.15 E F1(/)A F0(Substitute)144 362.4 Q F2(ne)3.328 E(w)-.15 E +F0 .469(for the \214rst occurrence of)3.278 F F2(old)3.199 E F0 .469 +(in the e)3.739 F -.15(ve)-.25 G .469(nt line.).15 F(An)5.469 E 2.969 +(yc)-.15 G .469(haracter may be used as the)-2.969 F .954 +(delimiter in place of /.)144 374.4 R .953 +(The \214nal delimiter is optional if it is the last character of the e) +5.953 F -.15(ve)-.25 G .953(nt line.).15 F .131 +(The delimiter may be quoted in)144 386.4 R F2(old)2.861 E F0(and)3.401 +E F2(ne)2.991 E(w)-.15 E F0 .131(with a single backslash.)2.941 F .131 +(If & appears in)5.131 F F2(ne)2.991 E(w)-.15 E F0 2.631(,i).31 G 2.631 +(ti)-2.631 G 2.631(sr)-2.631 G(e-)-2.631 E .62(placed by)144 398.4 R F2 +(old)3.349 E F0 5.619(.A).77 G .619(single backslash will quote the &.) +-2.5 F(If)5.619 E F2(old)3.349 E F0 .619(is null, it is set to the last) +3.889 F F2(old)3.349 E F0(substi-)3.889 E .486(tuted, or)144 410.4 R +2.986(,i)-.4 G 2.986(fn)-2.986 G 2.986(op)-2.986 G(re)-2.986 E .486 +(vious history substitutions took place, the last)-.25 F F2(string)3.326 +E F0 .487(in a)3.206 F F1(!?)2.987 E F2(string)A F1([?])A F0 2.987 +(search. If)5.487 F F2(ne)144.36 422.4 Q(w)-.15 E F0 +(is null, each matching)2.81 E F2(old)2.73 E F0(is deleted.)3.27 E F1(&) +108 434.4 Q F0(Repeat the pre)144 434.4 Q(vious substitution.)-.25 E F1 +(g)108 446.4 Q F0 .398(Cause changes to be applied o)144 446.4 R -.15 +(ve)-.15 G 2.898(rt).15 G .398(he entire e)-2.898 F -.15(ve)-.25 G .398 +(nt line.).15 F .397(This is used in conjunction with `)5.398 F F1(:s)A +F0 2.897('\()C(e.g.,)-2.897 E(`)144 458.4 Q F1(:gs/)A F2(old)A F1(/)A F2 +(ne)A(w)-.15 E F1(/)A F0 .35('\) or `)B F1(:&)A F0 2.85('. If)B .35 +(used with `)2.85 F F1(:s)A F0 .35(', an)B 2.85(yd)-.15 G .351 +(elimiter can be used in place of /, and the \214nal de-)-2.85 F +(limiter is optional if it is the last character of the e)144 470.4 Q +-.15(ve)-.25 G(nt line.).15 E(An)5 E F1(a)2.5 E F0 +(may be used as a synon)2.5 E(ym for)-.15 E F1(g)2.5 E F0(.)A F1(G)108 +482.4 Q F0(Apply the follo)144 482.4 Q(wing `)-.25 E F1(s)A F0 2.5('o)C +2.5(r`)-2.5 G F1(&)-2.5 E F0 2.5('m)C(odi\214er once to each w)-2.5 E +(ord in the e)-.1 E -.15(ve)-.25 G(nt line.).15 E/F3 10.95/Times-Bold@0 +SF(PR)72 499.2 Q(OGRAMMING WITH HIST)-.329 E(OR)-.197 E 2.738(YF)-.383 G +(UNCTIONS)-2.738 E F0(This section describes ho)108 511.2 Q 2.5(wt)-.25 +G 2.5(ou)-2.5 G(se the History library in other programs.)-2.5 E F1 +(Intr)87 528 Q(oduction to History)-.18 E F0 2.883(Ap)108 540 S .383 +(rogrammer using the History library has a)-2.883 F -.25(va)-.2 G .382 +(ilable functions for remembering lines on a history list, as-).25 F .77 +(sociating arbitrary data with a line, remo)108 552 R .771 +(ving lines from the list, searching through the list for a line con-) +-.15 F .303(taining an arbitrary te)108 564 R .303 +(xt string, and referencing an)-.15 F 2.803(yl)-.15 G .303 +(ine in the list directly)-2.803 F 5.303(.I)-.65 G 2.803(na)-5.303 G +.303(ddition, a history)-2.803 F F2 -.2(ex)2.802 G(pansion).2 E F0 +(function is a)108 576 Q -.25(va)-.2 G(ilable which pro).25 E +(vides for a consistent user interf)-.15 E(ace across dif)-.1 E +(ferent programs.)-.25 E .059(The user using programs written with the \ +History library has the bene\214t of a consistent user interf)108 592.8 +R .059(ace with a)-.1 F .918(set of well-kno)108 604.8 R .917 +(wn commands for manipulating the te)-.25 F .917(xt of pre)-.15 F .917 +(vious lines and using that te)-.25 F .917(xt in ne)-.15 F 3.417(wc)-.25 +G(om-)-3.417 E 4.183(mands. The)108 616.8 R 1.684(basic history manipul\ +ation commands are identical to the history substitution pro)4.183 F +1.684(vided by)-.15 F F1(bash)108 628.8 Q F0(.)A 1.154 +(The programmer can also use the readline library)108 645.6 R 3.654(,w) +-.65 G 1.153(hich includes some history manipulation by def)-3.654 F +(ault,)-.1 E(and has the added adv)108 657.6 Q +(antage of command line editing.)-.25 E .39(Before declaring an)108 +674.4 R 2.89(yf)-.15 G .39(unctions using an)-2.89 F 2.89(yf)-.15 G .39 +(unctionality the History library pro)-2.89 F .39 +(vides in other code, an appli-)-.15 F .067 +(cation writer should include the \214le)108 686.4 R F2()-.55 E F0 .067(in an)4.233 F 2.566<798c>-.15 +G .066(le that uses the History library')-2.566 F 2.566(sf)-.55 G +(eatures.)-2.566 E .538(It supplies e)108 698.4 R .538 +(xtern declarations for all of the library')-.15 F 3.038(sp)-.55 G .538 +(ublic functions and v)-3.038 F .539(ariables, and declares all of the) +-.25 F(public data structures.)108 710.4 Q(GNU History 8.1)72 768 Q +(2020 July 17)139.005 E(2)203.165 E 0 Cg EP +%%Page: 3 3 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library) +-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E/F1 +10/Times-Bold@0 SF(History Storage)87 84 Q F0 +(The history list is an array of history entries.)108 96 Q 2.5(Ah)5 G +(istory entry is declared as follo)-2.5 E(ws:)-.25 E/F2 10 +/Times-Italic@0 SF(typedef void *)108 112.8 Q F1(histdata_t;)2.5 E F0 +(typedef struct _hist_entry {)108 129.6 Q(char *line;)113 141.6 Q +(char *timestamp;)113 153.6 Q(histdata_t data;)113 165.6 Q 2.5(}H)108 +177.6 S(IST_ENTR)-2.5 E -.92(Y;)-.65 G +(The history list itself might therefore be declared as)108 194.4 Q F2 +(HIST_ENTR)108 211.2 Q 2.5(Y*)-.18 G(*)-2.5 E F1(the_history_list;)2.5 E +F0(The state of the History library is encapsulated into a single struc\ +ture:)108 228 Q(/*)108 244.8 Q 2.5(*As)110.5 256.8 S +(tructure used to pass around the current state of the history)-2.5 E(.) +-.65 E(*/)110.5 268.8 Q(typedef struct _hist_state {)108 280.8 Q +(HIST_ENTR)113 292.8 Q 2.5(Y*)-.65 G +(*entries; /* Pointer to the entries themselv)-2.5 E(es. */)-.15 E +(int of)113 304.8 Q 25(fset; /*)-.25 F +(The location pointer within this array)2.5 E 2.5(.*)-.65 G(/)-2.5 E +(int length;)113 316.8 Q(/* Number of elements within this array)27.5 E +2.5(.*)-.65 G(/)-2.5 E(int size;)113 328.8 Q +(/* Number of slots allocated to this array)32.5 E 2.5(.*)-.65 G(/)-2.5 +E(int \215ags;)113 340.8 Q 2.5(}H)108 352.8 S(IST)-2.5 E(OR)-.18 E(Y_ST) +-.65 E -1.11(AT)-.93 G(E;)1.11 E(If the \215ags member includes)108 +369.6 Q F1(HS_STIFLED)2.5 E F0 2.5(,t)C(he history has been sti\215ed.) +-2.5 E/F3 10.95/Times-Bold@0 SF(History Functions)72 386.4 Q F0 +(This section describes the calling sequence for the v)108 398.4 Q +(arious functions e)-.25 E(xported by the GNU History library)-.15 E(.) +-.65 E F1(Initializing History and State Management)87 415.2 Q F0 1.274 +(This section describes functions used to initialize and manage the sta\ +te of the History library when you)108 427.2 R -.1(wa)108 439.2 S +(nt to use the history functions in your program.).1 E F2(void)108 463.2 +Q F1(using_history)2.5 E F0(\()4.166 E F2(void)A F0(\))1.666 E(Be)108 +475.2 Q(gin a session in which the history functions might be used.)-.15 +E(This initializes the interacti)5 E .3 -.15(ve v)-.25 H(ariables.)-.1 E +F2(HIST)108 499.2 Q(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5(E*).37 G F1 +(history_get_history_state)A F0(\()4.166 E F2(void)A F0(\))1.666 E +(Return a structure describing the current state of the input history) +108 511.2 Q(.)-.65 E F2(void)108 535.2 Q F1(history_set_history_state) +2.5 E F0(\()4.166 E F2(HIST)A(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5 +(E*).37 G(state)-2.5 E F0(\))1.666 E +(Set the state of the history list according to)108 547.2 Q F2(state)2.5 +E F0(.)A F1(History List Management)87 576 Q F0 +(These functions manage indi)108 588 Q(vidual entries on the history li\ +st, or set parameters managing the list itself.)-.25 E F2(void)108 612 Q +F1(add_history)2.5 E F0(\()4.166 E F2(const c)A(har *string)-.15 E F0 +(\))1.666 E(Place)108 624 Q F2(string)3.279 E F0 .779 +(at the end of the history list.)3.279 F .779 +(The associated data \214eld \(if an)5.779 F .779(y\) is set to)-.15 F +F1(NULL)3.279 E F0 5.779(.I)C 3.279(ft)-5.779 G .78(he maxi-)-3.279 F +.787(mum number of history entries has been set using)108 636 R F1 +(sti\215e_history\(\))3.286 E F0 3.286(,a)C .786(nd the ne)-3.286 F +3.286(wn)-.25 G .786(umber of history entries)-3.286 F -.1(wo)108 648 S +(uld e).1 E(xceed that maximum, the oldest history entry is remo)-.15 E +-.15(ve)-.15 G(d.).15 E F2(void)108 672 Q F1(add_history_time)2.5 E F0 +(\()4.166 E F2(const c)A(har *string)-.15 E F0(\))1.666 E +(Change the time stamp associated with the most recent history entry to) +108 684 Q F2(string)2.5 E F0(.)A F2(HIST_ENTR)108 708 Q 2.5(Y*)-.18 G F1 +-.18(re)C(mo).18 E -.1(ve)-.1 G(_history).1 E F0(\()4.166 E F2(int whic) +A(h)-.15 E F0(\))1.666 E(Remo)108 720 Q .352 -.15(ve h)-.15 H .052 +(istory entry at of).15 F(fset)-.25 E F2(whic)2.553 E(h)-.15 E F0 .053 +(from the history)2.553 F 5.053(.T)-.65 G .053(he remo)-5.053 F -.15(ve) +-.15 G 2.553(de).15 G .053(lement is returned so you can free the)-2.553 +F(GNU History 8.1)72 768 Q(2020 July 17)139.005 E(3)203.165 E 0 Cg EP +%%Page: 4 4 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library) +-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E +(line, data, and containing structure.)108 84 Q/F1 10/Times-Italic@0 SF +(histdata_t)108 108 Q/F2 10/Times-Bold@0 SF(fr)2.5 E(ee_history_entry) +-.18 E F0(\()4.166 E F1(HIST_ENTR)A 2.5(Y*)-.18 G(histent)-2.5 E F0(\)) +1.666 E .934(Free the history entry)108 120 R F1(histent)3.433 E F0 .933 +(and an)3.433 F 3.433(yh)-.15 G .933(istory library pri)-3.433 F -.25 +(va)-.25 G .933(te data associated with it.).25 F .933 +(Returns the applica-)5.933 F +(tion-speci\214c data so the caller can dispose of it.)108 132 Q F1 +(HIST_ENTR)108 156 Q 2.5(Y*)-.18 G F2 -.18(re)C(place_history_entry).18 +E F0(\()4.166 E F1(int whic)A -.834(h, const)-.15 F -.15(ch)2.5 G +(ar *line).15 E 1.666(,h)-.1 G(istdata_t data)-1.666 E F0(\))3.332 E +(Mak)108 168 Q 3.062(et)-.1 G .562(he history entry at of)-3.062 F(fset) +-.25 E F1(whic)3.062 E(h)-.15 E F0(ha)3.062 E -.15(ve)-.2 G F1(line) +3.212 E F0(and)3.062 E F1(data)3.062 E F0 5.563(.T)C .563 +(his returns the old entry so the caller can dis-)-5.563 F(pose of an) +108 180 Q 2.5(ya)-.15 G(pplication-speci\214c data.)-2.5 E +(In the case of an in)5 E -.25(va)-.4 G(lid).25 E F1(whic)2.5 E(h)-.15 E +F0 2.5(,a)C F2(NULL)A F0(pointer is returned.)2.5 E F1(void)108 204 Q F2 +(clear_history)2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E +(Clear the history list by deleting all the entries.)108 216 Q F1(void) +108 240 Q F2(sti\215e_history)2.5 E F0(\()4.166 E F1(int max)A F0(\)) +1.666 E .38(Sti\215e the history list, remembering only the last)108 252 +R F1(max)2.88 E F0 2.88(entries. The)2.88 F .38 +(history list will contain only)2.88 F F1(max)2.88 E F0(entries)2.88 E +(at a time.)108 264 Q F1(int)108 288 Q F2(unsti\215e_history)2.5 E F0 +(\()4.166 E F1(void)A F0(\))1.666 E .46(Stop sti\215ing the history)108 +300 R 5.46(.T)-.65 G .46(his returns the pre)-5.46 F .46 +(viously-set maximum number of history entries \(as set by)-.25 F F2 +(sti-)2.96 E(\215e_history\(\))108 312 Q F0 2.5(\). history)B -.1(wa)2.5 +G 2.5(ss).1 G 2.5(ti\215ed. The)-2.5 F -.25(va)2.5 G(lue is positi).25 E +.3 -.15(ve i)-.25 H 2.5(ft).15 G(he history w)-2.5 E(as sti\215ed, ne) +-.1 E -.05(ga)-.15 G(ti).05 E .3 -.15(ve i)-.25 H 2.5(fi).15 G 2.5(tw) +-2.5 G(asn')-2.6 E(t.)-.18 E F1(int)108 336 Q F2(history_is_sti\215ed) +2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E +(Returns non-zero if the history is sti\215ed, zero if it is not.)108 +348 Q F2(Inf)87 376.8 Q(ormation About the History List)-.25 E F0(These\ + functions return information about the entire history list or indi)108 +388.8 Q(vidual list entries.)-.25 E F1(HIST_ENTR)108 412.8 Q 2.5(Y*)-.18 +G(*)-2.5 E F2(history_list)2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E +.708(Return a)108 424.8 R F2(NULL)3.208 E F0 .708(terminated array of) +3.208 F F1(HIST_ENTR)3.208 E 3.208(Y*)-.18 G F0 .708 +(which is the current input history)B 5.707(.E)-.65 G .707 +(lement 0 of this)-5.707 F(list is the be)108 436.8 Q(ginning of time.) +-.15 E(If there is no history)5 E 2.5(,r)-.65 G(eturn)-2.5 E F2(NULL)2.5 +E F0(.)A F1(int)108 460.8 Q F2(wher)2.5 E(e_history)-.18 E F0(\()4.166 E +F1(void)A F0(\))1.666 E(Returns the of)108 472.8 Q +(fset of the current history element.)-.25 E F1(HIST_ENTR)108 496.8 Q +2.5(Y*)-.18 G F2(curr)A(ent_history)-.18 E F0(\()4.166 E F1(void)A F0 +(\))1.666 E 1.373 +(Return the history entry at the current position, as determined by)108 +508.8 R F2(wher)3.873 E(e_history\(\))-.18 E F0 6.373(.I)C 3.873(ft) +-6.373 G 1.374(here is no entry)-3.873 F(there, return a)108 520.8 Q F2 +(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F1(HIST_ENTR)108 544.8 Q 2.5(Y*) +-.18 G F2(history_get)A F0(\()4.166 E F1(int of)A(fset)-.18 E F0(\)) +1.666 E 1.069(Return the history entry at position)108 556.8 R F1(of) +3.569 E(fset)-.18 E F0 6.069(.T)C 1.069(he range of v)-6.069 F 1.069 +(alid v)-.25 F 1.069(alues of)-.25 F F1(of)3.569 E(fset)-.18 E F0 1.068 +(starts at)3.569 F F2(history_base)3.568 E F0(and)3.568 E .286(ends at) +108 568.8 R F2(history_length)2.786 E F0 2.7862.786 G 5.286(.I) +-2.786 G 2.786(ft)-5.286 G .286(here is no entry there, or if)-2.786 F +F1(of)2.786 E(fset)-.18 E F0 .286(is outside the v)2.786 F .287 +(alid range, return a)-.25 F F2(NULL)2.787 E F0(pointer)108 580.8 Q(.) +-.55 E F1(time_t)108 604.8 Q F2(history_get_time)2.5 E F0(\()4.166 E F1 +(HIST_ENTR)A 2.5(Y*)-.18 G F0(\))-.834 E(Return the time stamp associat\ +ed with the history entry passed as the ar)108 616.8 Q(gument.)-.18 E F1 +(int)108 640.8 Q F2(history_total_bytes)2.5 E F0(\()4.166 E F1(void)A F0 +(\))1.666 E .392 +(Return the number of bytes that the primary history entries are using.) +108 652.8 R .391(This function returns the sum of the)5.392 F +(lengths of all the lines in the history)108 664.8 Q(.)-.65 E F2(Mo)87 +693.6 Q(ving Ar)-.1 E(ound the History List)-.18 E F0 +(These functions allo)108 705.6 Q 2.5(wt)-.25 G(he current inde)-2.5 E +2.5(xi)-.15 G(nto the history list to be set or changed.)-2.5 E F1(int) +108 729.6 Q F2(history_set_pos)2.5 E F0(\()4.166 E F1(int pos)A F0(\)) +1.666 E(GNU History 8.1)72 768 Q(2020 July 17)139.005 E(4)203.165 E 0 Cg +EP +%%Page: 5 5 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library) +-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E .79 +(Set the current history of)108 84 R .79(fset to)-.25 F/F1 10 +/Times-Italic@0 SF(pos)3.29 E F0 3.29(,a)C 3.29(na)-3.29 G .79 +(bsolute inde)-3.29 F 3.29(xi)-.15 G .79(nto the list.)-3.29 F .79 +(Returns 1 on success, 0 if)5.79 F F1(pos)3.29 E F0 .79(is less)3.29 F +(than zero or greater than the number of history entries.)108 96 Q F1 +(HIST_ENTR)108 120 Q 2.5(Y*)-.18 G/F2 10/Times-Bold@0 SF(pr)A -.15(ev) +-.18 G(ious_history).15 E F0(\()4.166 E F1(void)A F0(\))1.666 E .208 +(Back up the current history of)108 132 R .208(fset to the pre)-.25 F +.208(vious history entry)-.25 F 2.707(,a)-.65 G .207 +(nd return a pointer to that entry)-2.707 F 5.207(.I)-.65 G 2.707(ft) +-5.207 G .207(here is)-2.707 F(no pre)108 144 Q(vious entry)-.25 E 2.5 +(,r)-.65 G(eturn a)-2.5 E F2(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F1 +(HIST_ENTR)108 168 Q 2.5(Y*)-.18 G F2(next_history)A F0(\()4.166 E F1 +(void)A F0(\))1.666 E .332(If the current history of)108 180 R .333 +(fset refers to a v)-.25 F .333(alid history entry)-.25 F 2.833(,i)-.65 +G .333(ncrement the current history of)-2.833 F 2.833(fset. If)-.25 F +.333(the possi-)2.833 F .202(bly-incremented history of)108 192 R .202 +(fset refers to a v)-.25 F .202(alid history entry)-.25 F 2.702(,r)-.65 +G .202(eturn a pointer to that entry; otherwise, return)-2.702 F(a)108 +204 Q F2(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F2(Sear)87 232.8 Q +(ching the History List)-.18 E F0 .005(These functions allo)108 244.8 R +2.505(ws)-.25 G .006(earching of the history list for entries containin\ +g a speci\214c string.)-2.505 F .006(Searching may be)5.006 F 1.452 +(performed both forw)108 256.8 R 1.452(ard and backw)-.1 F 1.451 +(ard from the current history position.)-.1 F 1.451(The search may be) +6.451 F F1(anc)3.951 E(hor)-.15 E(ed)-.37 E F0(,)A +(meaning that the string must match at the be)108 268.8 Q +(ginning of the history entry)-.15 E(.)-.65 E F1(int)108 292.8 Q F2 +(history_sear)2.5 E(ch)-.18 E F0(\()4.166 E F1(const c)A(har *string) +-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection)-.37 E F0(\))1.666 E .155 +(Search the history for)108 304.8 R F1(string)2.655 E F0 2.656(,s)C .156 +(tarting at the current history of)-2.656 F 2.656(fset. If)-.25 F F1 +(dir)2.656 E(ection)-.37 E F0 .156(is less than 0, then the search)2.656 +F .802(is through pre)108 316.8 R .802 +(vious entries, otherwise through subsequent entries.)-.25 F(If)5.801 E +F1(string)3.301 E F0 .801(is found, then the current his-)3.301 F .064 +(tory inde)108 328.8 R 2.564(xi)-.15 G 2.564(ss)-2.564 G .064 +(et to that history entry)-2.564 F 2.564(,a)-.65 G .064(nd the v)-2.564 +F .064(alue returned is the of)-.25 F .064 +(fset in the line of the entry where)-.25 F F1(string)2.565 E F0 -.1(wa) +108 340.8 S 2.5(sf).1 G 2.5(ound. Otherwise,)-2.5 F +(nothing is changed, and a -1 is returned.)2.5 E F1(int)108 364.8 Q F2 +(history_sear)2.5 E(ch_pr)-.18 E(e\214x)-.18 E F0(\()4.166 E F1(const c) +A(har *string)-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection)-.37 E F0(\)) +1.666 E .684(Search the history for)108 376.8 R F1(string)3.183 E F0 +3.183(,s)C .683(tarting at the current history of)-3.183 F 3.183 +(fset. The)-.25 F .683(search is anchored: matching lines)3.183 F 1.063 +(must be)108 388.8 R 1.063(gin with)-.15 F F1(string)3.563 E F0 6.063 +(.I)C(f)-6.063 E F1(dir)3.563 E(ection)-.37 E F0 1.064 +(is less than 0, then the search is through pre)3.563 F 1.064 +(vious entries, otherwise)-.25 F .34(through subsequent entries.)108 +400.8 R(If)5.34 E F1(string)2.84 E F0 .34 +(is found, then the current history inde)2.84 F 2.84(xi)-.15 G 2.84(ss) +-2.84 G .34(et to that entry)-2.84 F 2.84(,a)-.65 G .34(nd the re-)-2.84 +F(turn v)108 412.8 Q(alue is 0.)-.25 E +(Otherwise, nothing is changed, and a -1 is returned.)5 E F1(int)108 +436.8 Q F2(history_sear)2.5 E(ch_pos)-.18 E F0(\()4.166 E F1(const c)A +(har *string)-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E -.834(ection, int) +-.37 F(pos)2.5 E F0(\))3.332 E .603(Search for)108 448.8 R F1(string) +3.103 E F0 .603(in the history list, starting at)3.103 F F1(pos)3.104 E +F0 3.104(,a)C 3.104(na)-3.104 G .604(bsolute inde)-3.104 F 3.104(xi)-.15 +G .604(nto the list.)-3.104 F(If)5.604 E F1(dir)3.104 E(ection)-.37 E F0 +.604(is ne)3.104 F -.05(ga)-.15 G(ti).05 E -.15(ve)-.25 G(,).15 E .608 +(the search proceeds backw)108 460.8 R .608(ard from)-.1 F F1(pos)3.108 +E F0 3.108(,o)C .608(therwise forw)-3.108 F 3.108(ard. Returns)-.1 F +.608(the absolute inde)3.108 F 3.108(xo)-.15 G 3.108(ft)-3.108 G .608 +(he history ele-)-3.108 F(ment where)108 472.8 Q F1(string)2.5 E F0 -.1 +(wa)2.5 G 2.5(sf).1 G(ound, or -1 otherwise.)-2.5 E F2 +(Managing the History File)87 501.6 Q F0 .035(The History library can r\ +ead the history from and write it to a \214le.)108 513.6 R .036 +(This section documents the functions for)5.035 F +(managing a history \214le.)108 525.6 Q F1(int)108 549.6 Q F2 -.18(re) +2.5 G(ad_history).18 E F0(\()4.166 E F1(const c)A(har *\214lename)-.15 E +F0(\))1.666 E .151(Add the contents of)108 561.6 R F1(\214lename)2.651 E +F0 .151(to the history list, a line at a time.)2.651 F(If)5.15 E F1 +(\214lename)2.65 E F0(is)2.65 E F2(NULL)2.65 E F0 2.65(,t)C .15 +(hen read from)-2.65 F F1(~/.his-)2.65 E(tory)108 573.6 Q F0 5(.R)C +(eturns 0 if successful, or)-5 E F2(err)2.5 E(no)-.15 E F0(if not.)2.5 E +F1(int)108 597.6 Q F2 -.18(re)2.5 G(ad_history_range).18 E F0(\()4.166 E +F1(const c)A(har *\214lename)-.15 E 1.666(,i)-.1 G(nt fr)-1.666 E -.834 +(om, int)-.45 F(to)2.5 E F0(\))3.332 E .052(Read a range of lines from) +108 609.6 R F1(\214lename)2.553 E F0 2.553(,a)C .053 +(dding them to the history list.)-2.553 F .053(Start reading at line) +5.053 F F1(fr)2.553 E(om)-.45 E F0 .053(and end at)2.553 F F1(to)2.553 E +F0(.)A(If)108 621.6 Q F1(fr)2.889 E(om)-.45 E F0 .389 +(is zero, start at the be)2.889 F 2.889(ginning. If)-.15 F F1(to)2.889 E +F0 .389(is less than)2.889 F F1(fr)2.889 E(om)-.45 E F0 2.889(,t)C .388 +(hen read until the end of the \214le.)-2.889 F(If)5.388 E F1 +(\214lename)2.888 E F0(is)108 633.6 Q F2(NULL)2.5 E F0 2.5(,t)C +(hen read from)-2.5 E F1(~/.history)2.5 E F0 5(.R)C +(eturns 0 if successful, or)-5 E F2(err)2.5 E(no)-.15 E F0(if not.)2.5 E +F1(int)108 657.6 Q F2(write_history)2.5 E F0(\()4.166 E F1(const c)A +(har *\214lename)-.15 E F0(\))1.666 E .961(Write the current history to) +108 669.6 R F1(\214lename)3.461 E F0 3.461(,o)C -.15(ve)-3.611 G +(rwriting).15 E F1(\214lename)3.461 E F0 .961(if necessary)3.461 F 5.961 +(.I)-.65 G(f)-5.961 E F1(\214lename)3.462 E F0(is)3.462 E F2(NULL)3.462 +E F0 3.462(,t)C .962(hen write)-3.462 F(the history list to)108 681.6 Q +F1(~/.history)2.5 E F0 5(.R)C(eturns 0 on success, or)-5 E F2(err)2.5 E +(no)-.15 E F0(on a read or write error)2.5 E(.)-.55 E F1(int)108 717.6 Q +F2(append_history)2.5 E F0(\()4.166 E F1(int nelements,)A(const c)1.666 +E(har *\214lename)-.15 E F0(\))1.666 E .839(Append the last)108 729.6 R +F1(nelements)3.339 E F0 .839(of the history list to)3.339 F F1 +(\214lename)3.339 E F0 5.839(.I)C(f)-5.839 E F1(\214lename)3.339 E F0 +(is)3.339 E F2(NULL)3.339 E F0 3.339(,t)C .838(hen append to)-3.339 F F1 +(~/.history)3.338 E F0(.)A(GNU History 8.1)72 768 Q(2020 July 17)139.005 +E(5)203.165 E 0 Cg EP +%%Page: 6 6 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library) +-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E +(Returns 0 on success, or)108 84 Q/F1 10/Times-Bold@0 SF(err)2.5 E(no) +-.15 E F0(on a read or write error)2.5 E(.)-.55 E/F2 10/Times-Italic@0 +SF(int)108 108 Q F1(history_truncate_\214le)2.5 E F0(\()4.166 E F2 +(const c)A(har *\214lename)-.15 E 1.666(,i)-.1 G(nt nlines)-1.666 E F0 +(\))1.666 E -.35(Tr)108 120 S .38(uncate the history \214le).35 F F2 +(\214lename)2.88 E F0 2.88(,l)C(ea)-2.88 E .38(ving only the last)-.2 F +F2(nlines)2.881 E F0 2.881(lines. If)2.881 F F2(\214lename)2.881 E F0 +(is)2.881 E F1(NULL)2.881 E F0 2.881(,t)C(hen)-2.881 E F2(~/.history) +2.881 E F0(is)2.881 E 2.5(truncated. Returns)108 132 R 2.5(0o)2.5 G 2.5 +(ns)-2.5 G(uccess, or)-2.5 E F1(err)2.5 E(no)-.15 E F0(on f)2.5 E +(ailure.)-.1 E F1(History Expansion)87 160.8 Q F0 +(These functions implement history e)108 172.8 Q(xpansion.)-.15 E F2 +(int)108 196.8 Q F1(history_expand)2.5 E F0(\()4.166 E F2 -.15(ch)C +(ar *string).15 E 1.666(,c)-.1 G(har **output)-1.816 E F0(\))1.666 E +(Expand)108 208.8 Q F2(string)2.5 E F0 2.5(,p)C(lacing the result into) +-2.5 E F2(output)2.5 E F0 2.5(,ap)C(ointer to a string.)-2.5 E(Returns:) +5 E(0)144 220.8 Q .566(If no e)180 220.8 R .566 +(xpansions took place \(or)-.15 F 3.065(,i)-.4 G 3.065(ft)-3.065 G .565 +(he only change in the te)-3.065 F .565(xt w)-.15 F .565(as the remo)-.1 +F -.25(va)-.15 G 3.065(lo).25 G 3.065(fe)-3.065 G(scape)-3.065 E +(characters preceding the history e)180 232.8 Q(xpansion character\);) +-.15 E(1)144 244.8 Q(if e)180 244.8 Q(xpansions did tak)-.15 E 2.5(ep) +-.1 G(lace;)-2.5 E(-1)144 256.8 Q(if there w)180 256.8 Q +(as an error in e)-.1 E(xpansion;)-.15 E(2)144 268.8 Q +(if the returned line should be displayed, b)180 268.8 Q(ut not e)-.2 E +-.15(xe)-.15 G(cuted, as with the).15 E F1(:p)2.5 E F0(modi\214er)2.5 E +(.)-.55 E(If an error occurred in e)108 280.8 Q(xpansion, then)-.15 E F2 +(output)2.5 E F0(contains a descripti)2.5 E .3 -.15(ve e)-.25 H +(rror message.).15 E F2 -.15(ch)108 304.8 S(ar *).15 E F1(get_history_e) +2.5 E -.1(ve)-.15 G(nt).1 E F0(\()4.166 E F2(const c)A(har *string)-.15 +E 1.666(,i)-.1 G(nt *cinde)-1.666 E -.834(x, int)-.2 F(qc)2.5 E(har)-.15 +E F0(\))3.332 E .262(Returns the te)108 316.8 R .262 +(xt of the history e)-.15 F -.15(ve)-.25 G .262(nt be).15 F .263 +(ginning at)-.15 F F2(string)2.763 E F0(+)2.763 E F2(*cinde)2.763 E(x) +-.2 E F0(.)A F2(*cinde)5.263 E(x)-.2 E F0 .263 +(is modi\214ed to point to after the)2.763 F -2.15 -.25(ev e)108 328.8 T +.71(nt speci\214er).25 F 5.71(.A)-.55 G 3.21(tf)-5.71 G .71 +(unction entry)-3.21 F(,)-.65 E F2(cinde)3.21 E(x)-.2 E F0 .709 +(points to the inde)3.21 F 3.209(xi)-.15 G(nto)-3.209 E F2(string)3.209 +E F0 .709(where the history e)3.209 F -.15(ve)-.25 G .709 +(nt speci\214ca-).15 F .527(tion be)108 340.8 R(gins.)-.15 E F2(qc)5.527 +E(har)-.15 E F0 .527(is a character that is allo)3.027 F .527 +(wed to end the e)-.25 F -.15(ve)-.25 G .528 +(nt speci\214cation in addition to the `).15 F(`normal')-.74 E(')-.74 E +(terminating characters.)108 352.8 Q F2 -.15(ch)108 376.8 S(ar **).15 E +F1(history_tok)2.5 E(enize)-.1 E F0(\()4.166 E F2(const c)A(har *string) +-.15 E F0(\))1.666 E .239(Return an array of tok)108 388.8 R .239 +(ens parsed out of)-.1 F F2(string)2.739 E F0 2.739(,m)C .238 +(uch as the shell might.)-2.739 F .238(The tok)5.238 F .238 +(ens are split on the charac-)-.1 F(ters in the)108 400.8 Q F1 +(history_w)2.5 E(ord_delimiters)-.1 E F0 -.25(va)2.5 G +(riable, and shell quoting con).25 E -.15(ve)-.4 G(ntions are obe).15 E +(yed.)-.15 E F2 -.15(ch)108 424.8 S(ar *).15 E F1(history_ar)2.5 E +(g_extract)-.1 E F0(\()4.166 E F2(int \214r)A -.834(st, int)-.1 F -.834 +(last, const)2.5 F -.15(ch)2.5 G(ar *string).15 E F0(\))3.332 E .025 +(Extract a string se)108 436.8 R .025(gment consisting of the)-.15 F F2 +<8c72>2.526 E(st)-.1 E F0(through)2.526 E F2(last)2.526 E F0(ar)2.526 E +.026(guments present in)-.18 F F2(string)2.526 E F0 5.026(.A)C -.18(rg) +-5.026 G .026(uments are split).18 F(using)108 448.8 Q F1(history_tok) +2.5 E(enize\(\))-.1 E F0(.)A F1(History V)87 477.6 Q(ariables)-.92 E F0 +(This section describes the e)108 489.6 Q(xternally-visible v)-.15 E +(ariables e)-.25 E(xported by the GNU History Library)-.15 E(.)-.65 E F2 +(int)108 513.6 Q F1(history_base)2.5 E F0(The logical of)108 525.6 Q +(fset of the \214rst entry in the history list.)-.25 E F2(int)108 549.6 +Q F1(history_length)2.5 E F0 +(The number of entries currently stored in the history list.)108 561.6 Q +F2(int)108 585.6 Q F1(history_max_entries)2.5 E F0 +(The maximum number of history entries.)108 597.6 Q +(This must be changed using)5 E F1(sti\215e_history\(\))2.5 E F0(.)A F2 +(int)108 621.6 Q F1(history_write_timestamps)2.5 E F0 .484 +(If non-zero, timestamps are written to the history \214le, so the)108 +633.6 R 2.983(yc)-.15 G .483(an be preserv)-2.983 F .483 +(ed between sessions.)-.15 F .483(The de-)5.483 F -.1(fa)108 645.6 S +.994(ult v).1 F .994(alue is 0, meaning that timestamps are not sa)-.25 +F -.15(ve)-.2 G 3.494(d. The).15 F .994 +(current timestamp format uses the v)3.494 F .995(alue of)-.25 F F2 +(history_comment_c)108 657.6 Q(har)-.15 E F0 .051 +(to delimit timestamp entries in the history \214le.)2.552 F .051 +(If that v)5.051 F .051(ariable does not ha)-.25 F .351 -.15(ve a v)-.2 +H(alue)-.1 E(\(the def)108 669.6 Q +(ault\), timestamps will not be written.)-.1 E F2 -.15(ch)108 693.6 S +(ar).15 E F1(history_expansion_char)2.5 E F0 +(The character that introduces a history e)108 705.6 Q -.15(ve)-.25 G +2.5(nt. The).15 F(def)2.5 E(ault is)-.1 E F1(!)2.5 E F0 5(.S)C +(etting this to 0 inhibits history e)-5 E(xpansion.)-.15 E F2 -.15(ch) +108 729.6 S(ar).15 E F1(history_subst_char)2.5 E F0(GNU History 8.1)72 +768 Q(2020 July 17)139.005 E(6)203.165 E 0 Cg EP +%%Page: 7 7 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library) +-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E +(The character that in)108 84 Q -.2(vo)-.4 G -.1(ke).2 G 2.5(sw).1 G +(ord substitution if found at the start of a line.)-2.6 E(The def)5 E +(ault is)-.1 E/F1 10/Times-Bold@0 SF(^)2.5 E F0(.)A/F2 10/Times-Italic@0 +SF -.15(ch)108 108 S(ar).15 E F1(history_comment_char)2.5 E F0 .116 +(During tok)108 120 R .117 +(enization, if this character is seen as the \214rst character of a w) +-.1 F .117(ord, then it and all subsequent char)-.1 F(-)-.2 E .277 +(acters up to a ne)108 132 R .276 +(wline are ignored, suppressing history e)-.25 F .276 +(xpansion for the remainder of the line.)-.15 F .276(This is dis-)5.276 +F(abled by def)108 144 Q(ault.)-.1 E F2 -.15(ch)108 168 S(ar *).15 E F1 +(history_w)2.5 E(ord_delimiters)-.1 E F0 +(The characters that separate tok)108 180 Q(ens for)-.1 E F1 +(history_tok)2.5 E(enize\(\))-.1 E F0 5(.T)C(he def)-5 E(ault v)-.1 E +(alue is)-.25 E F1 2.5("\\)2.5 G(t\\n\(\)<>;&|")-2.5 E F0(.)A F2 -.15 +(ch)108 204 S(ar *).15 E F1(history_no_expand_chars)2.5 E F0 2.054 +(The list of characters which inhibit history e)108 216 R 2.054 +(xpansion if found immediately follo)-.15 F(wing)-.25 E F1 +(history_expan-)4.555 E(sion_char)108 228 Q F0 5(.T)C(he def)-5 E +(ault is space, tab, ne)-.1 E(wline,)-.25 E F1(\\r)2.5 E F0 2.5(,a)C(nd) +-2.5 E F1(=)2.5 E F0(.)A F2 -.15(ch)108 252 S(ar *).15 E F1 +(history_sear)2.5 E(ch_delimiter_chars)-.18 E F0 .401(The list of addit\ +ional characters which can delimit a history search string, in addition\ + to space, tab,)108 264 R F2(:)2.901 E F0(and)2.901 E F2(?)2.901 E F0 +(in the case of a substring search.)108 276 Q(The def)5 E(ault is empty) +-.1 E(.)-.65 E F2(int)108 300 Q F1(history_quotes_inhibit_expansion)2.5 +E F0 .86(If non-zero, double-quoted w)108 312 R .861 +(ords are not scanned for the history e)-.1 F .861 +(xpansion character or the history com-)-.15 F(ment character)108 324 Q +5(.T)-.55 G(he def)-5 E(ault v)-.1 E(alue is 0.)-.25 E F2(rl_lineb)108 +348 Q(uf_func_t *)-.2 E F1(history_inhibit_expansion_function)2.5 E F0 +.348(This should be set to the address of a function that tak)108 360 R +.348(es tw)-.1 F 2.848(oa)-.1 G -.18(rg)-2.848 G .347(uments: a).18 F F1 +.347(char *)2.847 F F0(\()2.847 E F2(string)A F0 2.847(\)a)C .347(nd an) +-2.847 F F1(int)2.847 E F0(inde)2.847 E(x)-.15 E .227 +(into that string \()108 372 R F2(i)A F0 2.727(\). It)B .227 +(should return a non-zero v)2.727 F .227(alue if the history e)-.25 F +.227(xpansion starting at)-.15 F F2(string[i])2.728 E F0 .228 +(should not)2.728 F .019(be performed; zero if the e)108 384 R .019 +(xpansion should be done.)-.15 F .019 +(It is intended for use by applications lik)5.019 F(e)-.1 E F1(bash) +2.519 E F0 .018(that use)2.519 F(the history e)108 396 Q +(xpansion character for additional purposes.)-.15 E(By def)5 E +(ault, this v)-.1 E(ariable is set to)-.25 E F1(NULL)2.5 E F0(.)A/F3 +10.95/Times-Bold@0 SF(FILES)72 412.8 Q F2(~/.history)109.666 424.8 Q F0 +(Def)144 436.8 Q(ault \214lename for reading and writing sa)-.1 E -.15 +(ve)-.2 G 2.5(dh).15 G(istory)-2.5 E F3(SEE ALSO)72 453.6 Q F2 +(The Gnu Readline Libr)108 465.6 Q(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E +(ox and Chet Rame)-.15 E(y)-.15 E F2(The Gnu History Libr)108 477.6 Q +(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E(ox and Chet Rame)-.15 E(y)-.15 E +F2(bash)108 489.6 Q F0(\(1\))A F2 -.37(re)108 501.6 S(adline).37 E F0 +(\(3\))A F3 -.548(AU)72 518.4 S(THORS).548 E F0(Brian F)108 530.4 Q +(ox, Free Softw)-.15 E(are F)-.1 E(oundation)-.15 E(bfox@gnu.or)108 +542.4 Q(g)-.18 E(Chet Rame)108 559.2 Q 1.3 -.65(y, C)-.15 H(ase W).65 E +(estern Reserv)-.8 E 2.5(eU)-.15 G(ni)-2.5 E -.15(ve)-.25 G(rsity).15 E +(chet.rame)108 571.2 Q(y@case.edu)-.15 E F3 -.11(BU)72 588 S 2.738(GR) +.11 G(EPOR)-2.738 E(TS)-.438 E F0 .16(If you \214nd a b)108 600 R .16 +(ug in the)-.2 F F1(history)2.66 E F0(library)2.66 E 2.66(,y)-.65 G .16 +(ou should report it.)-2.66 F .16(But \214rst, you should mak)5.16 F +2.66(es)-.1 G .16(ure that it really is)-2.66 F 2.5(ab)108 612 S +(ug, and that it appears in the latest v)-2.7 E(ersion of the)-.15 E F1 +(history)2.5 E F0(library that you ha)2.5 E -.15(ve)-.2 G(.).15 E .705 +(Once you ha)108 628.8 R 1.005 -.15(ve d)-.2 H .705(etermined that a b) +.15 F .704(ug actually e)-.2 F .704(xists, mail a b)-.15 F .704 +(ug report to)-.2 F F2 -.2(bu)3.204 G(g\255r).2 E(eadline)-.37 E F0(@)A +F2(gnu.or)A(g)-.37 E F0 5.704(.I)C 3.204(fy)-5.704 G(ou)-3.204 E(ha)108 +640.8 Q 1.809 -.15(ve a \214)-.2 H 1.509 +(x, you are welcome to mail that as well!).15 F 1.51 +(Suggestions and `philosophical' b)6.51 F 1.51(ug reports may be)-.2 F +(mailed to)108 652.8 Q F2 -.2(bu)2.5 G(g-r).2 E(eadline)-.37 E F0(@)A F2 +(gnu.or)A(g)-.37 E F0(or posted to the Usenet ne)2.5 E(wsgroup)-.25 E F1 +(gnu.bash.b)2.5 E(ug)-.2 E F0(.)A(Comments and b)108 669.6 Q +(ug reports concerning this manual page should be directed to)-.2 E F2 +-.15(ch)2.5 G(et.r).15 E(ame)-.15 E(y@case)-.3 E(.edu)-.15 E F0(.).25 E +(GNU History 8.1)72 768 Q(2020 July 17)139.005 E(7)203.165 E 0 Cg EP +%%Trailer +end +%%EOF diff --git a/doc/hstech.texi b/doc/hstech.texi new file mode 100644 index 0000000..da6417b --- /dev/null +++ b/doc/hstech.texi @@ -0,0 +1,602 @@ +@ignore +This file documents the user interface to the GNU History library. + +Copyright (C) 1988-2022 Free Software Foundation, Inc. +Authored by Brian Fox and Chet Ramey. + +Permission is granted to make and distribute verbatim copies of this manual +provided the copyright notice and this permission notice are preserved on +all copies. + +Permission is granted to process this file through Tex and print the +results, provided the printed document carries copying permission notice +identical to this one except for the removal of this paragraph (this +paragraph not being relevant to the printed manual). + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +GNU Copyright statement is available to the distributee, and provided that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end ignore + +@node Programming with GNU History +@chapter Programming with GNU History + +This chapter describes how to interface programs that you write +with the @sc{gnu} History Library. +It should be considered a technical guide. +For information on the interactive use of @sc{gnu} History, @pxref{Using +History Interactively}. + +@menu +* Introduction to History:: What is the GNU History library for? +* History Storage:: How information is stored. +* History Functions:: Functions that you can use. +* History Variables:: Variables that control behaviour. +* History Programming Example:: Example of using the GNU History Library. +@end menu + +@node Introduction to History +@section Introduction to History + +Many programs read input from the user a line at a time. The @sc{gnu} +History library is able to keep track of those lines, associate arbitrary +data with each line, and utilize information from previous lines in +composing new ones. + +A 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}. + +The programmer can also 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{} in any file that uses the +History library's features. It supplies extern declarations for all +of the library's public functions and variables, and declares all of +the public data structures. + +@node History Storage +@section History Storage + +The history list is an array of history entries. A history entry is +declared as follows: + +@example +typedef void *histdata_t; + +typedef struct _hist_entry @{ + char *line; + char *timestamp; + histdata_t data; +@} HIST_ENTRY; +@end example + +The history list itself might therefore be declared as + +@example +HIST_ENTRY **the_history_list; +@end example + +The state of the History library is encapsulated into a single structure: + +@example +/* + * A structure used to pass around the current state of the history. + */ +typedef struct _hist_state @{ + HIST_ENTRY **entries; /* Pointer to the entries themselves. */ + int offset; /* The location pointer within this array. */ + int length; /* Number of elements within this array. */ + int size; /* Number of slots allocated to this array. */ + int flags; +@} HISTORY_STATE; +@end example + +If the flags member includes @code{HS_STIFLED}, the history has been +stifled. + +@node History Functions +@section History Functions + +This section describes the calling sequence for the various functions +exported by the @sc{gnu} History library. + +@menu +* Initializing History and State Management:: Functions to call when you + want to use history in a + program. +* History List Management:: Functions used to manage the list + of history entries. +* Information About the History List:: Functions returning information about + the history list. +* Moving Around the History List:: Functions used to change the position + in the history list. +* Searching the History List:: Functions to search the history list + for entries containing a string. +* Managing the History File:: Functions that read and write a file + containing the history list. +* History Expansion:: Functions to perform csh-like history + expansion. +@end menu + +@node Initializing History and State Management +@subsection Initializing History and State Management + +This section describes functions used to initialize and manage +the state of the History library when you want to use the history +functions in your program. + +@deftypefun void using_history (void) +Begin a session in which the history functions might be used. This +initializes the interactive variables. +@end deftypefun + +@deftypefun {HISTORY_STATE *} history_get_history_state (void) +Return a structure describing the current state of the input history. +@end deftypefun + +@deftypefun void history_set_history_state (HISTORY_STATE *state) +Set the state of the history list according to @var{state}. +@end deftypefun + +@node History List Management +@subsection History List Management + +These functions manage individual entries on the history list, or set +parameters managing the list itself. + +@deftypefun void add_history (const char *string) +Place @var{string} at the end of the history list. The associated data +field (if any) is set to @code{NULL}. +If the maximum number of history entries has been set using +@code{stifle_history()}, and the new number of history entries would exceed +that maximum, the oldest history entry is removed. +@end deftypefun + +@deftypefun void add_history_time (const char *string) +Change the time stamp associated with the most recent history entry to +@var{string}. +@end deftypefun + +@deftypefun {HIST_ENTRY *} remove_history (int which) +Remove history entry at offset @var{which} from the history. The +removed element is returned so you can free the line, data, +and containing structure. +@end deftypefun + +@deftypefun {histdata_t} free_history_entry (HIST_ENTRY *histent) +Free the history entry @var{histent} and any history library private +data associated with it. Returns the application-specific data +so the caller can dispose of it. +@end deftypefun + +@deftypefun {HIST_ENTRY *} replace_history_entry (int which, const char *line, histdata_t data) +Make the history entry at offset @var{which} have @var{line} and @var{data}. +This returns the old entry so the caller can dispose of any +application-specific data. In the case +of an invalid @var{which}, a @code{NULL} pointer is returned. +@end deftypefun + +@deftypefun void clear_history (void) +Clear the history list by deleting all the entries. +@end deftypefun + +@deftypefun void stifle_history (int max) +Stifle the history list, remembering only the last @var{max} entries. +The history list will contain only @var{max} entries at a time. +@end deftypefun + +@deftypefun int unstifle_history (void) +Stop stifling the history. This returns the previously-set +maximum number of history entries (as set by @code{stifle_history()}). +The value is positive if the history was +stifled, negative if it wasn't. +@end deftypefun + +@deftypefun int history_is_stifled (void) +Returns non-zero if the history is stifled, zero if it is not. +@end deftypefun + +@node Information About the History List +@subsection Information About the History List + +These functions return information about the entire history list or +individual list entries. + +@deftypefun {HIST_ENTRY **} history_list (void) +Return a @code{NULL} terminated array of @code{HIST_ENTRY *} which is the +current input history. Element 0 of this list is the beginning of time. +If there is no history, return @code{NULL}. +@end deftypefun + +@deftypefun int where_history (void) +Returns the offset of the current history element. +@end deftypefun + +@deftypefun {HIST_ENTRY *} current_history (void) +Return the history entry at the current position, as determined by +@code{where_history()}. If there is no entry there, return a @code{NULL} +pointer. +@end deftypefun + +@deftypefun {HIST_ENTRY *} history_get (int offset) +Return the history entry at position @var{offset}. +The range of valid +values of @var{offset} starts at @code{history_base} and ends at +@var{history_length} - 1 (@pxref{History Variables}). +If there is no entry there, or if @var{offset} is outside the valid +range, return a @code{NULL} pointer. +@end deftypefun + +@deftypefun time_t history_get_time (HIST_ENTRY *entry) +Return the time stamp associated with the history entry @var{entry}. +If the timestamp is missing or invalid, return 0. +@end deftypefun + +@deftypefun int history_total_bytes (void) +Return the number of bytes that the primary history entries are using. +This function returns the sum of the lengths of all the lines in the +history. +@end deftypefun + +@node Moving Around the History List +@subsection Moving Around the History List + +These functions allow the current index into the history list to be +set or changed. + +@deftypefun int history_set_pos (int pos) +Set the current history offset to @var{pos}, an absolute index +into the list. +Returns 1 on success, 0 if @var{pos} is less than zero or greater +than the number of history entries. +@end deftypefun + +@deftypefun {HIST_ENTRY *} previous_history (void) +Back up the current history offset to the previous history entry, and +return a pointer to that entry. If there is no previous entry, return +a @code{NULL} pointer. +@end deftypefun + +@deftypefun {HIST_ENTRY *} next_history (void) +If the current history offset refers to a valid history entry, +increment the current history offset. +If the possibly-incremented history offset refers to a valid history +entry, return a pointer to that entry; +otherwise, return a @code{BNULL} pointer. +@end deftypefun + +@node Searching the History List +@subsection Searching the History List +@cindex History Searching + +These functions allow searching of the history list for entries containing +a specific string. Searching may be performed both forward and backward +from the current history position. The search may be @dfn{anchored}, +meaning that the string must match at the beginning of the history entry. +@cindex anchored search + +@deftypefun int history_search (const char *string, int direction) +Search the history for @var{string}, starting at the current history offset. +If @var{direction} is less than 0, then the search is through +previous entries, otherwise through subsequent entries. +If @var{string} is found, then +the current history index is set to that history entry, and the value +returned is the offset in the line of the entry where +@var{string} was found. Otherwise, nothing is changed, and a -1 is +returned. +@end deftypefun + +@deftypefun int history_search_prefix (const char *string, int direction) +Search the history for @var{string}, starting at the current history +offset. The search is anchored: matching lines must begin with +@var{string}. If @var{direction} is less than 0, then the search is +through previous entries, otherwise through subsequent entries. +If @var{string} is found, then the +current history index is set to that entry, and the return value is 0. +Otherwise, nothing is changed, and a -1 is returned. +@end deftypefun + +@deftypefun int history_search_pos (const char *string, int direction, int pos) +Search for @var{string} in the history list, starting at @var{pos}, an +absolute index into the list. If @var{direction} is negative, the search +proceeds backward from @var{pos}, otherwise forward. Returns the absolute +index of the history element where @var{string} was found, or -1 otherwise. +@end deftypefun + +@node Managing the History File +@subsection Managing the History File + +The History library can read the history from and write it to a file. +This section documents the functions for managing a history file. + +@deftypefun int read_history (const char *filename) +Add the contents of @var{filename} to the history list, a line at a time. +If @var{filename} is @code{NULL}, then read from @file{~/.history}. +Returns 0 if successful, or @code{errno} if not. +@end deftypefun + +@deftypefun int read_history_range (const char *filename, int from, int to) +Read a range of lines from @var{filename}, adding them to the history list. +Start reading at line @var{from} and end at @var{to}. +If @var{from} is zero, start at the beginning. If @var{to} is less than +@var{from}, then read until the end of the file. If @var{filename} is +@code{NULL}, then read from @file{~/.history}. Returns 0 if successful, +or @code{errno} if not. +@end deftypefun + +@deftypefun int write_history (const char *filename) +Write the current history to @var{filename}, overwriting @var{filename} +if necessary. +If @var{filename} is @code{NULL}, then write the history list to +@file{~/.history}. +Returns 0 on success, or @code{errno} on a read or write error. +@end deftypefun + +@deftypefun int append_history (int nelements, const char *filename) +Append the last @var{nelements} of the history list to @var{filename}. +If @var{filename} is @code{NULL}, then append to @file{~/.history}. +Returns 0 on success, or @code{errno} on a read or write error. +@end deftypefun + +@deftypefun int history_truncate_file (const char *filename, int nlines) +Truncate the history file @var{filename}, leaving only the last +@var{nlines} lines. +If @var{filename} is @code{NULL}, then @file{~/.history} is truncated. +Returns 0 on success, or @code{errno} on failure. +@end deftypefun + +@node History Expansion +@subsection History Expansion + +These functions implement history expansion. + +@deftypefun int history_expand (char *string, char **output) +Expand @var{string}, placing the result into @var{output}, a pointer +to a string (@pxref{History Interaction}). Returns: +@table @code +@item 0 +If no expansions took place (or, if the only change in +the text was the removal of escape characters preceding the history expansion +character); +@item 1 +if expansions did take place; +@item -1 +if there was an error in expansion; +@item 2 +if the returned line should be displayed, but not executed, +as with the @code{:p} modifier (@pxref{Modifiers}). +@end table + +If an error occurred in expansion, then @var{output} contains a descriptive +error message. +@end deftypefun + +@deftypefun {char *} get_history_event (const char *string, int *cindex, int qchar) +Returns the text of the history event beginning at @var{string} + +@var{*cindex}. @var{*cindex} is modified to point to after the event +specifier. At function entry, @var{cindex} points to the index into +@var{string} where the history event specification begins. @var{qchar} +is a character that is allowed to end the event specification in addition +to the ``normal'' terminating characters. +@end deftypefun + +@deftypefun {char **} history_tokenize (const char *string) +Return an array of tokens parsed out of @var{string}, much as the +shell might. The tokens are split on the characters in the +@var{history_word_delimiters} variable, +and shell quoting conventions are obeyed as described below. +@end deftypefun + +@deftypefun {char *} history_arg_extract (int first, int last, const char *string) +Extract a string segment consisting of the @var{first} through @var{last} +arguments present in @var{string}. Arguments are split using +@code{history_tokenize}. +@end deftypefun + +@node History Variables +@section History Variables + +This section describes the externally-visible variables exported by +the @sc{gnu} History Library. + +@deftypevar int history_base +The logical offset of the first entry in the history list. +@end deftypevar + +@deftypevar int history_length +The number of entries currently stored in the history list. +@end deftypevar + +@deftypevar int history_max_entries +The maximum number of history entries. This must be changed using +@code{stifle_history()}. +@end deftypevar + +@deftypevar int history_write_timestamps +If non-zero, timestamps are written to the history file, so they can be +preserved between sessions. The default value is 0, meaning that +timestamps are not saved. + +The current timestamp format uses the value of @var{history_comment_char} +to delimit timestamp entries in the history file. If that variable does +not have a value (the default), timestamps will not be written. +@end deftypevar + +@deftypevar char history_expansion_char +The character that introduces a history event. The default is @samp{!}. +Setting this to 0 inhibits history expansion. +@end deftypevar + +@deftypevar char history_subst_char +The character that invokes word substitution if found at the start of +a line. The default is @samp{^}. +@end deftypevar + +@deftypevar char history_comment_char +During tokenization, if this character is seen as the first character +of a word, then it and all subsequent characters up to a newline are +ignored, suppressing history expansion for the remainder of the line. +This is disabled by default. +@end deftypevar + +@deftypevar {char *} history_word_delimiters +The characters that separate tokens for @code{history_tokenize()}. +The default value is @code{" \t\n()<>;&|"}. +@end deftypevar + +@deftypevar {char *} history_search_delimiter_chars +The list of additional characters which can delimit a history search +string, in addition to space, TAB, @samp{:} and @samp{?} in the case of +a substring search. The default is empty. +@end deftypevar + +@deftypevar {char *} history_no_expand_chars +The list of characters which inhibit history expansion if found immediately +following @var{history_expansion_char}. The default is space, tab, newline, +carriage return, and @samp{=}. +@end deftypevar + +@deftypevar int history_quotes_inhibit_expansion +If non-zero, the history expansion code implements shell-like quoting: +single-quoted words are not scanned for the history expansion +character or the history comment character, and double-quoted words may +have history expansion performed, since single quotes are not special +within double quotes. +The default value is 0. +@end deftypevar + +@deftypevar int history_quoting_state +An application may set this variable to indicate that the current line +being expanded is subject to existing quoting. If set to @samp{'}, the +history expansion function will assume that the line is single-quoted and +inhibit expansion until it reads an unquoted closing single quote; if set +to @samp{"}, history expansion will assume the line is double quoted until +it reads an unquoted closing double quote. If set to zero, the default, +the history expansion function will assume the line is not quoted and +treat quote characters within the line as described above. +This is only effective if @var{history_quotes_inhibit_expansion} is set. +@end deftypevar + +@deftypevar {rl_linebuf_func_t *} history_inhibit_expansion_function +This should be set to the address of a function that takes two arguments: +a @code{char *} (@var{string}) +and an @code{int} index into that string (@var{i}). +It should return a non-zero value if the history expansion starting at +@var{string[i]} should not be performed; zero if the expansion should +be done. +It is intended for use by applications like Bash that use the history +expansion character for additional purposes. +By default, this variable is set to @code{NULL}. +@end deftypevar + +@node History Programming Example +@section History Programming Example + +The following program demonstrates simple use of the @sc{gnu} History Library. + +@smallexample +#include +#include + +main (argc, argv) + int argc; + char **argv; +@{ + char line[1024], *t; + int len, done = 0; + + line[0] = 0; + + using_history (); + while (!done) + @{ + printf ("history$ "); + fflush (stdout); + t = fgets (line, sizeof (line) - 1, stdin); + if (t && *t) + @{ + len = strlen (t); + if (t[len - 1] == '\n') + t[len - 1] = '\0'; + @} + + if (!t) + strcpy (line, "quit"); + + if (line[0]) + @{ + char *expansion; + int result; + + result = history_expand (line, &expansion); + if (result) + fprintf (stderr, "%s\n", expansion); + + if (result < 0 || result == 2) + @{ + free (expansion); + continue; + @} + + add_history (expansion); + strncpy (line, expansion, sizeof (line) - 1); + free (expansion); + @} + + if (strcmp (line, "quit") == 0) + done = 1; + else if (strcmp (line, "save") == 0) + write_history ("history_file"); + else if (strcmp (line, "read") == 0) + read_history ("history_file"); + else if (strcmp (line, "list") == 0) + @{ + register HIST_ENTRY **the_list; + register int i; + + the_list = history_list (); + if (the_list) + for (i = 0; the_list[i]; i++) + printf ("%d: %s\n", i + history_base, the_list[i]->line); + @} + else if (strncmp (line, "delete", 6) == 0) + @{ + int which; + if ((sscanf (line + 6, "%d", &which)) == 1) + @{ + HIST_ENTRY *entry = remove_history (which); + if (!entry) + fprintf (stderr, "No such entry %d\n", which); + else + @{ + free (entry->line); + free (entry); + @} + @} + else + @{ + fprintf (stderr, "non-numeric arg given to `delete'\n"); + @} + @} + @} +@} +@end smallexample diff --git a/doc/hsuser.texi b/doc/hsuser.texi new file mode 100644 index 0000000..9081baf --- /dev/null +++ b/doc/hsuser.texi @@ -0,0 +1,533 @@ +@ignore +This file documents the user interface to the GNU History library. + +Copyright (C) 1988--2022 Free Software Foundation, Inc. +Authored by Brian Fox and Chet Ramey. + +Permission is granted to make and distribute verbatim copies of this manual +provided the copyright notice and this permission notice are preserved on +all copies. + +Permission is granted to process this file through Tex and print the +results, provided the printed document carries copying permission notice +identical to this one except for the removal of this paragraph (this +paragraph not being relevant to the printed manual). + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +GNU Copyright statement is available to the distributee, and provided that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end ignore + +@node Using History Interactively +@chapter Using History Interactively + +@ifclear BashFeatures +@defcodeindex bt +@end ifclear + +@ifset BashFeatures +This chapter describes how to use the @sc{gnu} History Library +interactively, from a user's standpoint. +It should be considered a user's guide. +For information on using the @sc{gnu} History Library in other programs, +see the @sc{gnu} Readline Library Manual. +@end ifset +@ifclear BashFeatures +This chapter describes how to use the @sc{gnu} History Library interactively, +from a user's standpoint. It should be considered a user's guide. For +information on using the @sc{gnu} History Library in your own programs, +@pxref{Programming with GNU History}. +@end ifclear + +@ifset BashFeatures +@menu +* Bash History Facilities:: How Bash lets you manipulate your command + history. +* Bash History Builtins:: The Bash builtin commands that manipulate + the command history. +* History Interaction:: What it feels like using History as a user. +@end menu +@end ifset +@ifclear BashFeatures +@menu +* History Interaction:: What it feels like using History as a user. +@end menu +@end ifclear + +@ifset BashFeatures +@node Bash History Facilities +@section Bash History Facilities +@cindex command history +@cindex history list + +When the @option{-o history} option to the @code{set} builtin +is enabled (@pxref{The Set Builtin}), +the shell provides access to the @dfn{command history}, +the list of commands previously typed. +The value of the @env{HISTSIZE} shell variable is used as the +number of commands to save in a history list. +The text of the last @env{$HISTSIZE} +commands (default 500) is saved. +The shell stores each command in the history list prior to +parameter and variable expansion +but after history expansion is performed, subject to the +values of the shell variables +@env{HISTIGNORE} and @env{HISTCONTROL}. + +When the shell starts up, the history is initialized from the +file named by the @env{HISTFILE} variable (default @file{~/.bash_history}). +The file named by the value of @env{HISTFILE} is truncated, if +necessary, to contain no more than the number of lines specified by +the value of the @env{HISTFILESIZE} variable. +When a shell with history enabled exits, the last +@env{$HISTSIZE} lines are copied from the history list to the file +named by @env{$HISTFILE}. +If the @code{histappend} shell option is set (@pxref{Bash Builtins}), +the lines are appended to the history file, +otherwise the history file is overwritten. +If @env{HISTFILE} +is unset, or if the history file is unwritable, the history is not saved. +After saving the history, the history file is truncated +to contain no more than @env{$HISTFILESIZE} lines. +If @env{HISTFILESIZE} is unset, or set to null, a non-numeric value, or +a numeric value less than zero, the history file is not truncated. + +If the @env{HISTTIMEFORMAT} is set, the time stamp information +associated with each history entry is written to the history file, +marked with the history comment character. +When the history file is read, lines beginning with the history +comment character followed immediately by a digit are interpreted +as timestamps for the following history entry. + +The builtin command @code{fc} may be used to list or edit and re-execute +a portion of the history list. +The @code{history} builtin may be used to display or modify the history +list and manipulate the history file. +When using command-line editing, search commands +are available in each editing mode that provide access to the +history list (@pxref{Commands For History}). + +The shell allows control over which commands are saved on the history +list. The @env{HISTCONTROL} and @env{HISTIGNORE} +variables may be set to cause the shell to save only a subset of the +commands entered. +The @code{cmdhist} +shell option, if enabled, causes the shell to attempt to save each +line of a multi-line command in the same history entry, adding +semicolons where necessary to preserve syntactic correctness. +The @code{lithist} +shell option causes the shell to save the command with embedded newlines +instead of semicolons. +The @code{shopt} builtin is used to set these options. +@xref{The Shopt Builtin}, 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}] [-lnr] [@var{first}] [@var{last}]} +@code{fc -s [@var{pat}=@var{rep}] [@var{command}]} +@end example + +The first form selects a range of commands from @var{first} to +@var{last} from the history list and displays or edits and re-executes +them. +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). + +When listing, a @var{first} or @var{last} of 0 is equivalent to -1 +and -0 is equivalent to the current command (usually the @code{fc} +command); +otherwise 0 is equivalent to -1 and -0 is invalid. + +If @var{last} is not specified, it is set to +@var{first}. If @var{first} is not specified, it is set to the previous +command for editing and @minus{}16 for listing. If the @option{-l} flag is +given, the commands are listed on standard output. The @option{-n} flag +suppresses the command numbers when listing. The @option{-r} flag +reverses the order of the listing. Otherwise, the editor given by +@var{ename} is invoked on a file containing those commands. If +@var{ename} is not given, the value of the following variable expansion +is used: @code{$@{FCEDIT:-$@{EDITOR:-vi@}@}}. This says to use the +value of the @env{FCEDIT} variable if set, or the value of the +@env{EDITOR} variable if that is set, or @code{vi} if neither is set. +When editing is complete, the edited commands are echoed and executed. + +In the second form, @var{command} is re-executed after each instance +of @var{pat} in the selected command is replaced by @var{rep}. +@var{command} is interpreted the same as @var{first} above. + +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 -d @var{start}-@var{end} +history [-anrw] [@var{filename}] +history -ps @var{arg} +@end example + +With no options, display the history list with line numbers. +Lines prefixed with a @samp{*} have been modified. +An argument of @var{n} lists only the last @var{n} lines. +If the shell variable @env{HISTTIMEFORMAT} is set and not null, +it is used as a format string for @var{strftime} to display +the time stamp associated with each displayed history entry. +No intervening blank is printed between the formatted time stamp +and the history line. + +Options, if supplied, have the following meanings: + +@table @code +@item -c +Clear the history list. This may be combined +with the other options to replace the history list completely. + +@item -d @var{offset} +Delete the history entry at position @var{offset}. +If @var{offset} is positive, it should be specified as it appears when +the history is displayed. +If @var{offset} is negative, it is interpreted as relative to one greater +than the last history position, so negative indices count back from the +end of the history, and an index of @samp{-1} refers to the current +@code{history -d} command. + +@item -d @var{start}-@var{end} +Delete the range of history entries between positions @var{start} and +@var{end}, inclusive. +Positive and negative values for @var{start} and @var{end} +are interpreted as described above. + +@item -a +Append the new history lines to the history file. +These are history lines entered since the beginning of the current +Bash session, but not already appended 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 history file and append its contents to +the history list. + +@item -w +Write out the current history list 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 + +If a @var{filename} argument is supplied +when any of the @option{-w}, @option{-r}, @option{-a}, or @option{-n} options +is used, Bash uses @var{filename} as the history file. +If not, then the value of the @env{HISTFILE} variable is used. + +The return value is 0 unless an invalid option is encountered, an +error occurs while reading or writing the history file, an invalid +@var{offset} or range is supplied as an argument to @option{-d}, or the +history expansion supplied as an argument to @option{-p} fails. + +@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. + +@ifset BashFeatures +History expansion is performed immediately after a complete line +is read, before the shell breaks it into words, and is performed +on each line individually. Bash attempts to inform the history +expansion functions about quoting still in effect from previous lines. +@end ifset + +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. + +History expansion implements shell-like quoting conventions: +a backslash can be used to remove the special handling for the next character; +single quotes enclose verbatim sequences of characters, and can be used to +inhibit history expansion; +and characters enclosed within double quotes may be subject to history +expansion, since backslash can escape the history expansion character, +but single quotes may not, since they are not treated specially within +double quotes. + +@ifset BashFeatures +When using the shell, only @samp{\} and @samp{'} may be used to escape the +history expansion character, but the history expansion character is +also treated as quoted if it immediately precedes the closing double quote +in a double-quoted string. +@end ifset + +@ifset BashFeatures +Several shell options settable with the @code{shopt} +builtin (@pxref{The Shopt Builtin}) may be used to tailor +the behavior of history expansion. If the +@code{histverify} shell option is enabled, and Readline +is being used, history substitutions are not immediately passed to +the shell parser. +Instead, the expanded line is reloaded into the Readline +editing buffer for further modification. +If Readline is being used, and the @code{histreedit} +shell option is enabled, a failed history expansion will be +reloaded into the Readline editing buffer for correction. +The @option{-p} option to the @code{history} builtin command +may be used to see what a history expansion will do before using it. +The @option{-s} option to the @code{history} builtin may be used to +add commands to the end of the history list without actually executing +them, so that they are available for subsequent recall. +This is most useful in conjunction with Readline. + +The shell allows control of the various characters used by the +history expansion mechanism with the @code{histchars} variable, +as explained above (@pxref{Bash Variables}). The shell uses +the history comment character to mark history timestamps when +writing the history file. +@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. +Unless the reference is absolute, events are relative to the current +position in the history list. +@cindex history events + +@table @asis + +@item @code{!} +@ifset BashFeatures +Start a history substitution, except when followed by a space, tab, +the end of the line, @samp{=} or @samp{(} (when the +@code{extglob} shell option is enabled using the @code{shopt} builtin). +@end ifset +@ifclear BashFeatures +Start a history substitution, except when followed by a space, tab, +the end of the line, or @samp{=}. +@end ifclear + +@item @code{!@var{n}} +Refer to command line @var{n}. + +@item @code{!-@var{n}} +Refer to the command @var{n} lines back. + +@item @code{!!} +Refer to the previous command. This is a synonym for @samp{!-1}. + +@item @code{!@var{string}} +Refer to the most recent command +preceding the current position in the history list +starting with @var{string}. + +@item @code{!?@var{string}[?]} +Refer to the most recent command +preceding the current position in the history list +containing @var{string}. +The trailing +@samp{?} may be omitted if the @var{string} is followed immediately by +a newline. +If @var{string} is missing, the string from the most recent search is used; +it is an error if there is no previous search string. + +@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 first word matched by the most recent @samp{?@var{string}?} search, +if the search string begins with a character that is part of a word. + +@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. +If @samp{x} is missing, it defaults to 0. + +@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{:}. +These modify, or edit, the word or words selected from the history event. + +@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. +The @samp{q} and @samp{x} modifiers are mutually exclusive; the last one +supplied is used. +@end ifset + +@item s/@var{old}/@var{new}/ +Substitute @var{new} for the first occurrence of @var{old} in the +event line. +Any character may be used as the delimiter 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{&}. +If @var{old} is null, it is set to the last @var{old} +substituted, or, if no previous history substitutions took place, +the last @var{string} +in a !?@var{string}@code{[?]} +search. +If @var{new} is null, each matching @var{old} is deleted. +The final delimiter is optional if it is the last +character on the input line. + +@item & +Repeat the previous substitution. + +@item g +@itemx a +Cause changes to be applied over the entire event line. Used in +conjunction with @samp{s}, as in @code{gs/@var{old}/@var{new}/}, +or with @samp{&}. + +@item G +Apply the following @samp{s} or @samp{&} modifier once to each word +in the event. + +@end table diff --git a/doc/readline.0 b/doc/readline.0 new file mode 100644 index 0000000..b7c45a7 --- /dev/null +++ b/doc/readline.0 @@ -0,0 +1,1175 @@ +READLINE(3) Library Functions Manual READLINE(3) + + + +NAME + readline - get a line from a user with editing + +SYNOPSIS + #include  + #include  + #include  + + char * + readline (const char *prompt); + +COPYRIGHT + Readline is Copyright (C) 1989-2020 Free Software Foundation, Inc. + +DESCRIPTION + readline will read a line from the terminal and return it, using prompt + as a prompt. If prompt is NULL or the empty string, no prompt is is- + sued. The line returned is allocated with malloc(3); the caller must + free it when finished. The line returned has the final newline re- + moved, so only the text of the line remains. + + 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. + + This manual page describes only the most basic use of readline. Much + more functionality is available; see The GNU Readline Library and The + GNU History Library for additional information. + +RETURN VALUE + readline returns the text of the line read. A blank line returns the + empty string. If EOF is encountered while reading a line, and the line + is empty, NULL is returned. If an EOF is read with a non-empty line, + it is treated as a newline. + +NOTATION + An Emacs-style notation is used to denote keystrokes. Control keys are + denoted by C-key, e.g., C-n means Control-N. Similarly, meta keys are + denoted by M-key, so M-x means Meta-X. (On keyboards without a meta + key, M-x means ESC x, i.e., press the Escape key then the x key. This + makes ESC the meta prefix. The combination M-C-x means ESC-Control-x, + or press the Escape key then hold the Control key while pressing the x + key.) + + Readline commands may be given numeric 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., kill-line) causes that command to + act in a backward direction. Commands whose behavior with arguments + deviates from this are noted below. + + When a command is described as killing text, the text deleted is saved + for possible future retrieval (yanking). The killed text is saved in a + kill ring. 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. + +INITIALIZATION FILE + Readline is customized by putting commands in an initialization file + (the inputrc file). The name of this file is taken from the value of + the INPUTRC environment variable. If that variable is unset, the de- + fault is ~/.inputrc. If that file does not exist or cannot be read, + the ultimate default is /etc/inputrc. When a program which uses the + readline library starts up, the init file is read, and the key bindings + 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 inputrc would make M-C-u execute the readline command univer- + sal-argument. + + The following symbolic character names are recognized while processing + key bindings: DEL, ESC, ESCAPE, LFD, NEWLINE, RET, RETURN, RUBOUT, + SPACE, SPC, and TAB. + + In addition to command names, readline allows keys to be bound to a + string that is inserted when the key is pressed (a macro). + + Key Bindings + The syntax for controlling key bindings in the 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 speci- + fied in one of two ways: as a symbolic key name, possibly with Meta- or + Control- prefixes, or as a key sequence. The name and key sequence are + separated by a colon. There can be no whitespace between the name and + the colon. + + When using the form keyname:function-name or macro, keyname is the name + of a key spelled out in English. For example: + + Control-u: universal-argument + Meta-Rubout: backward-kill-word + Control-o: "> output" + + In the above example, C-u is bound to the function universal-argument, + M-DEL is bound to the function backward-kill-word, and C-o is bound to + run the macro expressed on the right hand side (that is, to insert the + text ``> output'' into the line). + + In the second form, "keyseq":function-name or macro, keyseq differs + from keyname above in that strings denoting an entire key sequence may + be specified by placing the sequence within double quotes. Some GNU + Emacs style key escapes can be used, as in the following example, but + the symbolic character names are not recognized. + + "\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 universal-argument. + 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 full set of GNU Emacs style escape sequences available when speci- + fying key sequences is + \C- control prefix + \M- meta prefix + \e an escape character + \\ backslash + \" literal ", a double quote + \' literal ', a single quote + + In addition to the GNU Emacs style escape sequences, a second set of + backslash escapes is available: + \a alert (bell) + \b backspace + \d delete + \f form feed + \n newline + \r carriage return + \t horizontal tab + \v vertical tab + \nnn the eight-bit character whose value is the octal value + nnn (one to three digits) + \xHH the eight-bit character whose value is the hexadecimal + value HH (one or two hex digits) + + When entering the text of a macro, single or double quotes 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 '. + + Bash allows the current readline key bindings to be displayed or modi- + fied with the bind builtin command. The editing mode may be switched + during interactive use by using the -o option to the set builtin com- + mand. Other programs using this library provide similar mechanisms. + The inputrc file may be edited and re-read if a program does not pro- + vide any other means to incorporate new bindings. + + Variables + Readline has variables that can be used to further customize its behav- + ior. A variable may be set in the inputrc file with a statement of the + form + + set variable-name value + + Except where noted, readline variables can take the values On or Off + (without regard to case). Unrecognized variable names are ignored. + When a variable value is read, empty or null values, "on" (case-insen- + sitive), and "1" are equivalent to On. All other values are equivalent + to Off. The variables and their default values are: + + active-region-start-color + A string variable that controls the text color and background + when displaying the text in the active region (see the descrip- + tion of enable-active-region below). This string must not take + up any physical character positions on the display, so it should + consist only of terminal escape sequences. It is output to the + terminal before displaying the text in the active region. This + variable is reset to the default value whenever the terminal + type changes. The default value is the string that puts the + terminal in standout mode, as obtained from the terminal's ter- + minfo description. A sample value might be "\e[01;33m". + active-region-end-color + A string variable that "undoes" the effects of active-re- + gion-start-color and restores "normal" terminal display appear- + ance after displaying text in the active region. This string + must not take up any physical character positions on the dis- + play, so it should consist only of terminal escape sequences. + It is output to the terminal after displaying the text in the + active region. This variable is reset to the default value + whenever the terminal type changes. The default value is the + string that restores the terminal from standout mode, as ob- + tained from the terminal's terminfo description. A sample value + might be "\e[0m". + bell-style (audible) + 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, readline attempts to ring the terminal's bell. + bind-tty-special-chars (On) + If set to On (the default), readline attempts to bind the con- + trol characters treated specially by the kernel's terminal + driver to their readline equivalents. + blink-matching-paren (Off) + If set to On, readline attempts to briefly move the cursor to an + opening parenthesis when a closing parenthesis is inserted. + colored-completion-prefix (Off) + If set to On, when listing completions, readline displays the + common prefix of the set of possible completions using a differ- + ent color. The color definitions are taken from the value of + the LS_COLORS environment variable. If there is a color defini- + tion in $LS_COLORS for the custom suffix "readline-colored-com- + pletion-prefix", readline uses this color for the common prefix + instead of its default. + colored-stats (Off) + If set to On, readline displays possible completions using dif- + ferent colors to indicate their file type. The color defini- + tions are taken from the value of the LS_COLORS environment + variable. + comment-begin (``#'') + The string that is inserted in vi mode when the insert-comment + command is executed. This command is bound to M-# in emacs mode + and to # in vi command mode. + completion-display-width (-1) + The number of screen columns used to display possible matches + when performing completion. The value is ignored if it is less + than 0 or greater than the terminal screen width. A value of 0 + will cause matches to be displayed one per line. The default + value is -1. + completion-ignore-case (Off) + If set to On, readline performs filename matching and completion + in a case-insensitive fashion. + completion-map-case (Off) + If set to On, and completion-ignore-case is enabled, readline + treats hyphens (-) and underscores (_) as equivalent when per- + forming case-insensitive filename matching and completion. + completion-prefix-display-length (0) + The length in characters of the common prefix of a list of pos- + sible completions that is displayed without modification. When + set to a value greater than zero, common prefixes longer than + this value are replaced with an ellipsis when displaying possi- + ble completions. + completion-query-items (100) + This determines when the user is queried about viewing the num- + ber of possible completions generated by the possible-comple- + tions 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, readline + will ask whether or not the user wishes to view them; otherwise + they are simply listed on the terminal. A negative value causes + readline to never ask. + convert-meta (On) + 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 it with an escape character (in effect, using escape + as the meta prefix). The default is On, but readline will set + it to Off if the locale contains eight-bit characters. This + variable is dependent on the LC_CTYPE locale category, and may + change if the locale is changed. + disable-completion (Off) + 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. + echo-control-characters (On) + When set to On, on operating systems that indicate they support + it, readline echoes a character corresponding to a signal gener- + ated from the keyboard. + editing-mode (emacs) + Controls whether readline begins with a set of key bindings sim- + ilar to Emacs or vi. editing-mode can be set to either emacs or + vi. + emacs-mode-string (@) + If the show-mode-in-prompt variable is enabled, this string is + displayed immediately before the last line of the primary prompt + when emacs editing mode is active. The value is expanded like a + key binding, so the standard set of meta- and control prefixes + and backslash escape sequences is available. Use the \1 and \2 + escapes to begin and end sequences of non-printing characters, + which can be used to embed a terminal control sequence into the + mode string. + enable-active-region (On) + The point is the current cursor position, and mark refers to a + saved cursor position. The text between the point and mark is + referred to as the region. When this variable is set to On, + readline allows certain commands to designate the region as ac- + tive. When the region is active, readline highlights the text + in the region using the value of the active-region-start-color, + which defaults to the string that enables the terminal's stand- + out mode. The active region shows the text inserted by brack- + eted-paste and any matching text found by incremental and non- + incremental history searches. + enable-bracketed-paste (On) + When set to On, readline configures the terminal to insert each + paste into the editing buffer as a single string of characters, + instead of treating each character as if it had been read from + the keyboard. This prevents readline from executing any editing + commands bound to key sequences appearing in the pasted text. + enable-keypad (Off) + When set to On, readline will try to enable the application key- + pad when it is called. Some systems need this to enable the ar- + row keys. + enable-meta-key (On) + When set to On, readline will try to enable any meta modifier + key the terminal claims to support when it is called. On many + terminals, the meta key is used to send eight-bit characters. + expand-tilde (Off) + If set to On, tilde expansion is performed when readline at- + tempts word completion. + history-preserve-point (Off) + If set to On, the history code attempts to place point at the + same location on each history line retrieved with previous-his- + tory or next-history. + history-size (unset) + Set the maximum number of history entries saved in the history + list. If set to zero, any existing history entries are deleted + and no new entries are saved. If set to a value less than zero, + the number of history entries is not limited. By default, the + number of history entries is not limited. If an attempt is made + to set history-size to a non-numeric value, the maximum number + of history entries will be set to 500. + horizontal-scroll-mode (Off) + When set to On, 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. This setting is automatically enabled for terminals + of height 1. + input-meta (Off) + If set to On, readline will enable eight-bit input (that is, it + will not clear the eighth bit in the characters it reads), re- + gardless of what the terminal claims it can support. The name + meta-flag is a synonym for this variable. The default is Off, + but readline will set it to On if the locale contains eight-bit + characters. This variable is dependent on the LC_CTYPE locale + category, and may change if the locale is changed. + isearch-terminators (``C-[ C-J'') + The string of characters that should terminate an incremental + search without subsequently executing the character as a com- + mand. If this variable has not been given a value, the charac- + ters ESC and C-J will terminate an incremental search. + keymap (emacs) + Set the current readline keymap. The set of legal keymap names + is emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, + vi-command, and vi-insert. vi is equivalent to vi-command; + emacs is equivalent to emacs-standard. The default value is + emacs. The value of editing-mode also affects the default + keymap. + keyseq-timeout (500) + Specifies the duration readline will wait for a character when + reading an ambiguous key sequence (one that can form a complete + key sequence using the input read so far, or can take additional + input to complete a longer key sequence). If no input is re- + ceived within the timeout, readline will use the shorter but + complete key sequence. The value is specified in milliseconds, + so a value of 1000 means that readline will wait one second for + additional input. If this variable is set to a value less than + or equal to zero, or to a non-numeric value, readline will wait + until another key is pressed to decide which key sequence to + complete. + mark-directories (On) + If set to On, completed directory names have a slash appended. + mark-modified-lines (Off) + If set to On, history lines that have been modified are dis- + played with a preceding asterisk (*). + mark-symlinked-directories (Off) + If set to On, completed names which are symbolic links to direc- + tories have a slash appended (subject to the value of mark-di- + rectories). + match-hidden-files (On) + This variable, when set to On, causes readline to match files + whose names begin with a `.' (hidden files) when performing + filename completion. If set to Off, the leading `.' must be + supplied by the user in the filename to be completed. + menu-complete-display-prefix (Off) + If set to On, menu completion displays the common prefix of the + list of possible completions (which may be empty) before cycling + through the list. + output-meta (Off) + 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, but readline will set it to On if the locale + contains eight-bit characters. This variable is dependent on + the LC_CTYPE locale category, and may change if the locale is + changed. + page-completions (On) + If set to On, readline uses an internal more-like pager to dis- + play a screenful of possible completions at a time. + print-completions-horizontally (Off) + If set to On, readline will display completions with matches + sorted horizontally in alphabetical order, rather than down the + screen. + revert-all-at-newline (Off) + If set to On, readline will undo all changes to history lines + before returning when accept-line is executed. By default, his- + tory lines may be modified and retain individual undo lists + across calls to readline. + show-all-if-ambiguous (Off) + 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. + show-all-if-unmodified (Off) + This alters the default behavior of the completion functions in + a fashion similar to show-all-if-ambiguous. If set to On, words + which have more than one possible completion without any possi- + ble partial completion (the possible completions don't share a + common prefix) cause the matches to be listed immediately in- + stead of ringing the bell. + show-mode-in-prompt (Off) + If set to On, add a string to the beginning of the prompt indi- + cating the editing mode: emacs, vi command, or vi insertion. + The mode strings are user-settable (e.g., emacs-mode-string). + skip-completed-text (Off) + If set to On, this alters the default completion behavior when + inserting a single match into the line. It's only active when + performing completion in the middle of a word. If enabled, + readline does not insert characters from the completion that + match characters after point in the word being completed, so + portions of the word following the cursor are not duplicated. + vi-cmd-mode-string ((cmd)) + If the show-mode-in-prompt variable is enabled, this string is + displayed immediately before the last line of the primary prompt + when vi editing mode is active and in command mode. The value + is expanded like a key binding, so the standard set of meta- and + control prefixes and backslash escape sequences is available. + Use the \1 and \2 escapes to begin and end sequences of non- + printing characters, which can be used to embed a terminal con- + trol sequence into the mode string. + vi-ins-mode-string ((ins)) + If the show-mode-in-prompt variable is enabled, this string is + displayed immediately before the last line of the primary prompt + when vi editing mode is active and in insertion mode. The value + is expanded like a key binding, so the standard set of meta- and + control prefixes and backslash escape sequences is available. + Use the \1 and \2 escapes to begin and end sequences of non- + printing characters, which can be used to embed a terminal con- + trol sequence into the mode string. + visible-stats (Off) + If set to On, a character denoting a file's type as reported by + stat(2) is appended to the filename when listing possible com- + pletions. + + Conditional 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 edit- + ing mode, the terminal being used, or the application using + readline. The text of the test, after any comparison operator, + extends to the end of the line; unless otherwise noted, no char- + acters 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 in- + stance, 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 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 in- + stance. + + version + The version test may be used to perform comparisons + against specific readline versions. The version expands + to the current readline version. The set of comparison + operators includes =, (and ==), !=, <=, >=, <, and >. + The version number supplied on the right side of the op- + erator consists of a major version number, an optional + decimal point, and an optional minor version (e.g., 7.1). + If the minor version is omitted, it is assumed to be 0. + The operator may be separated from the string version and + from the version number argument by whitespace. + + application + The application construct is used to include application- + specific settings. Each program using the readline li- + brary sets the application name, 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: + + $if Bash + # Quote the current or previous word + "\C-xq": "\eb\"\ef\"" + $endif + + variable + The variable construct provides simple equality tests for + readline variables and values. The permitted comparison + operators are =, ==, and !=. The variable name must be + separated from the comparison operator by whitespace; the + operator may be separated from the value on the right + hand side by whitespace. Both string and boolean vari- + ables may be tested. Boolean variables must be tested + against the values on and off. + + $endif This command, as seen in the previous example, terminates an $if + command. + + $else Commands in this branch of the $if directive are executed if the + test fails. + + $include + This directive takes a single filename as an argument and reads + commands and bindings from that file. For example, the follow- + ing directive would read /etc/inputrc: + + $include /etc/inputrc + +SEARCHING + 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, read- + line displays the next entry from the history matching the string typed + so far. An incremental search requires only as many characters as + needed to find the desired history entry. To search backward in the + history for a particular string, type C-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 Escape 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-s or C-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 newline will terminate the search + and accept the line, thereby executing the command from the history + list. A movement command will terminate the search, make the last line + found the current line, and begin editing. + + Non-incremental searches read the entire search string before starting + to search for matching history lines. The search string may be typed + by the user or be part of the contents of the current line. + +EDITING COMMANDS + The following is a list of the names of the commands and the default + key sequences to which they are bound. Command names without an accom- + panying key sequence are unbound by default. + + In the following descriptions, point refers to the current cursor posi- + tion, and mark refers to a cursor position saved by the set-mark com- + mand. The text between the point and mark is referred to as the re- + gion. + + 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 + alphanumeric characters (letters and digits). + backward-word (M-b) + Move back to the start of the current or previous word. Words + are composed of alphanumeric characters (letters and digits). + previous-screen-line + Attempt to move point to the same physical screen column on the + previous physical screen line. This will not have the desired + effect if the current readline line does not take up more than + one physical line or if point is not greater than the length of + the prompt plus the screen width. + next-screen-line + Attempt to move point to the same physical screen column on the + next physical screen line. This will not have the desired effect + if the current readline line does not take up more than one + physical line or if the length of the current readline line is + not greater than the length of the prompt plus the screen width. + clear-display (M-C-l) + Clear the screen and, if possible, the terminal's scrollback + buffer, then redraw the current line, leaving the current line + at the top of the screen. + clear-screen (C-l) + Clear the screen, then redraw the current line, leaving the cur- + rent line at the top of the screen. With an argument, refresh + the current line without clearing the screen. + redraw-current-line + Refresh the current line. + + Commands for Manipulating the History + accept-line (Newline, Return) + Accept the line regardless of where the cursor is. If this line + is non-empty, it may be added to the history list for future re- + call with add_history(). If the line is a modified history + line, the history line is restored to its original state. + previous-history (C-p) + Fetch the previous command from the history list, moving back in + the list. + next-history (C-n) + Fetch the next command from the history list, moving forward in + the 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. + operate-and-get-next (C-o) + Accept the current line for return to the calling application as + if a newline had been entered, and fetch the next line relative + to the current line from the history for editing. A numeric ar- + gument, if supplied, specifies the history entry to use instead + of the current line. + fetch-history + With a numeric argument, fetch that entry from the history list + and make it the current line. Without an argument, move back to + the first entry in the history list. + 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 history as necessary. This is an incremental + search. + 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. + non-incremental-forward-search-history (M-n) + Search forward through the history using a non-incremental + search for a string supplied by the user. + history-search-backward + Search backward through the history for the string of characters + between the start of the current line and the current cursor po- + sition (the point). The search string must match at the begin- + ning of a history line. This is a non-incremental search. + history-search-forward + Search forward through the history for the string of characters + between the start of the current line and the point. The search + string must match at the beginning of a history line. This is a + non-incremental search. + history-substring-search-backward + Search backward through the history for the string of characters + between the start of the current line and the current cursor po- + sition (the point). The search string may match anywhere in a + history line. This is a non-incremental search. + history-substring-search-forward + Search forward through the history for the string of characters + between the start of the current line and the point. The search + string may match anywhere in a history line. This is a non-in- + cremental search. + yank-nth-arg (M-C-y) + Insert the first argument to the previous command (usually the + second word on the previous line) at point. With an argument n, + insert the nth word from the previous command (the words in the + previous command begin with word 0). A negative argument in- + serts the nth word from the end of the previous command. Once + the argument n is computed, the argument is extracted as if the + "!n" history expansion had been specified. + yank-last-arg (M-., M-_) + Insert the last argument to the previous command (the last word + of the previous history entry). With a numeric argument, behave + exactly like yank-nth-arg. Successive calls to yank-last-arg + move back through the history list, inserting the last word (or + the word specified by the argument to the first call) of each + line in turn. Any numeric argument supplied to these successive + calls determines the direction to move through the history. A + negative argument switches the direction through the history + (back or forward). The history expansion facilities are used to + extract the last argument, as if the "!$" history expansion had + been specified. + + Commands for Changing Text + end-of-file (usually C-d) + The character indicating end-of-file as set, for example, by + ``stty''. If this character is read when there are no charac- + ters on the line, and point is at the beginning of the line, + readline interprets it as the end of input and returns EOF. + delete-char (C-d) + Delete the character at point. If this function is bound to the + same character as the tty EOF character, as C-d commonly is, see + above for the effects. + backward-delete-char (Rubout) + Delete the character behind the cursor. When given a numeric + argument, save the deleted text on the kill ring. + 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 cur- + sor is deleted. + quoted-insert (C-q, C-v) + Add the next character that you type to the line verbatim. This + is how to insert characters like C-q, for example. + tab-insert (M-TAB) + Insert a tab character. + self-insert (a, b, A, 1, !, ...) + Insert the character typed. + transpose-chars (C-t) + Drag the character before point forward over the character at + point, moving point forward as well. If point is at the end of + the line, then this transposes the two characters before point. + Negative arguments have no effect. + transpose-words (M-t) + Drag the word before point past the word after point, moving + point over that word as well. If point is at the end of the + line, this transposes the last two words on the line. + upcase-word (M-u) + Uppercase the current (or following) word. With a negative ar- + gument, uppercase the previous word, but do not move point. + downcase-word (M-l) + Lowercase the current (or following) word. With a negative ar- + gument, lowercase the previous word, but do not move point. + capitalize-word (M-c) + Capitalize the current (or following) word. With a negative ar- + gument, capitalize the previous word, but do not move point. + overwrite-mode + Toggle overwrite mode. With an explicit positive numeric argu- + ment, switches to overwrite mode. With an explicit non-positive + numeric argument, switches to insert mode. This command affects + only emacs mode; vi mode does overwrite differently. Each call + to readline() starts in insert mode. In overwrite mode, charac- + ters bound to self-insert replace the text at point rather than + pushing the text to the right. Characters bound to back- + ward-delete-char replace the character before point with a + space. By default, this command is unbound. + + 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 point to the beginning of the line. The + killed text is saved on the kill-ring. + kill-whole-line + Kill all characters on the current line, no matter where point + is. + kill-word (M-d) + Kill from point the end of the current word, or if between + words, to the end of the next word. Word boundaries are the + same as those used by forward-word. + backward-kill-word (M-Rubout) + Kill the word behind point. Word boundaries are the same as + those used by backward-word. + unix-word-rubout (C-w) + Kill the word behind point, using white space as a word bound- + ary. The killed text is saved on the kill-ring. + unix-filename-rubout + Kill the word behind point, using white space and the slash + character as the word boundaries. The killed text is saved on + the kill-ring. + delete-horizontal-space (M-\) + Delete all spaces and tabs around point. + kill-region + Kill the text between the point and mark (saved cursor posi- + tion). This text is referred to as the region. + copy-region-as-kill + Copy the text in the region to the kill buffer. + copy-backward-word + Copy the word before point to the kill buffer. The word bound- + aries are the same as backward-word. + copy-forward-word + Copy the word following point to the kill buffer. The word + boundaries are the same as forward-word. + yank (C-y) + Yank the top of the kill ring into the buffer at point. + yank-pop (M-y) + Rotate the kill ring, and yank the new top. Only works follow- + ing yank or yank-pop. + + 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 fol- + lowed by digits, executing universal-argument again ends the nu- + meric argument, but is otherwise ignored. As a special case, if + this command is immediately followed by a character that is nei- + ther a digit or minus sign, the argument count for the next com- + mand is multiplied by four. The argument count is initially + one, so executing this function the first time makes the argu- + ment count four, a second time makes the argument count sixteen, + and so on. + + Completing + complete (TAB) + Attempt to perform completion on the text before point. The ac- + tual completion performed is application-specific. Bash, for + instance, attempts completion 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 completion is attempted. Gdb, on the other + hand, allows completion of program functions and variables, and + only attempts filename completion under certain circumstances. + possible-completions (M-?) + List the possible completions of the text before point. When + displaying completions, readline sets the number of columns used + for display to the value of completion-display-width, the value + of the environment variable COLUMNS, or the screen width, in + that order. + insert-completions (M-*) + Insert all completions of the text before point that would have + been generated by possible-completions. + menu-complete + Similar to complete, but replaces the word to be completed with + a single match from the list of possible completions. Repeated + execution of menu-complete steps through the list of possible + completions, inserting each match in turn. At the end of the + list of completions, the bell is rung (subject to the setting of + bell-style) and the original text is restored. An argument of n + moves n positions forward in the list of matches; a negative ar- + gument may be used to move backward through the list. This com- + mand is intended to be bound to TAB, but is unbound by default. + menu-complete-backward + Identical to menu-complete, but moves backward through the list + of possible completions, as if menu-complete had been given a + negative argument. This command 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. + + 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 store the definition. + call-last-kbd-macro (C-x e) + Re-execute the last keyboard macro defined, by making the char- + acters in the macro appear as if typed at the keyboard. + print-last-kbd-macro () + Print the last keyboard macro defined in a format suitable for + the inputrc file. + + Miscellaneous + 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-lowercase-version (M-A, M-B, M-x, ...) + If the metafied character x is uppercase, run the command that + is bound to the corresponding metafied lowercase character. The + behavior is undefined if x is already lowercase. + prefix-meta (ESC) + Metafy the next character typed. ESC f is equivalent to Meta-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 return the line to its initial + state. + tilde-expand (M-&) + Perform tilde expansion on the current word. + set-mark (C-@, M-) + Set the mark to the point. If a numeric argument is supplied, + the mark is set to that position. + exchange-point-and-mark (C-x C-x) + Swap the point with the mark. The current cursor position is + set to the saved position, and the old cursor position is saved + as the mark. + character-search (C-]) + A character is read and point is moved to the next occurrence of + that character. A negative argument searches for previous oc- + currences. + character-search-backward (M-C-]) + A character is read and point is moved to the previous occur- + rence of that character. A negative argument searches for sub- + sequent occurrences. + skip-csi-sequence + Read enough characters to consume a multi-key sequence such as + those defined for keys like Home and End. Such sequences begin + with a Control Sequence Indicator (CSI), usually ESC-[. If this + sequence is bound to "\[", keys producing such sequences will + have no effect unless explicitly bound to a readline command, + instead of inserting stray characters into the editing buffer. + This is unbound by default, but usually bound to ESC-[. + insert-comment (M-#) + Without a numeric argument, the value of the readline com- + ment-begin variable is inserted at the beginning of the current + line. If a numeric argument is supplied, this command acts as a + toggle: if the characters at the beginning of the line do not + match the value of comment-begin, the value is inserted, other- + wise the characters in comment-begin are deleted from the begin- + ning of the line. In either case, the line is accepted as if a + newline had been typed. The default value of comment-begin + makes the current line a shell comment. If a numeric argument + causes the comment character to be removed, the line will be ex- + ecuted by the shell. + dump-functions + Print all of the functions and their key bindings to the read- + line output stream. If a numeric argument is supplied, the out- + put is formatted in such a way that it can be made part of an + inputrc file. + 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. + dump-macros + Print all of the readline key sequences bound to macros and the + strings they output. If a numeric argument is supplied, the + output is formatted in such a way that it can be made part of an + inputrc file. + emacs-editing-mode (C-e) + When in vi command mode, this causes a switch to emacs editing + mode. + vi-editing-mode (M-C-j) + When in emacs editing mode, this causes a switch to vi editing + mode. + +DEFAULT KEY BINDINGS + The following is a list of the default emacs and vi bindings. Charac- + ters with the eighth bit set are written as M-, and are re- + ferred to as metafied characters. The printable ASCII characters not + mentioned in the list of emacs standard bindings are bound to the + self-insert function, which just inserts the given character into the + input line. In vi insertion mode, all characters not specifically men- + tioned are bound to self-insert. Characters assigned to signal genera- + tion by stty(1) or the terminal driver, such as C-Z or C-C, retain that + function. Upper and lower case metafied characters are bound to the + same function in the emacs mode meta keymap. The remaining characters + are unbound, which causes readline to ring the bell (subject to the + setting of the bell-style variable). + + Emacs Mode + 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-L" clear-display + "M-C-M" vi-editing-mode + "M-C-R" revert-line + "M-C-Y" yank-nth-arg + "M-C-[" complete + "M-C-]" character-search-backward + "M-space" set-mark + "M-#" insert-comment + "M-&" tilde-expand + "M-*" insert-completions + "M--" digit-argument + "M-." yank-last-arg + "M-0" digit-argument + "M-1" digit-argument + "M-2" digit-argument + "M-3" digit-argument + "M-4" digit-argument + "M-5" digit-argument + "M-6" digit-argument + "M-7" digit-argument + "M-8" digit-argument + "M-9" digit-argument + "M-<" beginning-of-history + "M-=" possible-completions + "M->" end-of-history + "M-?" possible-completions + "M-B" backward-word + "M-C" capitalize-word + "M-D" kill-word + "M-F" forward-word + "M-L" downcase-word + "M-N" non-incremental-forward-search-history + "M-P" non-incremental-reverse-search-history + "M-R" revert-line + "M-T" transpose-words + "M-U" upcase-word + "M-Y" yank-pop + "M-\" delete-horizontal-space + "M-~" tilde-expand + "M-C-?" backward-kill-word + "M-_" yank-last-arg + + Emacs Control-X bindings + + "C-XC-G" abort + "C-XC-R" re-read-init-file + "C-XC-U" undo + "C-XC-X" exchange-point-and-mark + "C-X(" start-kbd-macro + "C-X)" end-kbd-macro + "C-XE" call-last-kbd-macro + "C-XC-?" backward-kill-line + + + VI Mode bindings + VI Insert Mode functions + + "C-D" vi-eof-maybe + "C-H" backward-delete-char + "C-I" complete + "C-J" accept-line + "C-M" accept-line + "C-R" reverse-search-history + "C-S" forward-search-history + "C-T" transpose-chars + "C-U" unix-line-discard + "C-V" quoted-insert + "C-W" unix-word-rubout + "C-Y" yank + "C-[" vi-movement-mode + "C-_" undo + " " to "~" self-insert + "C-?" backward-delete-char + + VI Command Mode functions + + "C-D" vi-eof-maybe + "C-E" emacs-editing-mode + "C-G" abort + "C-H" backward-char + "C-J" accept-line + "C-K" kill-line + "C-L" clear-screen + "C-M" accept-line + "C-N" next-history + "C-P" previous-history + "C-Q" quoted-insert + "C-R" reverse-search-history + "C-S" forward-search-history + "C-T" transpose-chars + "C-U" unix-line-discard + "C-V" quoted-insert + "C-W" unix-word-rubout + "C-Y" yank + "C-_" vi-undo + " " forward-char + "#" insert-comment + "$" end-of-line + "%" vi-match + "&" vi-tilde-expand + "*" vi-complete + "+" next-history + "," vi-char-search + "-" previous-history + "." vi-redo + "/" vi-search + "0" beginning-of-line + "1" to "9" vi-arg-digit + ";" vi-char-search + "=" vi-complete + "?" vi-search + "A" vi-append-eol + "B" vi-prev-word + "C" vi-change-to + "D" vi-delete-to + "E" vi-end-word + "F" vi-char-search + "G" vi-fetch-history + "I" vi-insert-beg + "N" vi-search-again + "P" vi-put + "R" vi-replace + "S" vi-subst + "T" vi-char-search + "U" revert-line + "W" vi-next-word + "X" backward-delete-char + "Y" vi-yank-to + "\" vi-complete + "^" vi-first-print + "_" vi-yank-arg + "`" vi-goto-mark + "a" vi-append-mode + "b" vi-prev-word + "c" vi-change-to + "d" vi-delete-to + "e" vi-end-word + "f" vi-char-search + "h" backward-char + "i" vi-insertion-mode + "j" next-history + "k" prev-history + "l" forward-char + "m" vi-set-mark + "n" vi-search-again + "p" vi-put + "r" vi-change-char + "s" vi-subst + "t" vi-char-search + "u" vi-undo + "w" vi-next-word + "x" vi-delete + "y" vi-yank-to + "|" vi-column + "~" vi-change-case + +SEE ALSO + The Gnu Readline Library, Brian Fox and Chet Ramey + The Gnu History Library, Brian Fox and Chet Ramey + bash(1) + +FILES + ~/.inputrc + Individual readline initialization file + +AUTHORS + Brian Fox, Free Software Foundation + bfox@gnu.org + + Chet Ramey, Case Western Reserve University + chet.ramey@case.edu + +BUG REPORTS + If you find a bug in 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 readline library that you have. + + Once you have determined that a bug actually exists, mail a bug report + to bug-readline@gnu.org. If you have a fix, you are welcome to mail + that as well! Suggestions and `philosophical' bug reports may be + mailed to bug-readline@gnu.org or posted to the Usenet newsgroup + gnu.bash.bug. + + Comments and bug reports concerning this manual page should be directed + to chet.ramey@case.edu. + +BUGS + It's too big and too slow. + + + +GNU Readline 8.2 2022 September 19 READLINE(3) diff --git a/doc/readline.3 b/doc/readline.3 new file mode 100644 index 0000000..77ef02a --- /dev/null +++ b/doc/readline.3 @@ -0,0 +1,1597 @@ +.\" +.\" MAN PAGE COMMENTS to +.\" +.\" Chet Ramey +.\" Information Network Services +.\" Case Western Reserve University +.\" chet.ramey@case.edu +.\" +.\" Last Change: Mon Sep 19 11:11:22 EDT 2022 +.\" +.TH READLINE 3 "2022 September 19" "GNU Readline 8.2" +.\" +.\" File Name macro. This used to be `.PN', for Path Name, +.\" but Sun doesn't seem to like that very much. +.\" +.de FN +\fI\|\\$1\|\fP +.. +.SH NAME +readline \- get a line from a user with editing +.SH SYNOPSIS +.LP +.nf +.ft B +#include +#include +#include +.ft +.fi +.LP +.nf +\fIchar *\fP +.br +\fBreadline\fP (\fIconst char *prompt\fP); +.fi +.SH COPYRIGHT +.if n Readline is Copyright (C) 1989\-2020 Free Software Foundation, Inc. +.if t Readline is Copyright \(co 1989\-2020 Free Software Foundation, Inc. +.SH DESCRIPTION +.LP +.B readline +will read a line from the terminal +and return it, using +.B prompt +as a prompt. If +.B prompt +is \fBNULL\fP or the empty string, no prompt is issued. +The line returned is allocated with +.IR malloc (3); +the caller must free it when finished. The line returned +has the final newline removed, so only the text of the line +remains. +.LP +.B readline +offers editing capabilities while the user is entering the +line. +By default, the line editing commands +are similar to those of emacs. +A vi\-style line editing interface is also available. +.LP +This manual page describes only the most basic use of \fBreadline\fP. +Much more functionality is available; see +\fIThe GNU Readline Library\fP and \fIThe GNU History Library\fP +for additional information. +.SH RETURN VALUE +.LP +.B readline +returns the text of the line read. A blank line +returns the empty string. If +.B EOF +is encountered while reading a line, and the line is empty, +.B NULL +is returned. If an +.B EOF +is read with a non\-empty line, it is +treated as a newline. +.SH NOTATION +.LP +An Emacs-style notation is used to denote +keystrokes. Control keys are denoted by C\-\fIkey\fR, e.g., C\-n +means Control\-N. Similarly, +.I meta +keys are denoted by M\-\fIkey\fR, so M\-x means Meta\-X. (On keyboards +without a +.I meta +key, M\-\fIx\fP means ESC \fIx\fP, i.e., press the Escape key +then the +.I x +key. This makes ESC the \fImeta prefix\fP. +The combination M\-C\-\fIx\fP means ESC\-Control\-\fIx\fP, +or press the Escape key +then hold the Control key while pressing the +.I x +key.) +.PP +Readline commands may be given numeric +.IR arguments , +which normally act as a repeat count. Sometimes, however, it is the +sign of the argument that is significant. Passing a negative argument +to a command that acts in the forward direction (e.g., \fBkill\-line\fP) +causes that command to act in a backward direction. +Commands whose behavior with arguments deviates from this are noted +below. +.PP +When a command is described as \fIkilling\fP text, the text +deleted is saved for possible future retrieval +(\fIyanking\fP). The killed text is saved in a +\fIkill ring\fP. Consecutive kills cause the text to be +accumulated into one unit, which can be yanked all at once. +Commands which do not kill text separate the chunks of text +on the kill ring. +.SH INITIALIZATION FILE +.LP +Readline is customized by putting commands in an initialization +file (the \fIinputrc\fP file). +The name of this file is taken from the value of the +.B INPUTRC +environment variable. If that variable is unset, the default is +.IR ~/.inputrc . +If that file does not exist or cannot be read, the ultimate default is +.IR /etc/inputrc . +When a program which uses the readline library starts up, the +init file is read, and the key bindings and variables are set. +There are only a few basic constructs allowed in the +readline init file. Blank lines are ignored. +Lines beginning with a \fB#\fP are comments. +Lines beginning with a \fB$\fP indicate conditional constructs. +Other lines denote key bindings and variable settings. +Each program using this library may add its own commands +and bindings. +.PP +For example, placing +.RS +.PP +M\-Control\-u: universal\-argument +.RE +or +.RS +C\-Meta\-u: universal\-argument +.RE +.sp +into the +.I inputrc +would make M\-C\-u execute the readline command +.IR universal\-argument . +.PP +The following symbolic character names are recognized while +processing key bindings: +.IR DEL , +.IR ESC , +.IR ESCAPE , +.IR LFD , +.IR NEWLINE , +.IR RET , +.IR RETURN , +.IR RUBOUT , +.IR SPACE , +.IR SPC , +and +.IR TAB . +.PP +In addition to command names, readline allows keys to be bound +to a string that is inserted when the key is pressed (a \fImacro\fP). +.PP +.SS Key Bindings +The syntax for controlling key bindings in the +.I inputrc +file is simple. All that is required is the name of the +command or the text of a macro and a key sequence to which +it should be bound. The name may be specified in one of two ways: +as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP +prefixes, or as a key sequence. +The name and key sequence are separated by a colon. There can be no +whitespace between the name and the colon. +.PP +When using the form \fBkeyname\fP:\^\fIfunction-name\fP or \fImacro\fP, +.I keyname +is the name of a key spelled out in English. For example: +.sp +.RS +Control\-u: universal\-argument +.br +Meta\-Rubout: backward\-kill\-word +.br +Control\-o: "> output" +.RE +.LP +In the above example, +.I C\-u +is bound to the function +.BR universal\-argument , +.I M-DEL +is bound to the function +.BR backward\-kill\-word , +and +.I C\-o +is bound to run the macro +expressed on the right hand side (that is, to insert the text +.if t \f(CW> output\fP +.if n ``> output'' +into the line). +.PP +In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP, +.B keyseq +differs from +.B keyname +above in that strings denoting +an entire key sequence may be specified by placing the sequence +within double quotes. Some GNU Emacs style key escapes can be +used, as in the following example, but the symbolic character names +are not recognized. +.sp +.RS +"\eC\-u": universal\-argument +.br +"\eC\-x\eC\-r": re\-read\-init\-file +.br +"\ee[11~": "Function Key 1" +.RE +.PP +In this example, +.I C-u +is again bound to the function +.BR universal\-argument . +.I "C-x C-r" +is bound to the function +.BR re\-read\-init\-file , +and +.I "ESC [ 1 1 ~" +is bound to insert the text +.if t \f(CWFunction Key 1\fP. +.if n ``Function Key 1''. +.PP +The full set of GNU Emacs style escape sequences available when specifying +key sequences is +.RS +.PD 0 +.TP +.B \eC\- +control prefix +.TP +.B \eM\- +meta prefix +.TP +.B \ee +an escape character +.TP +.B \e\e +backslash +.TP +.B \e" +literal ", a double quote +.TP +.B \e' +literal ', a single quote +.RE +.PD +.PP +In addition to the GNU Emacs style escape sequences, a second +set of backslash escapes is available: +.RS +.PD 0 +.TP +.B \ea +alert (bell) +.TP +.B \eb +backspace +.TP +.B \ed +delete +.TP +.B \ef +form feed +.TP +.B \en +newline +.TP +.B \er +carriage return +.TP +.B \et +horizontal tab +.TP +.B \ev +vertical tab +.TP +.B \e\fInnn\fP +the eight-bit character whose value is the octal value \fInnn\fP +(one to three digits) +.TP +.B \ex\fIHH\fP +the eight-bit character whose value is the hexadecimal value \fIHH\fP +(one or two hex digits) +.RE +.PD +.PP +When entering the text of a macro, single or double quotes should +be used to indicate a macro definition. Unquoted text +is assumed to be a function name. +In the macro body, the backslash escapes described above are expanded. +Backslash will quote any other character in the macro text, +including " and '. +.PP +.B Bash +allows the current readline key bindings to be displayed or modified +with the +.B bind +builtin command. The editing mode may be switched during interactive +use by using the +.B \-o +option to the +.B set +builtin command. Other programs using this library provide +similar mechanisms. The +.I inputrc +file may be edited and re-read if a program does not provide +any other means to incorporate new bindings. +.SS Variables +Readline has variables that can be used to further customize its +behavior. A variable may be set in the +.I inputrc +file with a statement of the form +.RS +.PP +\fBset\fP \fIvariable\-name\fP \fIvalue\fP +.RE +.PP +Except where noted, readline variables can take the values +.B On +or +.B Off +(without regard to case). +Unrecognized variable names are ignored. +When a variable value is read, empty or null values, "on" (case-insensitive), +and "1" are equivalent to \fBOn\fP. All other values are equivalent to +\fBOff\fP. +The variables and their default values are: +.PP +.PD 0 +.TP +.B active\-region\-start\-color +A string variable that controls the text color and background when displaying +the text in the active region (see the description of +\fBenable\-active\-region\fP below). +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal before displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that puts the terminal in standout mode, +as obtained from the terminal's terminfo description. +A sample value might be \f(CW"\ee[01;33m"\fP. +.TP +.B active\-region\-end\-color +A string variable that "undoes" the effects of \fBactive\-region\-start\-color\fP +and restores "normal" terminal display appearance after displaying text +in the active region. +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal after displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that restores the terminal from standout mode, +as obtained from the terminal's terminfo description. +A sample value might be \f(CW"\ee[0m\fP". +.TP +.B bell\-style (audible) +Controls what happens when readline wants to ring the terminal bell. +If set to \fBnone\fP, readline never rings the bell. If set to +\fBvisible\fP, readline uses a visible bell if one is available. +If set to \fBaudible\fP, readline attempts to ring the terminal's bell. +.TP +.B bind\-tty\-special\-chars (On) +If set to \fBOn\fP (the default), readline attempts to bind the control +characters treated specially by the kernel's terminal driver to their +readline equivalents. +.TP +.B blink\-matching\-paren (Off) +If set to \fBOn\fP, readline attempts to briefly move the cursor to an +opening parenthesis when a closing parenthesis is inserted. +.TP +.B colored\-completion\-prefix (Off) +If set to \fBOn\fP, when listing completions, readline displays the +common prefix of the set of possible completions using a different color. +The color definitions are taken from the value of the \fBLS_COLORS\fP +environment variable. +If there is a color definition in \fB$LS_COLORS\fP for the custom suffix +"readline-colored-completion-prefix", readline uses this color for +the common prefix instead of its default. +.TP +.B colored\-stats (Off) +If set to \fBOn\fP, readline displays possible completions using different +colors to indicate their file type. +The color definitions are taken from the value of the \fBLS_COLORS\fP +environment variable. +.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\-display\-width (\-1) +The number of screen columns used to display possible matches +when performing completion. +The value is ignored if it is less than 0 or greater than the terminal +screen width. +A value of 0 will cause matches to be displayed one per line. +The default value is \-1. +.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\-map\-case (Off) +If set to \fBOn\fP, and \fBcompletion\-ignore\-case\fP is enabled, readline +treats hyphens (\fI\-\fP) and underscores (\fI_\fP) as equivalent when +performing case\-insensitive filename matching and completion. +.TP +.B completion\-prefix\-display\-length (0) +The length in characters of the common prefix of a list of possible +completions that is displayed without modification. When set to a +value greater than zero, common prefixes longer than this value are +replaced with an ellipsis when displaying possible completions. +.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, +readline will ask whether or not the user wishes to view them; +otherwise they are simply listed +on the terminal. +A negative value causes readline to never ask. +.TP +.B convert\-meta (On) +If set to \fBOn\fP, readline will convert characters with the +eighth bit set to an ASCII key sequence +by stripping the eighth bit and prefixing it with an +escape character (in effect, using escape as the \fImeta prefix\fP). +The default is \fIOn\fP, but readline will set it to \fIOff\fP if the +locale contains eight-bit characters. +This variable is dependent on the \fBLC_CTYPE\fP locale category, and +may change if the locale is changed. +.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 echo\-control\-characters (On) +When set to \fBOn\fP, on operating systems that indicate they support it, +readline echoes a character corresponding to a signal generated from the +keyboard. +.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 emacs\-mode\-string (@) +If the \fIshow\-mode\-in\-prompt\fP variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when emacs editing mode is active. The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the \e1 and \e2 escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +.TP +.B enable\-active\-region (On) +The \fIpoint\fP is the current cursor position, and \fImark\fP refers +to a saved cursor position. +The text between the point and mark is referred to as the \fIregion\fP. +When this variable is set to \fIOn\fP, readline allows certain commands +to designate the region as \fIactive\fP. +When the region is active, readline highlights the text in the region using +the value of the \fBactive\-region\-start\-color\fP, which defaults to the +string that enables +the terminal's standout mode. +The active region shows the text inserted by bracketed-paste and any +matching text found by incremental and non-incremental history searches. +.TP +.B enable\-bracketed\-paste (On) +When set to \fBOn\fP, readline configures the terminal to insert each +paste into the editing buffer as a single string of characters, instead +of treating each character as if it had been read from the keyboard. +This prevents readline from executing any editing commands bound to key +sequences appearing in the pasted text. +.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 enable\-meta\-key (On) +When set to \fBOn\fP, readline will try to enable any meta modifier +key the terminal claims to support when it is called. On many terminals, +the meta key is used to send eight-bit characters. +.TP +.B expand\-tilde (Off) +If set to \fBOn\fP, tilde expansion is performed when readline +attempts word completion. +.TP +.B history\-preserve\-point (Off) +If set to \fBOn\fP, the history code attempts to place point at the +same location on each history line retrieved with \fBprevious-history\fP +or \fBnext-history\fP. +.TP +.B history\-size (unset) +Set the maximum number of history entries saved in the history list. +If set to zero, any existing history entries are deleted and no new entries +are saved. +If set to a value less than zero, the number of history entries is not +limited. +By default, the number of history entries is not limited. +If an attempt is made to set \fIhistory\-size\fP to a non-numeric value, +the maximum number of history entries will be set to 500. +.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. +This setting is automatically enabled for terminals of height 1. +.TP +.B input\-meta (Off) +If set to \fBOn\fP, readline will enable eight-bit input (that is, +it will not clear the eighth bit in the characters it reads), +regardless of what the terminal claims it can support. The name +.B meta\-flag +is a synonym for this variable. +The default is \fIOff\fP, but readline will set it to \fIOn\fP if the +locale contains eight-bit characters. +This variable is dependent on the \fBLC_CTYPE\fP locale category, and +may change if the locale is changed. +.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 keyseq\-timeout (500) +Specifies the duration \fIreadline\fP will wait for a character when reading an +ambiguous key sequence (one that can form a complete key sequence using +the input read so far, or can take additional input to complete a longer +key sequence). +If no input is received within the timeout, \fIreadline\fP will use the shorter +but complete key sequence. +The value is specified in milliseconds, so a value of 1000 means that +\fIreadline\fP will wait one second for additional input. +If this variable is set to a value less than or equal to zero, or to a +non-numeric value, \fIreadline\fP will wait until another key is pressed to +decide which key sequence to complete. +.TP +.B mark\-directories (On) +If set to \fBOn\fP, completed directory names have a slash +appended. +.TP +.B mark\-modified\-lines (Off) +If set to \fBOn\fP, history lines that have been modified are displayed +with a preceding asterisk (\fB*\fP). +.TP +.B mark\-symlinked\-directories (Off) +If set to \fBOn\fP, completed names which are symbolic links to directories +have a slash appended (subject to the value of +\fBmark\-directories\fP). +.TP +.B match\-hidden\-files (On) +This variable, when set to \fBOn\fP, causes readline to match files whose +names begin with a `.' (hidden files) when performing filename +completion. +If set to \fBOff\fP, the leading `.' must be +supplied by the user in the filename to be completed. +.TP +.B menu\-complete\-display\-prefix (Off) +If set to \fBOn\fP, menu completion displays the common prefix of the +list of possible completions (which may be empty) before cycling through +the list. +.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. +The default is \fIOff\fP, but readline will set it to \fIOn\fP if the +locale contains eight-bit characters. +This variable is dependent on the \fBLC_CTYPE\fP locale category, and +may change if the locale is changed. +.TP +.B page\-completions (On) +If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager +to display a screenful of possible completions at a time. +.TP +.B print\-completions\-horizontally (Off) +If set to \fBOn\fP, readline will display completions with matches +sorted horizontally in alphabetical order, rather than down the screen. +.TP +.B revert\-all\-at\-newline (Off) +If set to \fBOn\fP, readline will undo all changes to history lines +before returning when \fBaccept\-line\fP is executed. By default, +history lines may be modified and retain individual undo lists across +calls to \fBreadline\fP. +.TP +.B show\-all\-if\-ambiguous (Off) +This alters the default behavior of the completion functions. If +set to +.BR On , +words which have more than one possible completion cause the +matches to be listed immediately instead of ringing the bell. +.TP +.B show\-all\-if\-unmodified (Off) +This alters the default behavior of the completion functions in +a fashion similar to \fBshow\-all\-if\-ambiguous\fP. +If set to +.BR On , +words which have more than one possible completion without any +possible partial completion (the possible completions don't share +a common prefix) cause the matches to be listed immediately instead +of ringing the bell. +.TP +.B show\-mode\-in\-prompt (Off) +If set to \fBOn\fP, add a string to the beginning of the prompt +indicating the editing mode: emacs, vi command, or vi insertion. +The mode strings are user-settable (e.g., \fIemacs\-mode\-string\fP). +.TP +.B skip\-completed\-text (Off) +If set to \fBOn\fP, this alters the default completion behavior when +inserting a single match into the line. It's only active when +performing completion in the middle of a word. If enabled, readline +does not insert characters from the completion that match characters +after point in the word being completed, so portions of the word +following the cursor are not duplicated. +.TP +.B vi\-cmd\-mode\-string ((cmd)) +If the \fIshow\-mode\-in\-prompt\fP variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in command mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the \e1 and \e2 escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +.TP +.B vi\-ins\-mode\-string ((ins)) +If the \fIshow\-mode\-in\-prompt\fP variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in insertion mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the \e1 and \e2 escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +.TP +.B visible\-stats (Off) +If set to \fBOn\fP, a character denoting a file's type as reported +by \fIstat\fP(2) is appended to the filename when listing possible +completions. +.PD +.SS Conditional Constructs +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, after any comparison operator, +extends to the end of the line; +unless otherwise noted, 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 \fBversion\fP +The \fBversion\fP test may be used to perform comparisons against +specific readline versions. +The \fBversion\fP expands to the current readline version. +The set of comparison operators includes +.BR = , +(and +.BR == ), +.BR != , +.BR <= , +.BR >= , +.BR < , +and +.BR > . +The version number supplied on the right side of the operator consists +of a major version number, an optional decimal point, and an optional +minor version (e.g., \fB7.1\fP). If the minor version is omitted, it +is assumed to be \fB0\fP. +The operator may be separated from the string \fBversion\fP +and from the version number argument by whitespace. +.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 \fBbash\fP: +.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 +.IP \fIvariable\fP +The \fIvariable\fP construct provides simple equality tests for readline +variables and values. +The permitted comparison operators are \fI=\fP, \fI==\fP, and \fI!=\fP. +The variable name must be separated from the comparison operator by +whitespace; the operator may be separated from the value on the right hand +side by whitespace. +Both string and boolean variables may be tested. Boolean variables must be +tested against the values \fIon\fP and \fIoff\fP. +.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 +Readline provides commands for searching through the command history +for lines containing a specified string. +There are two search modes: +.I incremental +and +.IR non-incremental . +.PP +Incremental searches begin before the user has finished typing the +search string. +As each character of the search string is typed, readline displays +the next entry from the history matching the string typed so far. +An incremental search requires only as many characters as needed to +find the desired history entry. +To search backward in the history for a particular string, type +\fBC\-r\fP. Typing \fBC\-s\fP searches forward through the history. +The characters present in the value of the \fBisearch-terminators\fP +variable are used to terminate an incremental search. +If that variable has not been assigned a value the \fIEscape\fP and +\fBC\-J\fP characters will terminate an incremental search. +\fBC\-G\fP will abort an incremental search and restore the original +line. +When the search is terminated, the history entry containing the +search string becomes the current line. +.PP +To find other matching entries in the history list, type \fBC\-s\fP or +\fBC\-r\fP as appropriate. +This will search backward or forward in the history for the next +line matching the search string typed so far. +Any other key sequence bound to a readline command will terminate +the search and execute that command. +For instance, a newline will terminate the search and accept +the line, thereby executing the command from the history list. +A movement command will terminate the search, make the last line found +the current line, and begin editing. +.PP +Non-incremental searches read the entire search string before starting +to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. +.SH EDITING COMMANDS +The following is a list of the names of the commands and the default +key sequences to which they are bound. +Command names without an accompanying key sequence are unbound by default. +.PP +In the following descriptions, \fIpoint\fP refers to the current cursor +position, and \fImark\fP refers to a cursor position saved by the +\fBset\-mark\fP command. +The text between the point and mark is referred to as the \fIregion\fP. +.SS Commands for Moving +.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 previous\-screen\-line +Attempt to move point to the same physical screen column on the previous +physical screen line. This will not have the desired effect if the current +readline line does not take up more than one physical line or if point is not +greater than the length of the prompt plus the screen width. +.TP +.B next\-screen\-line +Attempt to move point to the same physical screen column on the next +physical screen line. This will not have the desired effect if the current +readline line does not take up more than one physical line or if the length +of the current readline line is not greater than the length of the prompt +plus the screen width. +.TP +.B clear\-display (M\-C\-l) +Clear the screen and, if possible, the terminal's scrollback buffer, +then redraw the current line, +leaving the current line at the top of the screen. +.TP +.B clear\-screen (C\-l) +Clear the screen, +then redraw the current line, +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 +.PD 0 +.TP +.B accept\-line (Newline, Return) +Accept the line regardless of where the cursor is. +If this line is +non-empty, it may be added to the history list for future recall with +\fBadd_history()\fP. +If the line is a modified history line, the history line is restored to its original state. +.TP +.B previous\-history (C\-p) +Fetch the previous command from the history list, moving back in +the list. +.TP +.B next\-history (C\-n) +Fetch the next command from the history list, moving forward in the +list. +.TP +.B beginning\-of\-history (M\-<) +Move to the first line in the history. +.TP +.B end\-of\-history (M\->) +Move to the end of the input history, i.e., the line currently being +entered. +.TP +.B +operate\-and\-get\-next (C\-o) +Accept the current line for return to the calling application as if a +newline had been entered, +and fetch the next line relative to the current line from the history +for editing. +A numeric argument, if supplied, specifies the history entry to use instead +of the current line. +.TP +.B +fetch\-history +With a numeric argument, fetch that entry from the history list +and make it the current line. +Without an argument, move back to the first entry in the history list. +.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\-backward +Search backward through the history for the string of characters +between the start of the current line and the current cursor +position (the \fIpoint\fP). +The search string must match at the beginning of a history line. +This is a non-incremental search. +.TP +.B history\-search\-forward +Search forward through the history for the string of characters +between the start of the current line and the point. +The search string must match at the beginning of a history line. +This is a non-incremental search. +.TP +.B history\-substring\-search\-backward +Search backward through the history for the string of characters +between the start of the current line and the current cursor +position (the \fIpoint\fP). +The search string may match anywhere in a history line. +This is a non-incremental search. +.TP +.B history\-substring\-search\-forward +Search forward through the history for the string of characters +between the start of the current line and the point. +The search string may match anywhere in a history line. +This is a non-incremental search. +.TP +.B yank\-nth\-arg (M\-C\-y) +Insert the first argument to the previous command (usually +the second word on the previous line) at point. +With an argument +.IR n , +insert the \fIn\fPth word from the previous command (the words +in the previous command begin with word 0). A negative argument +inserts the \fIn\fPth word from the end of the previous command. +Once the argument \fIn\fP is computed, the argument is extracted +as if the "!\fIn\fP" history expansion had been specified. +.TP +.B +yank\-last\-arg (M\-.\^, M\-_\^) +Insert the last argument to the previous command (the last word of +the previous history entry). +With a numeric argument, behave exactly like \fByank\-nth\-arg\fP. +Successive calls to \fByank\-last\-arg\fP move back through the history +list, inserting the last word (or the word specified by the argument to +the first call) of each line in turn. +Any numeric argument supplied to these successive calls determines +the direction to move through the history. A negative argument switches +the direction through the history (back or forward). +The history expansion facilities are used to extract the last argument, +as if the "!$" history expansion had been specified. +.PD +.SS Commands for Changing Text +.PD 0 +.TP +.B \fIend\-of\-file\fP (usually C\-d) +The character indicating end-of-file as set, for example, by +.if t \f(CWstty\fP. +.if n ``stty''. +If this character is read when there are no characters +on the line, and point is at the beginning of the line, readline +interprets it as the end of input and returns +.SM +.BR EOF . +.TP +.B delete\-char (C\-d) +Delete the character at point. +If this function is bound to the +same character as the tty \fBEOF\fP character, as \fBC\-d\fP +commonly is, see above for the effects. +.TP +.B backward\-delete\-char (Rubout) +Delete the character behind the cursor. When given a numeric argument, +save the deleted text on the kill ring. +.TP +.B forward\-backward\-delete\-char +Delete the character under the cursor, unless the cursor is at the +end of the line, in which case the character behind the cursor is +deleted. +.TP +.B quoted\-insert (C\-q, C\-v) +Add the next character that you type to the line verbatim. This is +how to insert characters like \fBC\-q\fP, for example. +.TP +.B tab\-insert (M-TAB) +Insert a tab character. +.TP +.B self\-insert (a,\ b,\ A,\ 1,\ !,\ ...) +Insert the character typed. +.TP +.B transpose\-chars (C\-t) +Drag the character before point forward over the character at point, +moving point forward as well. +If point is at the end of the line, then this transposes +the two characters before point. +Negative arguments have no effect. +.TP +.B transpose\-words (M\-t) +Drag the word before point past the word after point, +moving point over that word as well. +If point is at the end of the line, this transposes +the last two words on the line. +.TP +.B upcase\-word (M\-u) +Uppercase the current (or following) word. With a negative argument, +uppercase the previous word, but do not move point. +.TP +.B downcase\-word (M\-l) +Lowercase the current (or following) word. With a negative argument, +lowercase the previous word, but do not move point. +.TP +.B capitalize\-word (M\-c) +Capitalize the current (or following) word. With a negative argument, +capitalize the previous word, but do not move point. +.TP +.B overwrite\-mode +Toggle overwrite mode. With an explicit positive numeric argument, +switches to overwrite mode. With an explicit non-positive numeric +argument, switches to insert mode. This command affects only +\fBemacs\fP mode; \fBvi\fP mode does overwrite differently. +Each call to \fIreadline()\fP starts in insert mode. +In overwrite mode, characters bound to \fBself\-insert\fP replace +the text at point rather than pushing the text to the right. +Characters bound to \fBbackward\-delete\-char\fP replace the character +before point with a space. By default, this command is unbound. +.PD +.SS Killing and Yanking +.PD 0 +.TP +.B kill\-line (C\-k) +Kill the text from point to the end of the line. +.TP +.B backward\-kill\-line (C\-x Rubout) +Kill backward to the beginning of the line. +.TP +.B unix\-line\-discard (C\-u) +Kill backward from point to the beginning of the line. +The killed text is saved on the kill-ring. +.\" There is no real difference between this and backward-kill-line +.TP +.B kill\-whole\-line +Kill all characters on the current line, no matter where point is. +.TP +.B kill\-word (M\-d) +Kill from point the end of the current word, or if between +words, to the end of the next word. Word boundaries are the same as +those used by \fBforward\-word\fP. +.TP +.B backward\-kill\-word (M\-Rubout) +Kill the word behind point. +Word boundaries are the same as those used by \fBbackward\-word\fP. +.TP +.B unix\-word\-rubout (C\-w) +Kill the word behind point, using white space as a word boundary. +The killed text is saved on the kill-ring. +.TP +.B unix\-filename\-rubout +Kill the word behind point, using white space and the slash character +as the word boundaries. +The killed text is saved on the kill-ring. +.TP +.B delete\-horizontal\-space (M\-\e) +Delete all spaces and tabs around point. +.TP +.B kill\-region +Kill the text between the point and \fImark\fP (saved cursor position). +This text is referred to as the \fIregion\fP. +.TP +.B copy\-region\-as\-kill +Copy the text in the region to the kill buffer. +.TP +.B copy\-backward\-word +Copy the word before point to the kill buffer. +The word boundaries are the same as \fBbackward\-word\fP. +.TP +.B copy\-forward\-word +Copy the word following point to the kill buffer. +The word boundaries are the same as \fBforward\-word\fP. +.TP +.B yank (C\-y) +Yank the top of the kill ring into the buffer at point. +.TP +.B yank\-pop (M\-y) +Rotate the kill ring, and yank the new top. Only works following +.B yank +or +.BR yank\-pop . +.PD +.SS Numeric Arguments +.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 +.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. +When displaying completions, readline sets the number of columns used +for display to the value of \fBcompletion-display-width\fP, the value of +the environment variable +.SM +.BR COLUMNS , +or the screen width, in that order. +.TP +.B insert\-completions (M\-*) +Insert all completions of the text before point +that would have been generated by +\fBpossible\-completions\fP. +.TP +.B menu\-complete +Similar to \fBcomplete\fP, but replaces the word to be completed +with a single match from the list of possible completions. +Repeated execution of \fBmenu\-complete\fP steps through the list +of possible completions, inserting each match in turn. +At the end of the list of completions, the bell is rung +(subject to the setting of \fBbell\-style\fP) +and the original text is restored. +An argument of \fIn\fP moves \fIn\fP positions forward in the list +of matches; a negative argument may be used to move backward +through the list. +This command is intended to be bound to \fBTAB\fP, but is unbound +by default. +.TP +.B menu\-complete\-backward +Identical to \fBmenu\-complete\fP, but moves backward through the list +of possible completions, as if \fBmenu\-complete\fP had been given a +negative argument. This command is unbound by default. +.TP +.B delete\-char\-or\-list +Deletes the character under the cursor if not at the beginning or +end of the line (like \fBdelete-char\fP). +If at the end of the line, behaves identically to +\fBpossible-completions\fP. +.PD +.SS Keyboard Macros +.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. +.TP +.B print\-last\-kbd\-macro () +Print the last keyboard macro defined in a format suitable for the +\fIinputrc\fP file. +.PD +.SS Miscellaneous +.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\-lowercase\-version (M\-A, M\-B, M\-\fIx\fP, ...) +If the metafied character \fIx\fP is uppercase, run the command +that is bound to the corresponding metafied lowercase character. +The behavior is undefined if \fIx\fP is already lowercase. +.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\-) +Set the mark to the point. If a +numeric argument is supplied, the mark is set to that position. +.TP +.B exchange\-point\-and\-mark (C\-x C\-x) +Swap the point with the mark. The current cursor position is set to +the saved position, and the old cursor position is saved as the mark. +.TP +.B character\-search (C\-]) +A character is read and point is moved to the next occurrence of that +character. A negative argument 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 argument searches for subsequent occurrences. +.TP +.B skip\-csi\-sequence +Read enough characters to consume a multi-key sequence such as those +defined for keys like Home and End. Such sequences begin with a +Control Sequence Indicator (CSI), usually ESC\-[. If this sequence is +bound to "\e[", keys producing such sequences will have no effect +unless explicitly bound to a readline command, instead of inserting +stray characters into the editing buffer. This is unbound by default, +but usually bound to ESC\-[. +.TP +.B insert\-comment (M\-#) +Without a numeric argument, the value of the readline +.B comment\-begin +variable is inserted at the beginning of the current line. +If a numeric argument is supplied, this command acts as a toggle: if +the characters at the beginning of the line do not match the value +of \fBcomment\-begin\fP, the value is inserted, otherwise +the characters in \fBcomment-begin\fP are deleted from the beginning of +the line. +In either case, the line is accepted as if a newline had been typed. +The default value of +.B comment\-begin +makes the current line a shell comment. +If a numeric argument causes the comment character to be removed, the line +will be executed by the shell. +.TP +.B dump\-functions +Print all of the functions and their key bindings to the +readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an \fIinputrc\fP file. +.TP +.B dump\-variables +Print all of the settable variables and their values to the +readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an \fIinputrc\fP file. +.TP +.B dump\-macros +Print all of the readline key sequences bound to macros and the +strings they output. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an \fIinputrc\fP file. +.TP +.B emacs\-editing\-mode (C\-e) +When in +.B vi +command mode, this causes a switch to +.B emacs +editing mode. +.TP +.B vi\-editing\-mode (M\-C\-j) +When in +.B emacs +editing mode, this causes a switch to +.B vi +editing mode. +.PD +.SH DEFAULT KEY BINDINGS +.LP +The following is a list of the default emacs and vi bindings. +Characters with the eighth bit set are written as M\-, and +are referred to as +.I metafied +characters. +The printable ASCII characters not mentioned in the list of emacs +standard bindings are bound to the +.B self\-insert +function, which just inserts the given character into the input line. +In vi insertion mode, all characters not specifically mentioned are +bound to +.BR self\-insert . +Characters assigned to signal generation by +.IR stty (1) +or the terminal driver, such as C-Z or C-C, +retain that function. +Upper and lower case metafied characters are bound to the same function in +the emacs mode meta keymap. +The remaining characters are unbound, which causes readline +to ring the bell (subject to the setting of the +.B bell\-style +variable). +.SS Emacs Mode +.RS +.6i +.nf +.ta 2.5i +.sp +Emacs Standard bindings +.sp +"C-@" set-mark +"C-A" beginning-of-line +"C-B" backward-char +"C-D" delete-char +"C-E" end-of-line +"C-F" forward-char +"C-G" abort +"C-H" backward-delete-char +"C-I" complete +"C-J" accept-line +"C-K" kill-line +"C-L" clear-screen +"C-M" accept-line +"C-N" next-history +"C-P" previous-history +"C-Q" quoted-insert +"C-R" reverse-search-history +"C-S" forward-search-history +"C-T" transpose-chars +"C-U" unix-line-discard +"C-V" quoted-insert +"C-W" unix-word-rubout +"C-Y" yank +"C-]" character-search +"C-_" undo +"\^ " to "/" self-insert +"0" to "9" self-insert +":" to "~" self-insert +"C-?" backward-delete-char +.PP +Emacs Meta bindings +.sp +"M-C-G" abort +"M-C-H" backward-kill-word +"M-C-I" tab-insert +"M-C-J" vi-editing-mode +"M-C-L" clear-display +"M-C-M" vi-editing-mode +"M-C-R" revert-line +"M-C-Y" yank-nth-arg +"M-C-[" complete +"M-C-]" character-search-backward +"M-space" set-mark +"M-#" insert-comment +"M-&" tilde-expand +"M-*" insert-completions +"M--" digit-argument +"M-." yank-last-arg +"M-0" digit-argument +"M-1" digit-argument +"M-2" digit-argument +"M-3" digit-argument +"M-4" digit-argument +"M-5" digit-argument +"M-6" digit-argument +"M-7" digit-argument +"M-8" digit-argument +"M-9" digit-argument +"M-<" beginning-of-history +"M-=" possible-completions +"M->" end-of-history +"M-?" possible-completions +"M-B" backward-word +"M-C" capitalize-word +"M-D" kill-word +"M-F" forward-word +"M-L" downcase-word +"M-N" non-incremental-forward-search-history +"M-P" non-incremental-reverse-search-history +"M-R" revert-line +"M-T" transpose-words +"M-U" upcase-word +"M-Y" yank-pop +"M-\e" delete-horizontal-space +"M-~" tilde-expand +"M-C-?" backward-kill-word +"M-_" yank-last-arg +.PP +Emacs Control-X bindings +.sp +"C-XC-G" abort +"C-XC-R" re-read-init-file +"C-XC-U" undo +"C-XC-X" exchange-point-and-mark +"C-X(" start-kbd-macro +"C-X)" end-kbd-macro +"C-XE" call-last-kbd-macro +"C-XC-?" backward-kill-line +.sp +.RE +.SS VI Mode bindings +.RS +.6i +.nf +.ta 2.5i +.sp +.PP +VI Insert Mode functions +.sp +"C-D" vi-eof-maybe +"C-H" backward-delete-char +"C-I" complete +"C-J" accept-line +"C-M" accept-line +"C-R" reverse-search-history +"C-S" forward-search-history +"C-T" transpose-chars +"C-U" unix-line-discard +"C-V" quoted-insert +"C-W" unix-word-rubout +"C-Y" yank +"C-[" vi-movement-mode +"C-_" undo +"\^ " to "~" self-insert +"C-?" backward-delete-char +.PP +VI Command Mode functions +.sp +"C-D" vi-eof-maybe +"C-E" emacs-editing-mode +"C-G" abort +"C-H" backward-char +"C-J" accept-line +"C-K" kill-line +"C-L" clear-screen +"C-M" accept-line +"C-N" next-history +"C-P" previous-history +"C-Q" quoted-insert +"C-R" reverse-search-history +"C-S" forward-search-history +"C-T" transpose-chars +"C-U" unix-line-discard +"C-V" quoted-insert +"C-W" unix-word-rubout +"C-Y" yank +"C-_" vi-undo +"\^ " forward-char +"#" insert-comment +"$" end-of-line +"%" vi-match +"&" vi-tilde-expand +"*" vi-complete +"+" next-history +"," vi-char-search +"-" previous-history +"." vi-redo +"/" vi-search +"0" beginning-of-line +"1" to "9" vi-arg-digit +";" vi-char-search +"=" vi-complete +"?" vi-search +"A" vi-append-eol +"B" vi-prev-word +"C" vi-change-to +"D" vi-delete-to +"E" vi-end-word +"F" vi-char-search +"G" vi-fetch-history +"I" vi-insert-beg +"N" vi-search-again +"P" vi-put +"R" vi-replace +"S" vi-subst +"T" vi-char-search +"U" revert-line +"W" vi-next-word +"X" backward-delete-char +"Y" vi-yank-to +"\e" vi-complete +"^" vi-first-print +"_" vi-yank-arg +"`" vi-goto-mark +"a" vi-append-mode +"b" vi-prev-word +"c" vi-change-to +"d" vi-delete-to +"e" vi-end-word +"f" vi-char-search +"h" backward-char +"i" vi-insertion-mode +"j" next-history +"k" prev-history +"l" forward-char +"m" vi-set-mark +"n" vi-search-again +"p" vi-put +"r" vi-change-char +"s" vi-subst +"t" vi-char-search +"u" vi-undo +"w" vi-next-word +"x" vi-delete +"y" vi-yank-to +"|" vi-column +"~" vi-change-case +.RE +.SH "SEE ALSO" +.PD 0 +.TP +\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey +.TP +\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey +.TP +\fIbash\fP(1) +.PD +.SH FILES +.PD 0 +.TP +.FN ~/.inputrc +Individual \fBreadline\fP initialization file +.PD +.SH AUTHORS +Brian Fox, Free Software Foundation +.br +bfox@gnu.org +.PP +Chet Ramey, Case Western Reserve University +.br +chet.ramey@case.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.ramey@case.edu . +.SH BUGS +It's too big and too slow. diff --git a/doc/readline.dvi b/doc/readline.dvi new file mode 100644 index 0000000..7296d40 Binary files /dev/null and b/doc/readline.dvi differ diff --git a/doc/readline.html b/doc/readline.html new file mode 100644 index 0000000..1002f4f --- /dev/null +++ b/doc/readline.html @@ -0,0 +1,6286 @@ + + + + + + +GNU Readline Library + + + + + + + + + + + + + + + + + + +

GNU Readline Library

+ + + + + + + + + +
+ +

GNU Readline Library

+ +

This document describes the GNU Readline Library, a utility which aids +in the consistency of user interface across discrete programs which +provide a command line interface. +The Readline home page is http://www.gnu.org/software/readline/. +

+ + + + + +
+

Table of Contents

+ +
+ + +
+
+
+
+ +

1 Command Line Editing

+ +

This chapter describes the basic features of the GNU +command line editing interface. +

+ + +
+
+ +

1.1 Introduction to Line Editing

+ +

The following paragraphs describe the notation used to represent +keystrokes. +

+

The text C-k is read as ‘Control-K’ and describes the character +produced when the k key is pressed while the Control key +is depressed. +

+

The text M-k is read as ‘Meta-K’ and describes the character +produced when the Meta key (if you have one) is depressed, and the k +key is pressed. +The Meta key is labeled ALT on many keyboards. +On keyboards with two keys labeled ALT (usually to either side of +the space bar), the ALT on the left side is generally set to +work as a Meta key. +The ALT key on the right may also be configured to work as a +Meta key or may be configured as some other modifier, such as a +Compose key for typing accented characters. +

+

If you do not have a Meta or ALT key, or another key working as +a Meta key, the identical keystroke can be generated by typing ESC +first, and then typing k. +Either process is known as metafying the k key. +

+

The text M-C-k is read as ‘Meta-Control-k’ and describes the +character produced by metafying C-k. +

+

In addition, several keys have their own names. Specifically, +DEL, ESC, LFD, SPC, RET, and TAB all +stand for themselves when seen in this text, or in an init file +(see 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. +

+
+
+
+ +

1.2 Readline Interaction

+ + +

Often during an interactive session you type in a long line of text, +only to notice that the first word on the line is misspelled. The +Readline library gives you a set of commands for manipulating the text +as you type it in, allowing you to just fix your typo, and not forcing +you to retype the majority of the line. Using these editing commands, +you move the cursor to the place that needs correction, and delete or +insert the text of the corrections. Then, when you are satisfied with +the line, you simply press RET. You do not have to be at the +end of the line to press RET; the entire line is accepted +regardless of the location of the cursor within the line. +

+ + +
+
+ +

1.2.1 Readline Bare Essentials

+ + + + +

In order to enter characters into the line, simply type them. The typed +character appears where the cursor was, and then the cursor moves one +space to the right. If you mistype a character, you can use your +erase character to back up and delete the mistyped character. +

+

Sometimes you may mistype a character, and +not notice the error until you have typed several other characters. In +that case, you can type C-b to move the cursor to the left, and then +correct your mistake. Afterwards, you can move the cursor to the right +with C-f. +

+

When you add text in the middle of a line, you will notice that characters +to the right of the cursor are ‘pushed over’ to make room for the text +that you have inserted. Likewise, when you delete text behind the cursor, +characters to the right of the cursor are ‘pulled back’ to fill in the +blank space created by the removal of the text. A list of the bare +essentials for editing the text of an input line follows. +

+
+
C-b
+

Move back one character. +

+
C-f
+

Move forward one character. +

+
DEL or Backspace
+

Delete the character to the left of the cursor. +

+
C-d
+

Delete the character underneath the cursor. +

+
Printing characters
+

Insert the character into the line at the cursor. +

+
C-_ or C-x C-u
+

Undo the last editing command. You can undo all the way back to an +empty line. +

+
+ +

(Depending on your configuration, the Backspace key might 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.) +

+
+
+
+ +

1.2.2 Readline Movement Commands

+ + +

The above table describes the most basic keystrokes that you need +in order to do editing of the input line. For your convenience, many +other commands have been added in addition to C-b, C-f, +C-d, and DEL. Here are some commands for moving more rapidly +about the line. +

+
+
C-a
+

Move to the start of the line. +

+
C-e
+

Move to the end of the line. +

+
M-f
+

Move forward a word, where a word is composed of letters and digits. +

+
M-b
+

Move backward a word. +

+
C-l
+

Clear the screen, reprinting the current line at the top. +

+
+ +

Notice how C-f moves forward a character, while M-f moves +forward a word. It is a loose convention that control keystrokes +operate on characters while meta keystrokes operate on words. +

+
+
+
+ +

1.2.3 Readline Killing Commands

+ + + + +

Killing text means to delete the text from the line, but to save +it away for later use, usually by yanking (re-inserting) +it back into the line. +(‘Cut’ and ‘paste’ are more recent jargon for ‘kill’ and ‘yank’.) +

+

If the description for a command says that it ‘kills’ text, then you can +be sure that you can get the text back in a different (or the same) +place later. +

+

When you use a kill command, the text is saved in a kill-ring. +Any number of consecutive kills save all of the killed text together, so +that when you yank it back, you get it all. The kill +ring is not line specific; the text that you killed on a previously +typed line is available to be yanked back later, when you are typing +another line. + +

+

Here is the list of commands for killing text. +

+
+
C-k
+

Kill the text from the current cursor position to the end of the line. +

+
+
M-d
+

Kill from the cursor to the end of the current word, or, if between +words, to the end of the next word. +Word boundaries are the same as those used by M-f. +

+
+
M-DEL
+

Kill from the cursor to the start of the current word, or, if between +words, to the start of the previous word. +Word boundaries are the same as those used by M-b. +

+
+
C-w
+

Kill from the cursor to the previous whitespace. This is different than +M-DEL because the word boundaries differ. +

+
+
+ +

Here is how to yank the text back into the line. Yanking +means to copy the most-recently-killed text from the kill buffer. +

+
+
C-y
+

Yank the most recently killed text back into the buffer at the cursor. +

+
+
M-y
+

Rotate the kill-ring, and yank the new top. You can only do this if +the prior command is C-y or M-y. +

+
+ +
+
+
+ +

1.2.4 Readline Arguments

+ +

You can pass numeric arguments to Readline commands. Sometimes the +argument acts as a repeat count, other times it is the sign of the +argument that is significant. If you pass a negative argument to a +command which normally acts in a forward direction, that command will +act in a backward direction. For example, to kill text back to the +start of the line, you might type ‘M-- C-k’. +

+

The general way to pass numeric arguments to a command is to type meta +digits before the command. If the first ‘digit’ typed is a minus +sign (‘-’), then the sign of the argument will be negative. Once +you have typed one meta digit to get the argument started, you can type +the remainder of the digits, and then the command. For example, to give +the C-d command an argument of 10, you could type ‘M-1 0 C-d’, +which will delete the next ten characters on the input line. +

+
+
+
+ +

1.2.5 Searching for Commands in the History

+ +

Readline provides commands for searching through the command history +for lines containing a specified string. +There are two search modes: incremental and non-incremental. +

+

Incremental searches begin before the user has finished typing the +search string. +As each character of the search string is typed, Readline displays +the next entry from the history matching the string typed so far. +An incremental search requires only as many characters as needed to +find the desired history entry. +To search backward in the history for a particular string, type +C-r. Typing C-s searches forward through the history. +The characters present in the value of the isearch-terminators variable +are used to terminate an incremental search. +If that variable has not been assigned a value, the ESC and +C-J characters will terminate an incremental search. +C-g will abort an incremental search and restore the original line. +When the search is terminated, the history entry containing the +search string becomes the current line. +

+

To find other matching entries in the history list, type C-r or +C-s as appropriate. +This will search backward or forward in the history for the next +entry matching the search string typed so far. +Any other key sequence bound to a Readline command will terminate +the search and execute that command. +For instance, a RET will terminate the search and accept +the line, thereby executing the command from the history list. +A movement command will terminate the search, make the last line found +the current line, and begin editing. +

+

Readline remembers the last incremental search string. If two +C-rs are typed without any intervening characters defining a new +search string, any remembered search string is used. +

+

Non-incremental searches read the entire search string before starting +to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. +

+
+
+
+
+ +

1.3 Readline Init File

+ + +

Although the Readline library comes with a set of Emacs-like +keybindings installed by default, it is possible to use a different set +of keybindings. +Any user can customize programs that use Readline by putting +commands in an inputrc file, +conventionally in their home directory. +The name of this +file is taken from the value of the environment variable INPUTRC. If +that variable is unset, the default is ~/.inputrc. If that +file does not exist or cannot be read, the ultimate default is +/etc/inputrc. +

+

When a program which uses the Readline library starts up, the +init file is read, and the key bindings are set. +

+

In addition, the C-x C-r command re-reads this init file, thus +incorporating any changes that you might have made to it. +

+ + +
+
+ +

1.3.1 Readline Init File Syntax

+ +

There are only a few basic constructs allowed in the +Readline init file. Blank lines are ignored. +Lines beginning with a ‘#’ are comments. +Lines beginning with a ‘$’ indicate conditional +constructs (see Conditional Init Constructs). Other lines +denote variable settings and key bindings. +

+
+
Variable Settings
+

You can modify the run-time behavior of Readline by +altering the values of variables in Readline +using the set command within the init file. +The syntax is simple: +

+
+
set variable value
+
+ +

Here, for example, is how to +change from the default Emacs-like key binding to use +vi line editing commands: +

+
+
set editing-mode vi
+
+ +

Variable names and values, where appropriate, are recognized without regard +to case. Unrecognized variable names are ignored. +

+

Boolean variables (those that can be set to on or off) are set to on if +the value is null or empty, on (case-insensitive), or 1. Any other +value results in the variable being set to off. +

+ +

A great deal of run-time behavior is changeable with the following +variables. +

+ +
+
active-region-start-color
+

A string variable that controls the text color and background when displaying +the text in the active region (see the description of +enable-active-region below). +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal before displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that puts the terminal in standout mode, +as obtained from the terminal’s terminfo description. +A sample value might be ‘\e[01;33m’. +

+
+
active-region-end-color
+

A string variable that "undoes" the effects of active-region-start-color +and restores "normal" terminal display appearance after displaying text +in the active region. +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal after displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that restores the terminal from standout mode, +as obtained from the terminal’s terminfo description. +A sample value might be ‘\e[0m’. +

+
+
bell-style
+

Controls what happens when Readline wants to ring the terminal bell. +If set to ‘none’, Readline never rings the bell. If set to +‘visible’, Readline uses a visible bell if one is available. +If set to ‘audible’ (the default), Readline attempts to ring +the terminal’s bell. +

+
+
bind-tty-special-chars
+

If set to ‘on’ (the default), Readline attempts to bind the control +characters treated specially by the kernel’s terminal driver to their +Readline equivalents. +

+
+ +

If set to ‘on’, Readline attempts to briefly move the cursor to an +opening parenthesis when a closing parenthesis is inserted. The default +is ‘off’. +

+
+
colored-completion-prefix
+

If set to ‘on’, when listing completions, Readline displays the +common prefix of the set of possible completions using a different color. +The color definitions are taken from the value of the LS_COLORS +environment variable. +If there is a color definition in LS_COLORS for the custom suffix +‘readline-colored-completion-prefix’, Readline uses this color for +the common prefix instead of its default. +The default is ‘off’. +

+
+
colored-stats
+

If set to ‘on’, Readline displays possible completions using different +colors to indicate their file type. +The color definitions are taken from the value of the LS_COLORS +environment variable. +The default is ‘off’. +

+
+
comment-begin
+

The string to insert at the beginning of the line when the +insert-comment command is executed. The default value +is "#". +

+
+
completion-display-width
+

The number of screen columns used to display possible matches +when performing completion. +The value is ignored if it is less than 0 or greater than the terminal +screen width. +A value of 0 will cause matches to be displayed one per line. +The default value is -1. +

+
+
completion-ignore-case
+

If set to ‘on’, Readline performs filename matching and completion +in a case-insensitive fashion. +The default value is ‘off’. +

+
+
completion-map-case
+

If set to ‘on’, and completion-ignore-case is enabled, Readline +treats hyphens (‘-’) and underscores (‘_’) as equivalent when +performing case-insensitive filename matching and completion. +The default value is ‘off’. +

+
+
completion-prefix-display-length
+

The length in characters of the common prefix of a list of possible +completions that is displayed without modification. When set to a +value greater than zero, common prefixes longer than this value are +replaced with an ellipsis when displaying possible completions. +

+
+
completion-query-items
+

The number of possible completions that determines when the user is +asked whether the list of possibilities should be displayed. +If the number of possible completions is greater than or equal to this value, +Readline will ask whether or not the user wishes to view them; +otherwise, they are simply listed. +This variable must be set to an integer value greater than or equal to zero. +A zero value means Readline should never ask; negative values are +treated as zero. +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’, but +will be set to ‘off’ if the locale is one that contains +eight-bit characters. +This variable is dependent on the LC_CTYPE locale category, and +may change if the locale is changed. +

+
+
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’. +

+
+
echo-control-characters
+

When set to ‘on’, on operating systems that indicate they support it, +Readline echoes a character corresponding to a signal generated from the +keyboard. The default is ‘on’. +

+
+
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’. +

+
+
emacs-mode-string
+

If the show-mode-in-prompt variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when emacs editing mode is active. The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the ‘\1’ and ‘\2’ escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is ‘@’. +

+
+
enable-active-region
+

The point is the current cursor position, and mark refers +to a saved cursor position (see Commands For Moving). +The text between the point and mark is referred to as the region. +When this variable is set to ‘On’, Readline allows certain commands +to designate the region as active. +When the region is active, Readline highlights the text in the region using +the value of the active-region-start-color, which defaults to the +string that enables +the terminal’s standout mode. +The active region shows the text inserted by bracketed-paste and any +matching text found by incremental and non-incremental history searches. +The default is ‘On’. +

+
+
enable-bracketed-paste
+

When set to ‘On’, Readline configures the terminal to insert each +paste into the editing buffer as a single string of characters, instead +of treating each character as if it had been read from the keyboard. +This is called putting the terminal into bracketed paste mode; +it prevents Readline from executing any editing commands bound to key +sequences appearing in the pasted text. +The default is ‘On’. +

+
+
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’. +

+
+
enable-meta-key
+

When set to ‘on’, Readline will try to enable any meta modifier +key the terminal claims to support when it is called. On many terminals, +the meta key is used to send eight-bit characters. +The default is ‘on’. +

+
+
expand-tilde
+

If set to ‘on’, tilde expansion is performed when Readline +attempts word completion. The default is ‘off’. +

+
+
history-preserve-point
+

If set to ‘on’, the history code attempts to place the point (the +current cursor position) at the +same location on each history line retrieved with previous-history +or next-history. The default is ‘off’. +

+
+
history-size
+

Set the maximum number of history entries saved in the history list. +If set to zero, any existing history entries are deleted and no new entries +are saved. +If set to a value less than zero, the number of history entries is not +limited. +By default, the number of history entries is not limited. +If an attempt is made to set history-size to a non-numeric value, +the maximum number of history entries will be set to 500. +

+
+
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. +This variable is automatically set to ‘on’ for terminals of height 1. +By default, this variable is set to ‘off’. +

+
+
input-meta
+
+

If set to ‘on’, Readline will enable eight-bit input (it +will not clear the eighth bit in the characters it reads), +regardless of what the terminal claims it can support. The +default value is ‘off’, but Readline will set it to ‘on’ if the +locale contains eight-bit characters. +The name meta-flag is a synonym for this variable. +This variable is dependent on the LC_CTYPE locale category, and +may change if the locale is changed. +

+
+
isearch-terminators
+

The string of characters that should terminate an incremental search without +subsequently executing the character as a command (see Searching for Commands in the History). +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. +Built-in keymap names are +emacs, +emacs-standard, +emacs-meta, +emacs-ctlx, +vi, +vi-move, +vi-command, and +vi-insert. +vi is equivalent to vi-command (vi-move is also a +synonym); emacs is equivalent to emacs-standard. +Applications may add additional names. +The default value is emacs. +The value of the editing-mode variable also affects the +default keymap. +

+
+
keyseq-timeout
+

Specifies the duration Readline will wait for a character when reading an +ambiguous key sequence (one that can form a complete key sequence using +the input read so far, or can take additional input to complete a longer +key sequence). +If no input is received within the timeout, Readline will use the shorter +but complete key sequence. +Readline uses this value to determine whether or not input is +available on the current input source (rl_instream by default). +The value is specified in milliseconds, so a value of 1000 means that +Readline will wait one second for additional input. +If this variable is set to a value less than or equal to zero, or to a +non-numeric value, Readline will wait until another key is pressed to +decide which key sequence to complete. +The default value is 500. +

+
+
mark-directories
+

If set to ‘on’, completed directory names have a slash +appended. The default is ‘on’. +

+
+
mark-modified-lines
+

This variable, when set to ‘on’, causes Readline to display an +asterisk (‘*’) at the start of history lines which have been modified. +This variable is ‘off’ by default. +

+
+
mark-symlinked-directories
+

If set to ‘on’, completed names which are symbolic links +to directories have a slash appended (subject to the value of +mark-directories). +The default is ‘off’. +

+
+
match-hidden-files
+

This variable, when set to ‘on’, causes Readline to match files whose +names begin with a ‘.’ (hidden files) when performing filename +completion. +If set to ‘off’, the leading ‘.’ must be +supplied by the user in the filename to be completed. +This variable is ‘on’ by default. +

+
+
menu-complete-display-prefix
+

If set to ‘on’, menu completion displays the common prefix of the +list of possible completions (which may be empty) before cycling through +the list. The default is ‘off’. +

+
+
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’, but Readline will set it to ‘on’ if the +locale contains eight-bit characters. +This variable is dependent on the LC_CTYPE locale category, and +may change if the locale is changed. +

+
+
page-completions
+

If set to ‘on’, Readline uses an internal more-like pager +to display a screenful of possible completions at a time. +This variable is ‘on’ by default. +

+
+
print-completions-horizontally
+

If set to ‘on’, Readline will display completions with matches +sorted horizontally in alphabetical order, rather than down the screen. +The default is ‘off’. +

+
+
revert-all-at-newline
+

If set to ‘on’, Readline will undo all changes to history lines +before returning when accept-line is executed. By default, +history lines may be modified and retain individual undo lists across +calls to readline(). The default is ‘off’. +

+
+
show-all-if-ambiguous
+

This alters the default behavior of the completion functions. If +set to ‘on’, +words which have more than one possible completion cause the +matches to be listed immediately instead of ringing the bell. +The default value is ‘off’. +

+
+
show-all-if-unmodified
+

This alters the default behavior of the completion functions in +a fashion similar to show-all-if-ambiguous. +If set to ‘on’, +words which have more than one possible completion without any +possible partial completion (the possible completions don’t share +a common prefix) cause the matches to be listed immediately instead +of ringing the bell. +The default value is ‘off’. +

+
+
show-mode-in-prompt
+

If set to ‘on’, add a string to the beginning of the prompt +indicating the editing mode: emacs, vi command, or vi insertion. +The mode strings are user-settable (e.g., emacs-mode-string). +The default value is ‘off’. +

+
+
skip-completed-text
+

If set to ‘on’, this alters the default completion behavior when +inserting a single match into the line. It’s only active when +performing completion in the middle of a word. If enabled, Readline +does not insert characters from the completion that match characters +after point in the word being completed, so portions of the word +following the cursor are not duplicated. +For instance, if this is enabled, attempting completion when the cursor +is after the ‘e’ in ‘Makefile’ will result in ‘Makefile’ +rather than ‘Makefilefile’, assuming there is a single possible +completion. +The default value is ‘off’. +

+
+
vi-cmd-mode-string
+

If the show-mode-in-prompt variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in command mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the ‘\1’ and ‘\2’ escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is ‘(cmd)’. +

+
+
vi-ins-mode-string
+

If the show-mode-in-prompt variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in insertion mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the ‘\1’ and ‘\2’ escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is ‘(ins)’. +

+
+
visible-stats
+

If set to ‘on’, a character denoting a file’s type +is appended to the filename when listing possible +completions. The default is ‘off’. +

+
+
+ +
+
Key Bindings
+

The syntax for controlling key bindings in the init file is +simple. First you need to find the name of the command that you +want to change. The following sections contain tables of the command +name, the default keybinding, if any, and a short description of what +the command does. +

+

Once you know the name of the command, simply place on a line +in the init file the name of the key +you wish to bind the command to, a colon, and then the name of the +command. +There can be no space between the key name and the colon – that will be +interpreted as part of the key name. +The name of the key can be expressed in different ways, depending on +what you find most comfortable. +

+

In addition to command names, Readline allows keys to be bound +to a string that is inserted when the key is pressed (a macro). +

+ +
+
keynamefunction-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 example above, C-u is bound to the function +universal-argument, +M-DEL is bound to the function backward-kill-word, and +C-o is bound to run the macro +expressed on the right hand side (that is, to insert the text +‘> output’ into the line). +

+

A number of symbolic character names are recognized while +processing this key binding syntax: +DEL, +ESC, +ESCAPE, +LFD, +NEWLINE, +RET, +RETURN, +RUBOUT, +SPACE, +SPC, +and +TAB. +

+
+
"keyseq": function-name or macro
+

keyseq differs from keyname above in that strings +denoting an entire key sequence can be specified, by placing +the key sequence in double quotes. Some GNU Emacs style key +escapes can be used, as in the following example, but the +special character names are not recognized. +

+
+
"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+
+ +

In the above example, C-u is again bound to the function +universal-argument (just as it was in the first example), +‘C-x C-r’ is bound to the function re-read-init-file, +and ‘ESC [ 1 1 ~’ is bound to insert +the text ‘Function Key 1’. +

+
+
+ +

The following GNU Emacs style escape sequences are available when +specifying key sequences: +

+
+
\C-
+

control prefix +

+
\M-
+

meta prefix +

+
\e
+

an escape character +

+
\\
+

backslash +

+
\"
+

", a double quotation mark +

+
\'
+

', a single quote or apostrophe +

+
+ +

In addition to the GNU Emacs style escape sequences, a second +set of backslash escapes is available: +

+
+
\a
+

alert (bell) +

+
\b
+

backspace +

+
\d
+

delete +

+
\f
+

form feed +

+
\n
+

newline +

+
\r
+

carriage return +

+
\t
+

horizontal tab +

+
\v
+

vertical tab +

+
\nnn
+

the eight-bit character whose value is the octal value nnn +(one to three digits) +

+
\xHH
+

the eight-bit character whose value is the hexadecimal value HH +(one or two hex digits) +

+
+ +

When entering the text of a macro, single or double quotes must +be used to indicate a macro definition. +Unquoted text is assumed to be a function name. +In the macro body, the backslash escapes described above are expanded. +Backslash will quote any other character in the macro text, +including ‘"’ and ‘'’. +For example, the following binding will make ‘C-x \’ +insert a single ‘\’ into the line: +

+
"\C-x\\": "\\"
+
+ +
+
+ +
+
+
+ +

1.3.2 Conditional Init Constructs

+ +

Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key +bindings and variable settings to be performed as the result +of tests. There are four parser directives used. +

+
+
$if
+

The $if construct allows bindings to be made based on the +editing mode, the terminal being used, or the application using +Readline. The text of the test, after any comparison operator, +extends to the end of the line; +unless otherwise noted, 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. +

+
+
version
+

The version test may be used to perform comparisons against +specific Readline versions. +The version expands to the current Readline version. +The set of comparison operators includes +‘=’ (and ‘==’), ‘!=’, ‘<=’, ‘>=’, ‘<’, +and ‘>’. +The version number supplied on the right side of the operator consists +of a major version number, an optional decimal point, and an optional +minor version (e.g., ‘7.1’). If the minor version is omitted, it +is assumed to be ‘0’. +The operator may be separated from the string version and +from the version number argument by whitespace. +The following example sets a variable if the Readline version being used +is 7.0 or newer: +

+
$if version >= 7.0
+set show-mode-in-prompt on
+$endif
+
+ +
+
application
+

The application construct is used to include +application-specific settings. Each program using the Readline +library sets the application name, and you can test for +a particular value. +This could be used to bind key sequences to functions useful for +a specific program. For instance, the following command adds a +key sequence that quotes the current or previous word in Bash: +

+
$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+
+ +
+
variable
+

The variable construct provides simple equality tests for Readline +variables and values. +The permitted comparison operators are ‘=’, ‘==’, and ‘!=’. +The variable name must be separated from the comparison operator by +whitespace; the operator may be separated from the value on the right hand +side by whitespace. +Both string and boolean variables may be tested. Boolean variables must be +tested against the values on and off. +The following example is equivalent to the mode=emacs test described +above: +

+
$if editing-mode == emacs
+set show-mode-in-prompt on
+$endif
+
+
+
+ +
+
$endif
+

This command, as seen in the previous example, terminates an +$if command. +

+
+
$else
+

Commands in this branch of the $if directive are executed if +the test fails. +

+
+
$include
+

This directive takes a single filename as an argument and reads commands +and bindings from that file. +For example, the following directive reads from /etc/inputrc: +

+
$include /etc/inputrc
+
+
+
+ +
+
+
+ +

1.3.3 Sample Init File

+ +

Here is an example of an inputrc file. This illustrates key +binding, variable assignment, and conditional syntax. +

+
+
# This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any system-wide 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 150 or more possible completions for a word,
+# ask whether or not the user 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
+
+ +
+
+
+
+ +

1.4 Bindable Readline 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. +

+ +
+
+ +

1.4.1 Commands For Moving

+
+
beginning-of-line (C-a)
+

Move to the start of the current line. +

+
+
end-of-line (C-e)
+

Move to the end of the line. +

+
+
forward-char (C-f)
+

Move forward a character. +

+
+
backward-char (C-b)
+

Move back a character. +

+
+
forward-word (M-f)
+

Move forward to the end of the next word. +Words are composed of letters and digits. +

+
+
backward-word (M-b)
+

Move back to the start of the current or previous word. +Words are composed of letters and digits. +

+ +
+
previous-screen-line ()
+

Attempt to move point to the same physical screen column on the previous +physical screen line. This will not have the desired effect if the current +Readline line does not take up more than one physical line or if point is not +greater than the length of the prompt plus the screen width. +

+
+
next-screen-line ()
+

Attempt to move point to the same physical screen column on the next +physical screen line. This will not have the desired effect if the current +Readline line does not take up more than one physical line or if the length +of the current Readline line is not greater than the length of the prompt +plus the screen width. +

+
+
clear-display (M-C-l)
+

Clear the screen and, if possible, the terminal’s scrollback buffer, +then redraw the current line, +leaving the current line at the top of the screen. +

+
+
clear-screen (C-l)
+

Clear the screen, +then 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. +

+
+
+ +
+
+
+ +

1.4.2 Commands For Manipulating The History

+ +
+
accept-line (Newline or Return)
+

Accept the line regardless of where the cursor is. +If this line is +non-empty, it may be added to the history list for future recall with +add_history(). +If this line is a modified history line, the history line is restored +to its original state. +

+
+
previous-history (C-p)
+

Move ‘back’ through the history list, fetching the previous command. +

+
+
next-history (C-n)
+

Move ‘forward’ through the history list, fetching the next command. +

+
+
beginning-of-history (M-<)
+

Move to the first line in the history. +

+
+
end-of-history (M->)
+

Move to the end of the input history, i.e., the line currently +being entered. +

+
+
reverse-search-history (C-r)
+

Search backward starting at the current line and moving ‘up’ through +the history as necessary. This is an incremental search. +This command sets the region to the matched text and activates the mark. +

+
+
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. +This command sets the region to the matched text and activates the mark. +

+
+
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. +The search string may match anywhere in a history line. +

+
+
non-incremental-forward-search-history (M-n)
+

Search forward starting at the current line and moving ‘down’ +through the history as necessary using a non-incremental search +for a string supplied by the user. +The search string may match anywhere in a history line. +

+
+
history-search-forward ()
+

Search forward through the history for the string of characters +between the start of the current line and the point. +The search string must match at the beginning of a history line. +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. +The search string must match at the beginning of a history line. +This is a non-incremental search. +By default, this command is unbound. +

+
+
history-substring-search-forward ()
+

Search forward through the history for the string of characters +between the start of the current line and the point. +The search string may match anywhere in a history line. +This is a non-incremental search. +By default, this command is unbound. +

+
+
history-substring-search-backward ()
+

Search backward through the history for the string of characters +between the start of the current line and the point. +The search string may match anywhere in a history line. +This is a non-incremental search. +By default, this command is unbound. +

+
+
yank-nth-arg (M-C-y)
+

Insert the first argument to the previous command (usually +the second word on the previous line) at point. +With an argument n, +insert the nth word from the previous command (the words +in the previous command begin with word 0). A negative argument +inserts the nth word from the end of the previous command. +Once the argument n is computed, the argument is extracted +as if the ‘!n’ history expansion had been specified. +

+
+
yank-last-arg (M-. or M-_)
+

Insert last argument to the previous command (the last word of the +previous history entry). +With a numeric argument, behave exactly like yank-nth-arg. +Successive calls to yank-last-arg move back through the history +list, inserting the last word (or the word specified by the argument to +the first call) of each line in turn. +Any numeric argument supplied to these successive calls determines +the direction to move through the history. A negative argument switches +the direction through the history (back or forward). +The history expansion facilities are used to extract the last argument, +as if the ‘!$’ history expansion had been specified. +

+
+
operate-and-get-next (C-o)
+

Accept the current line for return to the calling application as if a +newline had been entered, +and fetch the next line relative to the current line from the history +for editing. +A numeric argument, if supplied, specifies the history entry to use instead +of the current line. +

+
+
fetch-history ()
+

With a numeric argument, fetch that entry from the history list +and make it the current line. +Without an argument, move back to the first entry in the history list. +

+
+
+ +
+
+
+ +

1.4.3 Commands For Changing Text

+ +
+
end-of-file (usually C-d)
+

The character indicating end-of-file as set, for example, by +stty. If this character is read when there are no characters +on the line, and point is at the beginning of the line, Readline +interprets it as the end of input and returns EOF. +

+
+
delete-char (C-d)
+

Delete the character at point. If this function is bound to the +same character as the tty EOF character, as C-d +commonly is, see above for the effects. +

+
+
backward-delete-char (Rubout)
+

Delete the character behind the cursor. A numeric argument means +to kill the characters instead of deleting them. +

+
+
forward-backward-delete-char ()
+

Delete the character under the cursor, unless the cursor is at the +end of the line, in which case the character behind the cursor is +deleted. By default, this is not bound to a key. +

+
+
quoted-insert (C-q or C-v)
+

Add the next character typed to the line verbatim. This is +how to insert key sequences like C-q, for example. +

+
+
tab-insert (M-TAB)
+

Insert a tab character. +

+
+
self-insert (a, b, A, 1, !, …)
+

Insert yourself. +

+
+
bracketed-paste-begin ()
+

This function is intended to be bound to the "bracketed paste" escape +sequence sent by some terminals, and such a binding is assigned by default. +It allows Readline to insert the pasted text as a single unit without treating +each character as if it had been read from the keyboard. The characters +are inserted as if each one was bound to self-insert instead of +executing any editing commands. +

+

Bracketed paste sets the region (the characters between point and the mark) +to the inserted text. It uses the concept of an active mark: when the +mark is active, Readline redisplay uses the terminal’s standout mode to +denote the region. +

+
+
transpose-chars (C-t)
+

Drag the character before the cursor forward over +the character at the cursor, moving the +cursor forward as well. If the insertion point +is at the end of the line, then this +transposes the last two characters of the line. +Negative arguments have no effect. +

+
+
transpose-words (M-t)
+

Drag the word before point past the word after point, +moving point past that word as well. +If the insertion point is at the end of the line, this transposes +the last two words on the line. +

+
+
upcase-word (M-u)
+

Uppercase the current (or following) word. With a negative argument, +uppercase the previous word, but do not move the cursor. +

+
+
downcase-word (M-l)
+

Lowercase the current (or following) word. With a negative argument, +lowercase the previous word, but do not move the cursor. +

+
+
capitalize-word (M-c)
+

Capitalize the current (or following) word. With a negative argument, +capitalize the previous word, but do not move the cursor. +

+
+
overwrite-mode ()
+

Toggle overwrite mode. With an explicit positive numeric argument, +switches to overwrite mode. With an explicit non-positive numeric +argument, switches to insert mode. This command affects only +emacs mode; vi mode does overwrite differently. +Each call to readline() starts in insert mode. +

+

In overwrite mode, characters bound to self-insert replace +the text at point rather than pushing the text to the right. +Characters bound to backward-delete-char replace the character +before point with a space. +

+

By default, this command is unbound. +

+
+
+ +
+
+
+ +

1.4.4 Killing And Yanking

+ +
+
kill-line (C-k)
+

Kill the text from point to the end of the line. +With a negative numeric argument, kill backward from the cursor to the +beginning of the current line. +

+
+
backward-kill-line (C-x Rubout)
+

Kill backward from the cursor to the beginning of the current line. +With a negative numeric argument, kill forward from the cursor to the +end of the current line. +

+
+
unix-line-discard (C-u)
+

Kill backward from the cursor to the beginning of the current line. +

+
+
kill-whole-line ()
+

Kill all characters on the current line, no matter where point is. +By default, this is unbound. +

+
+
kill-word (M-d)
+

Kill from point to the end of the current word, or if between +words, to the end of the next word. +Word boundaries are the same as forward-word. +

+
+
backward-kill-word (M-DEL)
+

Kill the word behind point. +Word boundaries are the same as backward-word. +

+ +
+
shell-transpose-words (M-C-t)
+

Drag the word before point past the word after point, +moving point past that word as well. +If the insertion point is at the end of the line, this transposes +the last two words on the line. +Word boundaries are the same as shell-forward-word and +shell-backward-word. +

+
+
unix-word-rubout (C-w)
+

Kill the word behind point, using white space as a word boundary. +The killed text is saved on the kill-ring. +

+
+
unix-filename-rubout ()
+

Kill the word behind point, using white space and the slash character +as the word boundaries. +The killed text is saved on the kill-ring. +

+
+
delete-horizontal-space ()
+

Delete all spaces and tabs around point. By default, this is unbound. +

+
+
kill-region ()
+

Kill the text in the current region. +By default, this command is unbound. +

+
+
copy-region-as-kill ()
+

Copy the text in the region to the kill buffer, so it can be yanked +right away. By default, this command is unbound. +

+
+
copy-backward-word ()
+

Copy the word before point to the kill buffer. +The word boundaries are the same as backward-word. +By default, this command is unbound. +

+
+
copy-forward-word ()
+

Copy the word following point to the kill buffer. +The word boundaries are the same as forward-word. +By default, this command is unbound. +

+
+
yank (C-y)
+

Yank the top of the kill ring into the buffer at point. +

+
+
yank-pop (M-y)
+

Rotate the kill-ring, and yank the new top. You can only do this if +the prior command is yank or yank-pop. +

+
+ +
+
+
+ +

1.4.5 Specifying Numeric Arguments

+
+
digit-argument (M-0, M-1, … M--)
+

Add this digit to the argument already accumulating, or start a new +argument. M-- starts a negative argument. +

+
+
universal-argument ()
+

This is another way to specify an argument. +If this command is followed by one or more digits, optionally with a +leading minus sign, those digits define the argument. +If the command is followed by digits, executing universal-argument +again ends the numeric argument, but is otherwise ignored. +As a special case, if this command is immediately followed by a +character that is neither a digit nor 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. +

+
+ +
+
+
+ +

1.4.6 Letting Readline Type For You

+ +
+
complete (TAB)
+

Attempt to perform completion on the text before point. +The actual completion performed is application-specific. +The default is filename completion. +

+
+
possible-completions (M-?)
+

List the possible completions of the text before point. +When displaying completions, Readline sets the number of columns used +for display to the value of completion-display-width, the value of +the environment variable COLUMNS, or the screen width, in that order. +

+
+
insert-completions (M-*)
+

Insert all completions of the text before point that would have +been generated by possible-completions. +

+
+
menu-complete ()
+

Similar to complete, but replaces the word to be completed +with a single match from the list of possible completions. +Repeated execution of menu-complete steps through the list +of possible completions, inserting each match in turn. +At the end of the list of completions, the bell is rung +(subject to the setting of bell-style) +and the original text is restored. +An argument of n moves n positions forward in the list +of matches; a negative argument may be used to move backward +through the list. +This command is intended to be bound to TAB, but is unbound +by default. +

+
+
menu-complete-backward ()
+

Identical to menu-complete, but moves backward through the list +of possible completions, as if menu-complete had been given a +negative argument. +

+
+
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. +

+
+
+ +
+
+
+ +

1.4.7 Keyboard Macros

+
+
start-kbd-macro (C-x ()
+

Begin saving the characters typed into the current keyboard macro. +

+
+
end-kbd-macro (C-x ))
+

Stop saving the characters typed into the current keyboard macro +and save the definition. +

+
+
call-last-kbd-macro (C-x e)
+

Re-execute the last keyboard macro defined, by making the characters +in the macro appear as if typed at the keyboard. +

+
+
print-last-kbd-macro ()
+

Print the last keyboard macro defined in a format suitable for the +inputrc file. +

+
+
+ +
+
+
+ +

1.4.8 Some Miscellaneous Commands

+
+
re-read-init-file (C-x C-r)
+

Read in the contents of the inputrc file, and incorporate +any bindings or variable assignments found there. +

+
+
abort (C-g)
+

Abort the current editing command and +ring the terminal’s bell (subject to the setting of +bell-style). +

+
+
do-lowercase-version (M-A, M-B, M-x, …)
+

If the metafied character x is upper case, run the command +that is bound to the corresponding metafied lower case character. +The behavior is undefined if x is already lower case. +

+
+
prefix-meta (ESC)
+

Metafy the next character typed. This is for keyboards +without a meta key. Typing ‘ESC f’ is equivalent to typing +M-f. +

+
+
undo (C-_ or C-x C-u)
+

Incremental undo, separately remembered for each line. +

+
+
revert-line (M-r)
+

Undo all changes made to this line. This is like executing the undo +command enough times to get back to the beginning. +

+
+
tilde-expand (M-~)
+

Perform tilde expansion on the current word. +

+
+
set-mark (C-@)
+

Set the mark to the point. If a +numeric argument is supplied, the mark is set to that position. +

+
+
exchange-point-and-mark (C-x C-x)
+

Swap the point with the mark. The current cursor position is set to +the saved position, and the old cursor position is saved as the mark. +

+
+
character-search (C-])
+

A character is read and point is moved to the next occurrence of that +character. A negative argument 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 argument searches for subsequent +occurrences. +

+
+
skip-csi-sequence ()
+

Read enough characters to consume a multi-key sequence such as those +defined for keys like Home and End. Such sequences begin with a +Control Sequence Indicator (CSI), usually ESC-[. If this sequence is +bound to "\e[", keys producing such sequences will have no effect +unless explicitly bound to a Readline command, instead of inserting +stray characters into the editing buffer. This is unbound by default, +but usually bound to ESC-[. +

+
+
insert-comment (M-#)
+

Without a numeric argument, the value of the comment-begin +variable is inserted at the beginning of the current line. +If a numeric argument is supplied, this command acts as a toggle: if +the characters at the beginning of the line do not match the value +of comment-begin, the value is inserted, otherwise +the characters in comment-begin are deleted from the beginning of +the line. +In either case, the line is accepted as if a newline had been typed. +

+
+
dump-functions ()
+

Print all of the functions and their key bindings to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. +

+
+
dump-variables ()
+

Print all of the settable variables and their values to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. +

+
+
dump-macros ()
+

Print all of the Readline key sequences bound to macros and the +strings they output. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. +

+ +
+
emacs-editing-mode (C-e)
+

When in vi command mode, this causes a switch to emacs +editing mode. +

+
+
vi-editing-mode (M-C-j)
+

When in emacs editing mode, this causes a switch to vi +editing mode. +

+ +
+
+ +
+
+
+
+ +

1.5 Readline vi Mode

+ +

While the Readline library does not have a full set of vi +editing functions, it does contain enough to allow simple editing +of the line. The Readline vi mode behaves as specified in +the POSIX standard. +

+

In order to switch interactively between emacs and vi +editing modes, use the command M-C-j (bound to emacs-editing-mode +when in vi mode and to vi-editing-mode in emacs mode). +The Readline default is emacs mode. +

+

When you enter a line in vi mode, you are already placed in +‘insertion’ mode, as if you had typed an ‘i’. Pressing ESC +switches you into ‘command’ mode, where you can edit the text of the +line with the standard vi movement keys, move to previous +history lines with ‘k’ and subsequent lines with ‘j’, and +so forth. +

+ + +
+
+
+
+ +

2 Programming with GNU Readline

+ +

This chapter describes the interface between the GNU Readline Library and +other programs. If you are a programmer, and you wish to include the +features found in GNU Readline +such as completion, line editing, and interactive history manipulation +in your own programs, this section is for you. +

+ + +
+
+ +

2.1 Basic Behavior

+ +

Many programs provide a command line interface, such as mail, +ftp, and sh. For such programs, the default behaviour of +Readline is sufficient. This section describes how to use Readline in +the simplest way possible, perhaps to replace calls in your code to +gets() or fgets(). +

+ + + +

The function readline() prints a prompt prompt +and then reads and returns a single line of text from the user. +If prompt is NULL or the empty string, no prompt is displayed. +The line readline returns is allocated with malloc(); +the caller should free() the line when it has finished with it. +The declaration for readline in ANSI C is +

+
+
char *readline (const char *prompt);
+
+ +

So, one might say +

+
char *line = readline ("Enter a line: ");
+
+

in order to read a line of text from the user. +The line returned has the final newline removed, so only the +text remains. +

+

If readline encounters an EOF while reading the line, and the +line is empty at that point, then (char *)NULL is returned. +Otherwise, the line is ended just as if a newline had been typed. +

+

Readline performs some expansion on the prompt before it is +displayed on the screen. See the description of rl_expand_prompt +(see Redisplay) for additional details, especially if prompt +will contain characters that do not consume physical screen space when +displayed. +

+

If you want the user to be able to get at the line later, (with +C-p for example), you must call add_history() to save the +line away in a history list of such lines. +

+
+
add_history (line);
+
+ +

For full details on the GNU History Library, see the associated manual. +

+

It is preferable to avoid saving empty lines on the history list, since +users rarely have a burning need to reuse a blank line. Here is +a function which usefully replaces the standard gets() library +function, and has the advantage of no static buffer to overflow: +

+
+
/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it.
+   Returns NULL on EOF. */
+char *
+rl_gets ()
+{
+  /* If the buffer has already been allocated,
+     return the memory to the free pool. */
+  if (line_read)
+    {
+      free (line_read);
+      line_read = (char *)NULL;
+    }
+
+  /* Get a line from the user. */
+  line_read = readline ("");
+
+  /* If the line has any text in it,
+     save it on the history. */
+  if (line_read && *line_read)
+    add_history (line_read);
+
+  return (line_read);
+}
+
+ +

This function gives the user the default behaviour of TAB +completion: completion on file names. If you do not want Readline to +complete on filenames, you can change the binding of the TAB key +with rl_bind_key(). +

+
+
int rl_bind_key (int key, rl_command_func_t *function);
+
+ +

rl_bind_key() takes two arguments: key is the character that +you want to bind, and function is the address of the function to +call when key is pressed. Binding TAB to rl_insert() +makes TAB insert itself. +rl_bind_key() returns non-zero if key is not a valid +ASCII character code (between 0 and 255). +

+

Thus, to disable the default TAB behavior, the following suffices: +

+
rl_bind_key ('\t', rl_insert);
+
+ +

This code should be executed once at the start of your program; you +might write a function called initialize_readline() which +performs this and other desired initializations, such as installing +custom completers (see Custom Completers). +

+
+
+
+ +

2.2 Custom Functions

+ +

Readline provides many functions for manipulating the text of +the line, but it isn’t possible to anticipate the needs of all +programs. This section describes the various functions and variables +defined within the Readline library which allow a user program to add +customized functionality to Readline. +

+

Before declaring any functions that customize Readline’s behavior, or +using any functionality Readline provides in other code, an +application writer should include the file <readline/readline.h> +in any file that uses Readline’s features. Since some of the definitions +in readline.h use the stdio library, the file +<stdio.h> should be included before readline.h. +

+

readline.h defines a C preprocessor variable that should +be treated as an integer, RL_READLINE_VERSION, which may +be used to conditionally compile application code depending on +the installed Readline version. The value is a hexadecimal +encoding of the major and minor version numbers of the library, +of the form 0xMMmm. MM is the two-digit major +version number; mm is the two-digit minor version number. +For Readline 4.2, for example, the value of +RL_READLINE_VERSION would be 0x0402. +

+ + +
+
+ +

2.2.1 Readline Typedefs

+ +

For readability, we declare a number of new object types, all pointers +to functions. +

+

The reason for declaring these new types is to make it easier to write +code describing pointers to C functions with appropriately prototyped +arguments and return values. +

+

For instance, say we want to declare a variable func as a pointer +to a function which takes two int arguments and returns an +int (this is the type of all of the Readline bindable functions). +Instead of the classic C declaration +

+

int (*func)(); +

+

or the ANSI-C style declaration +

+

int (*func)(int, int); +

+

we may write +

+

rl_command_func_t *func; +

+

The full list of function pointer types available is +

+
+
typedef int rl_command_func_t (int, int);
+
typedef char *rl_compentry_func_t (const char *, int);
+
typedef char **rl_completion_func_t (const char *, int, int);
+
typedef char *rl_quote_func_t (char *, int, char *);
+
typedef char *rl_dequote_func_t (char *, int);
+
typedef int rl_compignore_func_t (char **);
+
typedef void rl_compdisp_func_t (char **, int, int);
+
typedef int rl_hook_func_t (void);
+
typedef int rl_getc_func_t (FILE *);
+
typedef int rl_linebuf_func_t (char *, int);
+
typedef int rl_intfunc_t (int);
+
#define rl_ivoidfunc_t rl_hook_func_t
+
typedef int rl_icpfunc_t (char *);
+
typedef int rl_icppfunc_t (char **);
+
typedef void rl_voidfunc_t (void);
+
typedef void rl_vintfunc_t (int);
+
typedef void rl_vcpfunc_t (char *);
+
typedef void rl_vcppfunc_t (char **);
+
+ +
+
+
+ +

2.2.2 Writing a New Function

+ +

In order to write new functions for Readline, you need to know the +calling conventions for keyboard-invoked functions, and the names of the +variables that describe the current state of the line read so far. +

+

The calling sequence for a command foo looks like +

+
+
int foo (int count, int key)
+
+ +

where count is the numeric argument (or 1 if defaulted) and +key is the key that invoked this function. +

+

It is completely up to the function as to what should be done with the +numeric argument. Some functions use it as a repeat count, some +as a flag, and others to choose alternate behavior (refreshing the current +line as opposed to refreshing the screen, for example). Some choose to +ignore it. In general, if a +function uses the numeric argument as a repeat count, it should be able +to do something useful with both negative and positive arguments. +At the very least, it should be aware that it can be passed a +negative argument. +

+

A command function should return 0 if its action completes successfully, +and a value greater than zero if some error occurs. +This is the convention obeyed by all of the builtin Readline bindable +command functions. +

+
+
+
+
+ +

2.3 Readline Variables

+ +

These variables are available to function writers. +

+
+
Variable: char * rl_line_buffer
+

This is the line gathered so far. You are welcome to modify the +contents of the line, but see 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. +Readline will set this variable when it has read a key sequence bound +to accept-line and is about to return the line to the caller. +

+ +
+
Variable: int rl_eof_found
+

Readline will set this variable when it has read an EOF character (e.g., the +stty ‘EOF’ character) on an empty line or encountered a read error and +is about to return a NULL line to the caller. +

+ +
+
Variable: int rl_num_chars_to_read
+

Setting this to a positive value before calling readline() causes +Readline to return after accepting that many characters, rather +than reading up to a character bound to accept-line. +

+ +
+
Variable: int rl_pending_input
+

Setting this to a value makes it the next keystroke read. This is a +way to stuff a single character into the input stream. +

+ +
+
Variable: int rl_dispatching
+

Set to a non-zero value if a function is being called from a key binding; +zero otherwise. Application functions can test this to discover whether +they were called directly or by Readline’s dispatching mechanism. +

+ +
+
Variable: int rl_erase_empty_line
+

Setting this to a non-zero value causes Readline to completely erase +the current line, including any prompt, any time a newline is typed as +the only character on an otherwise-empty line. The cursor is moved to +the beginning of the newly-blank line. +

+ +
+
Variable: char * rl_prompt
+

The prompt Readline uses. This is set from the argument to +readline(), and should not be assigned to directly. +The rl_set_prompt() function (see Redisplay) may +be used to modify the prompt string after calling readline(). +

+ +
+
Variable: char * rl_display_prompt
+

The string displayed as the prompt. This is usually identical to +rl_prompt, but may be changed temporarily by functions that +use the prompt string as a message area, such as incremental search. +

+ +
+
Variable: int rl_already_prompted
+

If an application wishes to display the prompt itself, rather than have +Readline do it the first time readline() is called, it should set +this variable to a non-zero value after displaying the prompt. +The prompt must also be passed as the argument to readline() so +the redisplay functions can update the display properly. +The calling application is responsible for managing the value; Readline +never sets it. +

+ +
+
Variable: const char * rl_library_version
+

The version number of this revision of the library. +

+ +
+
Variable: int rl_readline_version
+

An integer encoding the current version of the library. The encoding is +of the form 0xMMmm, where MM is the two-digit major version +number, and mm is the two-digit minor version number. +For example, for Readline-4.2, rl_readline_version would have the +value 0x0402. +

+ +
+
Variable: int rl_gnu_readline_p
+

Always set to 1, denoting that this is GNU Readline rather than some +emulation. +

+ +
+
Variable: const char * rl_terminal_name
+

The terminal type, used for initialization. If not set by the application, +Readline sets this to the value of the TERM environment variable +the first time it is called. +

+ +
+
Variable: const char * rl_readline_name
+

This variable is set to a unique name by each application using Readline. +The value allows conditional parsing of the inputrc file +(see Conditional Init Constructs). +

+ +
+
Variable: FILE * rl_instream
+

The stdio stream from which Readline reads input. +If NULL, Readline defaults to stdin. +

+ +
+
Variable: FILE * rl_outstream
+

The stdio stream to which Readline performs output. +If NULL, Readline defaults to stdout. +

+ +
+
Variable: int rl_prefer_env_winsize
+

If non-zero, Readline gives values found in the LINES and +COLUMNS environment variables greater precedence than values fetched +from the kernel when computing the screen dimensions. +

+ +
+
Variable: rl_command_func_t * rl_last_func
+

The address of the last command function Readline executed. May be used to +test whether or not a function is being executed twice in succession, for +example. +

+ +
+
Variable: rl_hook_func_t * rl_startup_hook
+

If non-zero, this is the address of a function to call just +before readline prints the first prompt. +

+ +
+
Variable: rl_hook_func_t * rl_pre_input_hook
+

If non-zero, this is the address of a function to call after +the first prompt has been printed and just before readline +starts reading input characters. +

+ +
+
Variable: rl_hook_func_t * rl_event_hook
+

If non-zero, this is the address of a function to call periodically +when Readline is waiting for terminal input. +By default, this will be called at most ten times a second if there +is no keyboard input. +

+ +
+
Variable: rl_getc_func_t * rl_getc_function
+

If non-zero, Readline will call indirectly through this pointer +to get a character from the input stream. By default, it is set to +rl_getc, the default Readline character input function +(see Character Input). +In general, an application that sets rl_getc_function should consider +setting rl_input_available_hook as well. +

+ +
+
Variable: rl_hook_func_t * rl_signal_event_hook
+

If non-zero, this is the address of a function to call if a read system +call is interrupted when Readline is reading terminal input. +

+ +
+
Variable: rl_hook_func_t * rl_timeout_event_hook
+

If non-zero, this is the address of a function to call if Readline times +out while reading input. +

+ +
+
Variable: rl_hook_func_t * rl_input_available_hook
+

If non-zero, Readline will use this function’s return value when it needs +to determine whether or not there is available input on the current input +source. +The default hook checks rl_instream; if an application is using a +different input source, it should set the hook appropriately. +Readline queries for available input when implementing intra-key-sequence +timeouts during input and incremental searches. +This may use an application-specific timeout before returning a value; +Readline uses the value passed to rl_set_keyboard_input_timeout() +or the value of the user-settable keyseq-timeout variable. +This is designed for use by applications using Readline’s callback interface +(see Alternate Interface), which may not use the traditional +read(2) and file descriptor interface, or other applications using +a different input mechanism. +If an application uses an input mechanism or hook that can potentially exceed +the value of keyseq-timeout, it should increase the timeout or set +this hook appropriately even when not using the callback interface. +In general, an application that sets rl_getc_function should consider +setting rl_input_available_hook as well. +

+ +
+
Variable: rl_voidfunc_t * rl_redisplay_function
+

If non-zero, Readline will call indirectly through this pointer +to update the display with the current contents of the editing buffer. +By default, it is set to rl_redisplay, the default Readline +redisplay function (see Redisplay). +

+ +
+
Variable: rl_vintfunc_t * rl_prep_term_function
+

If non-zero, Readline will call indirectly through this pointer +to initialize the terminal. The function takes a single argument, an +int flag that says whether or not to use eight-bit characters. +By default, this is set to rl_prep_terminal +(see Terminal Management). +

+ +
+
Variable: rl_voidfunc_t * rl_deprep_term_function
+

If non-zero, Readline will call indirectly through this pointer +to reset the terminal. This function should undo the effects of +rl_prep_term_function. +By default, this is set to rl_deprep_terminal +(see Terminal Management). +

+ +
+
Variable: Keymap rl_executing_keymap
+

This variable is set to the keymap (see Selecting a Keymap) in which the +currently executing Readline function was found. +

+ +
+
Variable: Keymap rl_binding_keymap
+

This variable is set to the keymap (see Selecting a Keymap) in which the +last key binding occurred. +

+ +
+
Variable: char * rl_executing_macro
+

This variable is set to the text of any currently-executing macro. +

+ +
+
Variable: int rl_executing_key
+

The key that caused the dispatch to the currently-executing Readline function. +

+ +
+
Variable: char * rl_executing_keyseq
+

The full key sequence that caused the dispatch to the currently-executing +Readline function. +

+ +
+
Variable: int rl_key_sequence_length
+

The number of characters in rl_executing_keyseq. +

+ +
+
Variable: int rl_readline_state
+

A variable with bit values that encapsulate the current Readline state. +A bit is set with the RL_SETSTATE macro, and unset with the +RL_UNSETSTATE macro. Use the RL_ISSTATE macro to test +whether a particular state bit is set. Current state bits include: +

+
+
RL_STATE_NONE
+

Readline has not yet been called, nor has it begun to initialize. +

+
RL_STATE_INITIALIZING
+

Readline is initializing its internal data structures. +

+
RL_STATE_INITIALIZED
+

Readline has completed its initialization. +

+
RL_STATE_TERMPREPPED
+

Readline has modified the terminal modes to do its own input and redisplay. +

+
RL_STATE_READCMD
+

Readline is reading a command from the keyboard. +

+
RL_STATE_METANEXT
+

Readline is reading more input after reading the meta-prefix character. +

+
RL_STATE_DISPATCHING
+

Readline is dispatching to a command. +

+
RL_STATE_MOREINPUT
+

Readline is reading more input while executing an editing command. +

+
RL_STATE_ISEARCH
+

Readline is performing an incremental history search. +

+
RL_STATE_NSEARCH
+

Readline is performing a non-incremental history search. +

+
RL_STATE_SEARCH
+

Readline is searching backward or forward through the history for a string. +

+
RL_STATE_NUMERICARG
+

Readline is reading a numeric argument. +

+
RL_STATE_MACROINPUT
+

Readline is currently getting its input from a previously-defined keyboard +macro. +

+
RL_STATE_MACRODEF
+

Readline is currently reading characters defining a keyboard macro. +

+
RL_STATE_OVERWRITE
+

Readline is in overwrite mode. +

+
RL_STATE_COMPLETING
+

Readline is performing word completion. +

+
RL_STATE_SIGHANDLER
+

Readline is currently executing the readline signal handler. +

+
RL_STATE_UNDOING
+

Readline is performing an undo. +

+
RL_STATE_INPUTPENDING
+

Readline has input pending due to a call to rl_execute_next(). +

+
RL_STATE_TTYCSAVED
+

Readline has saved the values of the terminal’s special characters. +

+
RL_STATE_CALLBACK
+

Readline is currently using the alternate (callback) interface +(see Alternate Interface). +

+
RL_STATE_VIMOTION
+

Readline is reading the argument to a vi-mode "motion" command. +

+
RL_STATE_MULTIKEY
+

Readline is reading a multiple-keystroke command. +

+
RL_STATE_VICMDONCE
+

Readline has entered vi command (movement) mode at least one time during +the current call to readline(). +

+
RL_STATE_DONE
+

Readline has read a key sequence bound to accept-line +and is about to return the line to the caller. +

+
RL_STATE_TIMEOUT
+

Readline has timed out (it did not receive a line or specified number of +characters before the timeout duration specified by rl_set_timeout +elapsed) and is returning that status to the caller. +

+
RL_STATE_EOF
+

Readline has read an EOF character (e.g., the stty ‘EOF’ character) +or encountered a read error and is about to return a NULL line to the caller. +

+
+ +
+ +
+
Variable: int rl_explicit_arg
+

Set to a non-zero value if an explicit numeric argument was specified by +the user. Only valid in a bindable command function. +

+ +
+
Variable: int rl_numeric_arg
+

Set to the value of any numeric argument explicitly specified by the user +before executing the current Readline function. Only valid in a bindable +command function. +

+ +
+
Variable: int rl_editing_mode
+

Set to a value denoting Readline’s current editing mode. A value of +1 means Readline is currently in emacs mode; 0 +means that vi mode is active. +

+ + +
+
+
+ +

2.4 Readline Convenience Functions

+ + + +
+
+ +

2.4.1 Naming a Function

+ +

The user can dynamically change the bindings of keys while using +Readline. This is done by representing the function with a descriptive +name. The user is able to type the descriptive name when referring to +the function. Thus, in an init file, one might find +

+
+
Meta-Rubout:	backward-kill-word
+
+ +

This binds the keystroke Meta-Rubout to the function +descriptively named backward-kill-word. You, as the +programmer, should bind the functions you write to descriptive names as +well. Readline provides a function for doing that: +

+
+
Function: int rl_add_defun (const char *name, rl_command_func_t *function, int key)
+

Add name to the list of named functions. Make function be +the function that gets called. If key is not -1, then bind it to +function using rl_bind_key(). +

+ +

Using this function alone is sufficient for most applications. +It is the recommended way to add a few functions to the default +functions that Readline has built in. +If you need to do something other than adding a function to Readline, +you may need to use the underlying functions described below. +

+
+
+
+ +

2.4.2 Selecting a Keymap

+ +

Key bindings take place on a keymap. The keymap is the +association between the keys that the user types and the functions that +get run. You can make your own keymaps, copy existing keymaps, and tell +Readline which keymap to use. +

+
+
Function: Keymap rl_make_bare_keymap (void)
+

Returns a new, empty keymap. The space for the keymap is allocated with +malloc(); the caller should free it by calling +rl_free_keymap() when done. +

+ +
+
Function: Keymap rl_copy_keymap (Keymap map)
+

Return a new keymap which is a copy of map. +

+ +
+
Function: Keymap rl_make_keymap (void)
+

Return a new keymap with the printing characters bound to rl_insert, +the lowercase Meta characters bound to run their equivalents, and +the Meta digits bound to produce numeric arguments. +

+ +
+
Function: void rl_discard_keymap (Keymap keymap)
+

Free the storage associated with the data in keymap. +The caller should free keymap. +

+ +
+
Function: void rl_free_keymap (Keymap keymap)
+

Free all storage associated with keymap. This calls +rl_discard_keymap to free subordindate keymaps and macros. +

+ +
+
Function: int rl_empty_keymap (Keymap keymap)
+

Return non-zero if there are no keys bound to functions in keymap; +zero if there are any keys bound. +

+ +

Readline has several internal keymaps. These functions allow you to +change which keymap is active. +

+
+
Function: Keymap rl_get_keymap (void)
+

Returns the currently active keymap. +

+ +
+
Function: void rl_set_keymap (Keymap keymap)
+

Makes keymap the currently active keymap. +

+ +
+
Function: Keymap rl_get_keymap_by_name (const char *name)
+

Return the keymap matching name. name is one which would +be supplied in a set keymap inputrc line (see 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 (see Readline Init File). +

+ +
+
Function: int rl_set_keymap_name (const char *name, Keymap keymap)
+

Set the name of keymap. This name will then be "registered" and +available for use in a set keymap inputrc directive +see Readline Init File). +The name may not be one of Readline’s builtin keymap names; +you may not add a different name for one of Readline’s builtin keymaps. +You may replace the name associated with a given keymap by calling this +function more than once with the same keymap argument. +You may associate a registered name with a new keymap by calling this +function more than once with the same name argument. +There is no way to remove a named keymap once the name has been +registered. +Readline will make a copy of name. +The return value is greater than zero unless name is one of +Readline’s builtin keymap names or keymap is one of Readline’s +builtin keymaps. +

+ +
+
+
+ +

2.4.3 Binding Keys

+ +

Key sequences are associate with functions through the keymap. +Readline has several internal keymaps: emacs_standard_keymap, +emacs_meta_keymap, emacs_ctlx_keymap, +vi_movement_keymap, and vi_insertion_keymap. +emacs_standard_keymap is the default, and the examples in +this manual assume that. +

+

Since readline() installs a set of default key bindings the first +time it is called, there is always the danger that a custom binding +installed before the first call to readline() will be overridden. +An alternate mechanism is to install custom key bindings in an +initialization function assigned to the rl_startup_hook variable +(see Readline Variables). +

+

These functions manage key bindings. +

+
+
Function: int rl_bind_key (int key, rl_command_func_t *function)
+

Binds key to function in the currently active keymap. +Returns non-zero in the case of an invalid key. +

+ +
+
Function: int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map)
+

Bind key to function in map. +Returns non-zero in the case of an invalid key. +

+ +
+
Function: int rl_bind_key_if_unbound (int key, rl_command_func_t *function)
+

Binds key to function if it is not already bound in the +currently active keymap. +Returns non-zero in the case of an invalid key or if key is +already bound. +

+ +
+
Function: int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *function, Keymap map)
+

Binds key to function if it is not already bound in map. +Returns non-zero in the case of an invalid key or if key is +already bound. +

+ +
+
Function: int rl_unbind_key (int key)
+

Bind key to the null function in the currently active keymap. +Returns non-zero in case of error. +

+ +
+
Function: int rl_unbind_key_in_map (int key, Keymap map)
+

Bind key to the null function in map. +Returns non-zero in case of error. +

+ +
+
Function: int rl_unbind_function_in_map (rl_command_func_t *function, Keymap map)
+

Unbind all keys that execute function in map. +

+ +
+
Function: int rl_unbind_command_in_map (const char *command, Keymap map)
+

Unbind all keys that are bound to command in map. +

+ +
+
Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function)
+

Bind the key sequence represented by the string keyseq to the function +function, beginning in the current keymap. +This makes new keymaps as necessary. +The return value is non-zero if keyseq is invalid. +

+ +
+
Function: int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
+

Bind the key sequence represented by the string keyseq to the function +function. This makes new keymaps as necessary. +Initial bindings are performed in map. +The return value is non-zero if keyseq is invalid. +

+ +
+
Function: int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map)
+

Equivalent to rl_bind_keyseq_in_map. +

+ +
+
Function: int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *function)
+

Binds keyseq to function if it is not already bound in the +currently active keymap. +Returns non-zero in the case of an invalid keyseq or if keyseq is +already bound. +

+ +
+
Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
+

Binds keyseq to function if it is not already bound in map. +Returns non-zero in the case of an invalid keyseq or if keyseq is +already bound. +

+ +
+
Function: int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
+

Bind the key sequence represented by the string keyseq to the arbitrary +pointer data. type says what kind of data is pointed to by +data; this can be a function (ISFUNC), a macro +(ISMACR), or a keymap (ISKMAP). This makes new keymaps as +necessary. The initial keymap in which to do bindings is map. +

+ +
+
Function: int rl_parse_and_bind (char *line)
+

Parse line as if it had been read from the inputrc file and +perform any key bindings and variable assignments found +(see Readline Init File). +

+ +
+
Function: int rl_read_init_file (const char *filename)
+

Read keybindings and variable assignments from filename +(see Readline Init File). +

+ +
+
+
+ +

2.4.4 Associating Function Names and Bindings

+ +

These functions allow you to find out what keys invoke named functions +and the functions invoked by a particular key sequence. You may also +associate a new function name with an arbitrary function. +

+
+
Function: rl_command_func_t * rl_named_function (const char *name)
+

Return the function with name name. +

+ +
+
Function: rl_command_func_t * rl_function_of_keyseq (const char *keyseq, Keymap map, int *type)
+

Return the function invoked by keyseq in keymap map. +If map is NULL, the current keymap is used. If type is +not NULL, the type of the object is returned in the int variable +it points to (one of ISFUNC, ISKMAP, or ISMACR). +It takes a "translated" key sequence and should not be used if the key sequence +can include NUL. +

+ +
+
Function: rl_command_func_t * rl_function_of_keyseq_len (const char *keyseq, size_t len, Keymap map, int *type)
+

Return the function invoked by keyseq of length len +in keymap map. Equivalent to rl_function_of_keyseq with the +addition of the len parameter. +It takes a "translated" key sequence and should be used if the key sequence +can include NUL. +

+ +
+
Function: int rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map)
+

If there is a numeric argument at the beginning of keyseq, possibly +including digits, return the index of the first character in keyseq +following the numeric argument. +This can be used to skip over the numeric argument (which is available as +rl_numeric_arg while traversing the key sequence that invoked the +current command. +

+ +
+
Function: char ** rl_invoking_keyseqs (rl_command_func_t *function)
+

Return an array of strings representing the key sequences used to +invoke function in the current keymap. +

+ +
+
Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map)
+

Return an array of strings representing the key sequences used to +invoke function in the keymap map. +

+ +
+
Function: void rl_function_dumper (int readable)
+

Print the Readline function names and the key sequences currently +bound to them to rl_outstream. If readable is non-zero, +the list is formatted in such a way that it can be made part of an +inputrc file and re-read. +

+ +
+
Function: void rl_list_funmap_names (void)
+

Print the names of all bindable Readline functions to rl_outstream. +

+ +
+
Function: const char ** rl_funmap_names (void)
+

Return a NULL terminated array of known function names. The array is +sorted. The array itself is allocated, but not the strings inside. You +should free the array, but not the pointers, using free or +rl_free when you are done. +

+ +
+
Function: int rl_add_funmap_entry (const char *name, rl_command_func_t *function)
+

Add name to the list of bindable Readline command names, and make +function the function to be called when name is invoked. +

+ +
+
+
+ +

2.4.5 Allowing Undoing

+ +

Supporting the undo command is a painless thing, and makes your +functions much more useful. It is certainly easy to try +something if you know you can undo it. +

+

If your function simply inserts text once, or deletes text once, and +uses rl_insert_text() or rl_delete_text() to do it, then +undoing is already done for you automatically. +

+

If you do multiple insertions or multiple deletions, or any combination +of these operations, you should group them together into one operation. +This is done with rl_begin_undo_group() and +rl_end_undo_group(). +

+

The types of events that can be undone are: +

+
+
enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; 
+
+ +

Notice that UNDO_DELETE means to insert some text, and +UNDO_INSERT means to delete some text. That is, the undo code +tells what to undo, not how to undo it. UNDO_BEGIN and +UNDO_END are tags added by rl_begin_undo_group() and +rl_end_undo_group(). +

+
+
Function: int rl_begin_undo_group (void)
+

Begins saving undo information in a group construct. The undo +information usually comes from calls to rl_insert_text() and +rl_delete_text(), but could be the result of calls to +rl_add_undo(). +

+ +
+
Function: int rl_end_undo_group (void)
+

Closes the current undo group started with rl_begin_undo_group +(). There should be one call to rl_end_undo_group() +for each call to rl_begin_undo_group(). +

+ +
+
Function: void rl_add_undo (enum undo_code what, int start, int end, char *text)
+

Remember how to undo an event (according to what). The affected +text runs from start to end, and encompasses text. +

+ +
+
Function: void rl_free_undo_list (void)
+

Free the existing undo list. +

+ +
+
Function: int rl_do_undo (void)
+

Undo the first thing on the undo list. Returns 0 if there was +nothing to undo, non-zero if something was undone. +

+ +

Finally, if you neither insert nor delete text, but directly modify the +existing text (e.g., change its case), call rl_modifying() +once, just before you modify the text. You must supply the indices of +the text range that you are going to modify. +

+
+
Function: int rl_modifying (int start, int end)
+

Tell Readline to save the text between start and end as a +single undo unit. It is assumed that you will subsequently modify +that text. +

+ +
+
+
+ +

2.4.6 Redisplay

+ +
+
Function: void rl_redisplay (void)
+

Change what’s displayed on the screen to reflect the current contents +of rl_line_buffer. +

+ +
+
Function: int rl_forced_update_display (void)
+

Force the line to be updated and redisplayed, whether or not +Readline thinks the screen display is correct. +

+ +
+
Function: int rl_on_new_line (void)
+

Tell the update functions that we have moved onto a new (empty) line, +usually after outputting a newline. +

+ +
+
Function: int rl_on_new_line_with_prompt (void)
+

Tell the update functions that we have moved onto a new line, with +rl_prompt already displayed. +This could be used by applications that want to output the prompt string +themselves, but still need Readline to know the prompt string length for +redisplay. +It should be used after setting rl_already_prompted. +

+ +
+
Function: int rl_clear_visible_line (void)
+

Clear the screen lines corresponding to the current line’s contents. +

+ +
+
Function: int rl_reset_line_state (void)
+

Reset the display state to a clean state and redisplay the current line +starting on a new line. +

+ +
+
Function: int rl_crlf (void)
+

Move the cursor to the start of the next screen line. +

+ +
+
Function: int rl_show_char (int c)
+

Display character c on rl_outstream. +If Readline has not been set to display meta characters directly, this +will convert meta characters to a meta-prefixed key sequence. +This is intended for use by applications which wish to do their own +redisplay. +

+ +
+
Function: int rl_message (const char *, …)
+

The arguments are a format string as would be supplied to printf, +possibly containing conversion specifications such as ‘%d’, and +any additional arguments necessary to satisfy the conversion specifications. +The resulting string is displayed in the echo area. The echo area +is also used to display numeric arguments and search strings. +You should call rl_save_prompt to save the prompt information +before calling this function. +

+ +
+
Function: int rl_clear_message (void)
+

Clear the message in the echo area. If the prompt was saved with a call to +rl_save_prompt before the last call to rl_message, +call rl_restore_prompt before calling this function. +

+ +
+
Function: void rl_save_prompt (void)
+

Save the local Readline prompt display state in preparation for +displaying a new message in the message area with rl_message(). +

+ +
+
Function: void rl_restore_prompt (void)
+

Restore the local Readline prompt display state saved by the most +recent call to rl_save_prompt. +if rl_save_prompt was called to save the prompt before a call +to rl_message, this function should be called before the +corresponding call to rl_clear_message. +

+ +
+
Function: int rl_expand_prompt (char *prompt)
+

Expand any special character sequences in prompt and set up the +local Readline prompt redisplay variables. +This function is called by readline(). It may also be called to +expand the primary prompt if the rl_on_new_line_with_prompt() +function or rl_already_prompted variable is used. +It returns the number of visible characters on the last line of the +(possibly multi-line) prompt. +Applications may indicate that the prompt contains characters that take +up no physical screen space when displayed by bracketing a sequence of +such characters with the special markers RL_PROMPT_START_IGNORE +and RL_PROMPT_END_IGNORE (declared in readline.h as +‘\001’ and ‘\002’, respectively). +This may be used to embed terminal-specific escape sequences in prompts. +

+ +
+
Function: int rl_set_prompt (const char *prompt)
+

Make Readline use prompt for subsequent redisplay. This calls +rl_expand_prompt() to expand the prompt and sets rl_prompt +to the result. +

+ +
+
+
+ +

2.4.7 Modifying Text

+ +
+
Function: int rl_insert_text (const char *text)
+

Insert text into the line at the current cursor position. +Returns the number of characters inserted. +

+ +
+
Function: int rl_delete_text (int start, int end)
+

Delete the text between start and end in the current line. +Returns the number of characters deleted. +

+ +
+
Function: char * rl_copy_text (int start, int end)
+

Return a copy of the text between start and end in +the current line. +

+ +
+
Function: int rl_kill_text (int start, int end)
+

Copy the text between start and end in the current line +to the kill ring, appending or prepending to the last kill if the +last command was a kill command. The text is deleted. +If start is less than end, +the text is appended, otherwise prepended. If the last command was +not a kill, a new kill ring slot is used. +

+ +
+
Function: int rl_push_macro_input (char *macro)
+

Cause macro to be inserted into the line, as if it had been invoked +by a key bound to a macro. Not especially useful; use +rl_insert_text() instead. +

+ +
+
+
+ +

2.4.8 Character Input

+ +
+
Function: int rl_read_key (void)
+

Return the next character available from Readline’s current input stream. +This handles input inserted into +the input stream via rl_pending_input (see Readline Variables) +and rl_stuff_char(), macros, and characters read from the keyboard. +While waiting for input, this function will call any function assigned to +the rl_event_hook variable. +

+ +
+
Function: int rl_getc (FILE *stream)
+

Return the next character available from stream, which is assumed to +be the keyboard. +

+ +
+
Function: int rl_stuff_char (int c)
+

Insert c into the Readline input stream. It will be "read" +before Readline attempts to read characters from the terminal with +rl_read_key(). Up to 512 characters may be pushed back. +rl_stuff_char returns 1 if the character was successfully inserted; +0 otherwise. +

+ +
+
Function: int rl_execute_next (int c)
+

Make c be the next command to be executed when rl_read_key() +is called. This sets rl_pending_input. +

+ +
+
Function: int rl_clear_pending_input (void)
+

Unset rl_pending_input, effectively negating the effect of any +previous call to rl_execute_next(). This works only if the +pending input has not already been read with rl_read_key(). +

+ +
+
Function: int rl_set_keyboard_input_timeout (int u)
+

While waiting for keyboard input in rl_read_key(), Readline will +wait for u microseconds for input before calling any function +assigned to rl_event_hook. u must be greater than or equal +to zero (a zero-length timeout is equivalent to a poll). +The default waiting period is one-tenth of a second. +Returns the old timeout value. +

+ +
+
Function: int rl_set_timeout (unsigned int secs, unsigned int usecs)
+

Set a timeout for subsequent calls to readline(). If Readline does +not read a complete line, or the number of characters specified by +rl_num_chars_to_read, before the duration specified by secs +(in seconds) and usecs (microseconds), it returns and sets +RL_STATE_TIMEOUT in rl_readline_state. +Passing 0 for secs and usecs cancels any previously set +timeout; the convenience macro rl_clear_timeout() is shorthand +for this. +Returns 0 if the timeout is set successfully. +

+ +
+
Function: int rl_timeout_remaining (unsigned int *secs, unsigned int *usecs)
+

Return the number of seconds and microseconds remaining in the current +timeout duration in *secs and *usecs, respectively. +Both *secs and *usecs must be non-NULL to return any values. +The return value is -1 on error or when there is no timeout set, +0 when the timeout has expired (leaving *secs and *usecs +unchanged), +and 1 if the timeout has not expired. +If either of secs and usecs is NULL, +the return value indicates whether the timeout has expired. +

+ +
+
+
+ +

2.4.9 Terminal Management

+ +
+
Function: void rl_prep_terminal (int meta_flag)
+

Modify the terminal settings for Readline’s use, so readline() +can read a single character at a time from the keyboard. +The meta_flag argument should be non-zero if Readline should +read eight-bit input. +

+ +
+
Function: void rl_deprep_terminal (void)
+

Undo the effects of rl_prep_terminal(), leaving the terminal in +the state in which it was before the most recent call to +rl_prep_terminal(). +

+ +
+
Function: void rl_tty_set_default_bindings (Keymap kmap)
+

Read the operating system’s terminal editing characters (as would be +displayed by stty) to their Readline equivalents. +The bindings are performed in kmap. +

+ +
+
Function: void rl_tty_unset_default_bindings (Keymap kmap)
+

Reset the bindings manipulated by rl_tty_set_default_bindings so +that the terminal editing characters are bound to rl_insert. +The bindings are performed in kmap. +

+ +
+
Function: int rl_tty_set_echoing (int value)
+

Set Readline’s idea of whether or not it is echoing output to its output +stream (rl_outstream). If value is 0, Readline does not display +output to rl_outstream; any other value enables output. The initial +value is set when Readline initializes the terminal settings. +This function returns the previous value. +

+ +
+
Function: int rl_reset_terminal (const char *terminal_name)
+

Reinitialize Readline’s idea of the terminal settings using +terminal_name as the terminal type (e.g., vt100). +If terminal_name is NULL, the value of the TERM +environment variable is used. +

+ +
+
+
+ +

2.4.10 Utility Functions

+ +
+
Function: int rl_save_state (struct readline_state *sp)
+

Save a snapshot of Readline’s internal state to sp. +The contents of the readline_state structure are documented +in readline.h. +The caller is responsible for allocating the structure. +

+ +
+
Function: int rl_restore_state (struct readline_state *sp)
+

Restore Readline’s internal state to that stored in sp, which must +have been saved by a call to rl_save_state. +The contents of the readline_state structure are documented +in readline.h. +The caller is responsible for freeing the structure. +

+ +
+
Function: void rl_free (void *mem)
+

Deallocate the memory pointed to by mem. mem must have been +allocated by malloc. +

+ +
+
Function: void rl_replace_line (const char *text, int clear_undo)
+

Replace the contents of rl_line_buffer with text. +The point and mark are preserved, if possible. +If clear_undo is non-zero, the undo list associated with the +current line is cleared. +

+ +
+
Function: void rl_extend_line_buffer (int len)
+

Ensure that rl_line_buffer has enough space to hold len +characters, possibly reallocating it if necessary. +

+ +
+
Function: int rl_initialize (void)
+

Initialize or re-initialize Readline’s internal state. +It’s not strictly necessary to call this; readline() calls it before +reading any input. +

+ +
+
Function: int rl_ding (void)
+

Ring the terminal bell, obeying the setting of bell-style. +

+ +
+
Function: int rl_alphabetic (int c)
+

Return 1 if c is an alphabetic character. +

+ +
+
Function: void rl_display_match_list (char **matches, int len, int max)
+

A convenience function for displaying a list of strings in +columnar format on Readline’s output stream. matches is the list +of strings, in argv format, such as a list of completion matches. +len is the number of strings in matches, and max +is the length of the longest string in matches. This function uses +the setting of print-completions-horizontally to select how the +matches are displayed (see Readline Init File Syntax). +When displaying completions, this function sets the number of columns used +for display to the value of completion-display-width, the value of +the environment variable COLUMNS, or the screen width, in that order. +

+ +

The following are implemented as macros, defined in chardefs.h. +Applications should refrain from using them. +

+
+
Function: int _rl_uppercase_p (int c)
+

Return 1 if c is an uppercase alphabetic character. +

+ +
+
Function: int _rl_lowercase_p (int c)
+

Return 1 if c is a lowercase alphabetic character. +

+ +
+
Function: int _rl_digit_p (int c)
+

Return 1 if c is a numeric character. +

+ +
+
Function: int _rl_to_upper (int c)
+

If c is a lowercase alphabetic character, return the corresponding +uppercase character. +

+ +
+
Function: int _rl_to_lower (int c)
+

If c is an uppercase alphabetic character, return the corresponding +lowercase character. +

+ +
+
Function: int _rl_digit_value (int c)
+

If c is a number, return the value it represents. +

+ +
+
+
+ +

2.4.11 Miscellaneous Functions

+ +
+
Function: int rl_macro_bind (const char *keyseq, const char *macro, Keymap map)
+

Bind the key sequence keyseq to invoke the macro macro. +The binding is performed in map. When keyseq is invoked, the +macro will be inserted into the line. This function is deprecated; +use rl_generic_bind() instead. +

+ +
+
Function: void rl_macro_dumper (int readable)
+

Print the key sequences bound to macros and their values, using +the current keymap, to rl_outstream. +If readable is non-zero, the list is formatted in such a way +that it can be made part of an inputrc file and re-read. +

+ +
+
Function: int rl_variable_bind (const char *variable, const char *value)
+

Make the Readline variable variable have value. +This behaves as if the Readline command +‘set variable value’ had been executed in an inputrc +file (see Readline Init File Syntax). +

+ +
+
Function: char * rl_variable_value (const char *variable)
+

Return a string representing the value of the Readline variable variable. +For boolean variables, this string is either ‘on’ or ‘off’. +

+ +
+
Function: void rl_variable_dumper (int readable)
+

Print the Readline variable names and their current values +to rl_outstream. +If readable is non-zero, the list is formatted in such a way +that it can be made part of an inputrc file and re-read. +

+ +
+ +

Set the time interval (in microseconds) that Readline waits when showing +a balancing character when blink-matching-paren has been enabled. +

+ +
+
Function: char * rl_get_termcap (const char *cap)
+

Retrieve the string value of the termcap capability cap. +Readline fetches the termcap entry for the current terminal name and +uses those capabilities to move around the screen line and perform other +terminal-specific operations, like erasing a line. Readline does not +use all of a terminal’s capabilities, and this function will return +values for only those capabilities Readline uses. +

+ +
+
Function: void rl_clear_history (void)
+

Clear the history list by deleting all of the entries, in the same manner +as the History library’s clear_history() function. +This differs from clear_history because it frees private data +Readline saves in the history list. +

+ +
+
Function: void rl_activate_mark (void)
+

Enable an active mark. +When this is enabled, the text between point and mark (the region) is +displayed in the terminal’s standout mode (a face). +This is called by various Readline functions that set the mark and insert +text, and is available for applications to call. +

+ +
+
Function: void rl_deactivate_mark (void)
+

Turn off the active mark. +

+ +
+
Function: void rl_keep_mark_active (void)
+

Indicate that the mark should remain active when the current Readline +function completes and after redisplay occurs. +In most cases, the mark remains active for only the duration of a single +bindable Readline function. +

+ +
+
Function: int rl_mark_active_p (void)
+

Return a non-zero value if the mark is currently active; zero otherwise. +

+ +
+
+
+ +

2.4.12 Alternate Interface

+ +

An alternate interface is available to plain readline(). Some +applications need to interleave keyboard I/O with file, device, or +window system I/O, typically by using a main loop to select() +on various file descriptors. To accommodate this need, Readline can +also be invoked as a ‘callback’ function from an event loop. There +are functions available to make this easy. +

+
+
Function: void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler)
+

Set up the terminal for Readline I/O and display the initial +expanded value of prompt. Save the value of lhandler to +use as a handler function to call when a complete line of input has been +entered. +The handler function receives the text of the line as an argument. +As with readline(), the handler function should free the +line when it it finished with it. +

+ +
+
Function: void rl_callback_read_char (void)
+

Whenever an application determines that keyboard input is available, it +should call rl_callback_read_char(), which will read the next +character from the current input source. +If that character completes the line, rl_callback_read_char will +invoke the lhandler function installed by +rl_callback_handler_install to process the line. +Before calling the lhandler function, the terminal settings are +reset to the values they had before calling +rl_callback_handler_install. +If the lhandler function returns, +and the line handler remains installed, +the terminal settings are modified for Readline’s use again. +EOF is indicated by calling lhandler with a +NULL line. +

+ +
+
Function: void rl_callback_sigcleanup (void)
+

Clean up any internal state the callback interface uses to maintain state +between calls to rl_callback_read_char (e.g., the state of any active +incremental searches). This is intended to be used by applications that +wish to perform their own signal handling; Readline’s internal signal handler +calls this when appropriate. +

+ +
+
Function: void rl_callback_handler_remove (void)
+

Restore the terminal to its initial state and remove the line handler. +You may call this function from within a callback as well as independently. +If the lhandler installed by rl_callback_handler_install +does not exit the program, either this function or the function referred +to by the value of rl_deprep_term_function should be called before +the program exits to reset the terminal settings. +

+ +
+
+
+ +

2.4.13 A Readline Example

+ +

Here is a function which changes lowercase characters to their uppercase +equivalents, and uppercase characters to lowercase. If +this function was bound to ‘M-c’, then typing ‘M-c’ would +change the case of the character under point. Typing ‘M-1 0 M-c’ +would change the case of the following 10 characters, leaving the cursor on +the last character changed. +

+
+
/* Invert the case of the COUNT following characters. */
+int
+invert_case_line (count, key)
+     int count, key;
+{
+  register int start, end, i;
+
+  start = rl_point;
+
+  if (rl_point >= rl_end)
+    return (0);
+
+  if (count < 0)
+    {
+      direction = -1;
+      count = -count;
+    }
+  else
+    direction = 1;
+      
+  /* Find the end of the range to modify. */
+  end = start + (count * direction);
+
+  /* Force it to be within range. */
+  if (end > rl_end)
+    end = rl_end;
+  else if (end < 0)
+    end = 0;
+
+  if (start == end)
+    return (0);
+
+  if (start > end)
+    {
+      int temp = start;
+      start = end;
+      end = temp;
+    }
+
+  /* Tell readline that we are modifying the line,
+     so it will save the undo information. */
+  rl_modifying (start, end);
+
+  for (i = start; i != end; i++)
+    {
+      if (_rl_uppercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+      else if (_rl_lowercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+    }
+  /* Move point to on top of the last character changed. */
+  rl_point = (direction == 1) ? end - 1 : start;
+  return (0);
+}
+
+ +
+
+
+ +

2.4.14 Alternate Interface Example

+ +

Here is a complete program that illustrates Readline’s alternate interface. +It reads lines from the terminal and displays them, providing the +standard history and TAB completion functions. +It understands the EOF character or "exit" to exit the program. +

+
+
/* Standard include files. stdio.h is required. */
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <locale.h>
+
+/* Used for select(2) */
+#include <sys/types.h>
+#include <sys/select.h>
+
+#include <signal.h>
+
+#include <stdio.h>
+
+/* Standard readline include files. */
+#include <readline/readline.h>
+#include <readline/history.h>
+
+static void cb_linehandler (char *);
+static void sighandler (int);
+
+int running;
+int sigwinch_received;
+const char *prompt = "rltest$ ";
+
+/* Handle SIGWINCH and window size changes when readline is not active and
+   reading a character. */
+static void
+sighandler (int sig)
+{
+  sigwinch_received = 1;
+}
+
+/* Callback function called for each line when accept-line executed, EOF
+   seen, or EOF character read.  This sets a flag and returns; it could
+   also call exit(3). */
+static void
+cb_linehandler (char *line)
+{
+  /* Can use ^D (stty eof) or `exit' to exit. */
+  if (line == NULL || strcmp (line, "exit") == 0)
+    {
+      if (line == 0)
+        printf ("\n");
+      printf ("exit\n");
+      /* This function needs to be called to reset the terminal settings,
+         and calling it from the line handler keeps one extra prompt from
+         being displayed. */
+      rl_callback_handler_remove ();
+
+      running = 0;
+    }
+  else
+    {
+      if (*line)
+        add_history (line);
+      printf ("input line: %s\n", line);
+      free (line);
+    }
+}
+
+int
+main (int c, char **v)
+{
+  fd_set fds;
+  int r;
+
+  /* Set the default locale values according to environment variables. */
+  setlocale (LC_ALL, "");
+
+  /* Handle window size changes when readline is not active and reading
+     characters. */
+  signal (SIGWINCH, sighandler);
+
+  /* Install the line handler. */
+  rl_callback_handler_install (prompt, cb_linehandler);
+
+  /* Enter a simple event loop.  This waits until something is available
+     to read on readline's input stream (defaults to standard input) and
+     calls the builtin character read callback to read it.  It does not
+     have to modify the user's terminal settings. */
+  running = 1;
+  while (running)
+    {
+      FD_ZERO (&fds);
+      FD_SET (fileno (rl_instream), &fds);    
+
+      r = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
+      if (r < 0 && errno != EINTR)
+        {
+          perror ("rltest: select");
+          rl_callback_handler_remove ();
+          break;
+        }
+      if (sigwinch_received)
+	{
+	  rl_resize_terminal ();
+	  sigwinch_received = 0;
+	}
+      if (r < 0)
+	continue;     
+
+      if (FD_ISSET (fileno (rl_instream), &fds))
+        rl_callback_read_char ();
+    }
+
+  printf ("rltest: Event loop has exited\n");
+  return 0;
+}
+
+ +
+
+
+
+ +

2.5 Readline Signal Handling

+ +

Signals are asynchronous events sent to a process by the Unix kernel, +sometimes on behalf of another process. They are intended to indicate +exceptional events, like a user pressing the terminal’s interrupt key, +or a network connection being broken. There is a class of signals that can +be sent to the process currently reading input from the keyboard. Since +Readline changes the terminal attributes when it is called, it needs to +perform special processing when such a signal is received in order to +restore the terminal to a sane state, or provide application writers with +functions to do so manually. +

+

Readline contains an internal signal handler that is installed for a +number of signals (SIGINT, SIGQUIT, SIGTERM, +SIGHUP, +SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU). +When one of these signals is received, the signal handler +will reset the terminal attributes to those that were in effect before +readline() was called, reset the signal handling to what it was +before readline() was called, and resend the signal to the calling +application. +If and when the calling application’s signal handler returns, Readline +will reinitialize the terminal and continue to accept input. +When a SIGINT is received, the Readline signal handler performs +some additional work, which will cause any partially-entered line to be +aborted (see the description of rl_free_line_state() below). +

+

There is an additional Readline signal handler, for SIGWINCH, which +the kernel sends to a process whenever the terminal’s size changes (for +example, if a user resizes an xterm). The Readline SIGWINCH +handler updates Readline’s internal screen size information, and then calls +any SIGWINCH signal handler the calling application has installed. +Readline calls the application’s SIGWINCH signal handler without +resetting the terminal to its original state. If the application’s signal +handler does more than update its idea of the terminal size and return (for +example, a longjmp back to a main processing loop), it must +call rl_cleanup_after_signal() (described below), to restore the +terminal state. +

+

When an application is using the callback interface +(see Alternate Interface), Readline installs signal handlers only for +the duration of the call to rl_callback_read_char. Applications +using the callback interface should be prepared to clean up Readline’s +state if they wish to handle the signal before the line handler completes +and restores the terminal state. +

+

If an application using the callback interface wishes to have Readline +install its signal handlers at the time the application calls +rl_callback_handler_install and remove them only when a complete +line of input has been read, it should set the +rl_persistent_signal_handlers variable to a non-zero value. +This allows an application to defer all of the handling of the signals +Readline catches to Readline. +Applications should use this variable with care; it can result in Readline +catching signals and not acting on them (or allowing the application to react +to them) until the application calls rl_callback_read_char. This +can result in an application becoming less responsive to keyboard signals +like SIGINT. +If an application does not want or need to perform any signal handling, or +does not need to do any processing between calls to rl_callback_read_char, +setting this variable may be desirable. +

+

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, SIGHUP, SIGALRM, +SIGTSTP, SIGTTIN, and SIGTTOU. +

+

The default value of rl_catch_signals is 1. +

+ +
+
Variable: int rl_catch_sigwinch
+

If this variable is set to a non-zero value, +Readline will install a signal handler for SIGWINCH. +

+

The default value of rl_catch_sigwinch is 1. +

+ +
+
Variable: int rl_persistent_signal_handlers
+

If an application using the callback interface wishes Readline’s signal +handlers to be installed and active during the set of calls to +rl_callback_read_char that constitutes an entire single line, +it should set this variable to a non-zero value. +

+

The default value of rl_persistent_signal_handlers is 0. +

+ +
+
Variable: int rl_change_environment
+

If this variable is set to a non-zero value, +and Readline is handling SIGWINCH, Readline will modify the +LINES and COLUMNS environment variables upon receipt of a +SIGWINCH +

+

The default value of rl_change_environment 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: int rl_pending_signal (void)
+

Return the signal number of the most recent signal Readline received but +has not yet handled, or 0 if there is no pending 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 wants to force Readline to handle any signals that +have arrived while it has been executing, rl_check_signals() +will call Readline’s internal signal handler if there are any pending +signals. This is primarily intended for those applications that use +a custom rl_getc_function (see Readline Variables) and wish +to handle signals received while waiting for input. +

+
+
Function: void rl_check_signals (void)
+

If there are any pending signals, call Readline’s internal signal handling +functions to process them. rl_pending_signal() can be used independently +to determine whether or not there are any pending signals. +

+ +

If an application does not wish Readline to catch SIGWINCH, it may +call rl_resize_terminal() or rl_set_screen_size() to force +Readline to update its idea of the terminal size when it receives +a SIGWINCH. +

+
+
Function: void rl_echo_signal_char (int sig)
+

If an application wishes to install its own signal handlers, but still +have Readline display characters that generate signals, calling this +function with sig set to SIGINT, SIGQUIT, or +SIGTSTP will display the character generating that signal. +

+ +
+
Function: void rl_resize_terminal (void)
+

Update Readline’s internal screen size by reading values from the kernel. +

+ +
+
Function: void rl_set_screen_size (int rows, int cols)
+

Set Readline’s idea of the terminal size to rows rows and +cols columns. If either rows or columns is less than +or equal to 0, Readline’s idea of that terminal dimension is unchanged. +This is intended to tell Readline the physical dimensions of the terminal, +and is used internally to calculate the maximum number of characters that +may appear on a single line and on the screen. +

+ +

If an application does not want to install a SIGWINCH handler, but +is still interested in the screen dimensions, it may query Readline’s idea +of the screen size. +

+
+
Function: void rl_get_screen_size (int *rows, int *cols)
+

Return Readline’s idea of the terminal’s size in the +variables pointed to by the arguments. +

+ +
+
Function: void rl_reset_screen_size (void)
+

Cause Readline to reobtain the screen size and recalculate its dimensions. +

+ +

The following functions install and remove Readline’s signal handlers. +

+
+
Function: int rl_set_signals (void)
+

Install Readline’s signal handler for SIGINT, SIGQUIT, +SIGTERM, SIGHUP, 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(). +

+ +
+
+
+ +

2.6 Custom Completers

+ + +

Typically, a program that reads commands from the user has a way of +disambiguating commands and data. If your program is one of these, then +it can provide completion for commands, data, or both. +The following sections describe how your program and Readline +cooperate to provide this service. +

+ + +
+
+ +

2.6.1 How Completing Works

+ +

In order to complete some text, the full list of possible completions +must be available. That is, it is not possible to accurately +expand a partial word without knowing all of the possible words +which make sense in that context. The Readline library provides +the user interface to completion, and two of the most common +completion functions: filename and username. For completing other types +of text, you must write your own completion function. This section +describes exactly what such functions must do, and provides an example. +

+

There are three major functions used to perform completion: +

+
    +
  1. The user-interface function rl_complete(). This function is +called with the same arguments as other bindable Readline functions: +count and invoking_key. +It isolates the word to be completed and calls +rl_completion_matches() to generate a list of possible completions. +It then either lists the possible completions, inserts the possible +completions, or actually performs the +completion, depending on which behavior is desired. + +
  2. The internal function rl_completion_matches() uses an +application-supplied generator function to generate the list of +possible matches, and then returns the array of these matches. +The caller should place the address of its generator function in +rl_completion_entry_function. + +
  3. The generator function is called repeatedly from +rl_completion_matches(), returning a string each time. The +arguments to the generator function are text and state. +text is the partial word to be completed. state is zero the +first time the function is called, allowing the generator to perform +any necessary initialization, and a positive non-zero integer for +each subsequent call. The generator function returns +(char *)NULL to inform rl_completion_matches() that there are +no more possibilities left. Usually the generator function computes the +list of possible completions when state is zero, and returns them +one at a time on subsequent calls. Each string the generator function +returns as a match must be allocated with malloc(); Readline +frees the strings when it has finished with them. +Such a generator function is referred to as an +application-specific completion function. + +
+ +
+
Function: int rl_complete (int ignore, int invoking_key)
+

Complete the word at or before point. You have supplied the function +that does the initial simple matching selection algorithm (see +rl_completion_matches()). The default is to do filename completion. +

+ +
+
Variable: rl_compentry_func_t * rl_completion_entry_function
+

This is a pointer to the generator function for +rl_completion_matches(). +If the value of rl_completion_entry_function is +NULL then the default filename generator +function, rl_filename_completion_function(), is used. +An application-specific completion function is a function whose +address is assigned to rl_completion_entry_function and whose +return values are used to generate possible completions. +

+ +
+
+
+ +

2.6.2 Completion Functions

+ +

Here is the complete list of callable completion functions present in +Readline. +

+
+
Function: int rl_complete_internal (int what_to_do)
+

Complete the word at or before point. what_to_do says what to do +with the completion. A value of ‘?’ means list the possible +completions. ‘TAB’ means do standard completion. ‘*’ means +insert all of the possible completions. ‘!’ means to display +all of the possible completions, if there is more than one, as well as +performing partial completion. ‘@’ is similar to ‘!’, but +possible completions are not listed if the possible completions share +a common prefix. +

+ +
+
Function: int rl_complete (int ignore, int invoking_key)
+

Complete the word at or before point. You have supplied the function +that does the initial simple matching selection algorithm (see +rl_completion_matches() and rl_completion_entry_function). +The default is to do filename +completion. This calls rl_complete_internal() with an +argument depending on invoking_key. +

+ +
+
Function: int rl_possible_completions (int count, int invoking_key)
+

List the possible completions. See description of rl_complete +(). This calls rl_complete_internal() with an argument of +‘?’. +

+ +
+
Function: int rl_insert_completions (int count, int invoking_key)
+

Insert the list of possible completions into the line, deleting the +partially-completed word. See description of rl_complete(). +This calls rl_complete_internal() with an argument of ‘*’. +

+ +
+
Function: int rl_completion_mode (rl_command_func_t *cfunc)
+

Returns the appropriate value to pass to rl_complete_internal() +depending on whether cfunc was called twice in succession and +the values of the show-all-if-ambiguous and +show-all-if-unmodified variables. +Application-specific completion functions may use this function to present +the same interface as rl_complete(). +

+ +
+
Function: char ** rl_completion_matches (const char *text, rl_compentry_func_t *entry_func)
+

Returns an array of strings which is a list of completions for +text. If there are no completions, returns NULL. +The first entry in the returned array is the substitution for text. +The remaining entries are the possible completions. The array is +terminated with a NULL pointer. +

+

entry_func is a function of two args, and returns a +char *. The first argument is text. The second is a +state argument; it is zero on the first call, and non-zero on subsequent +calls. entry_func returns a NULL pointer to the caller +when there are no more matches. +

+ +
+
Function: char * rl_filename_completion_function (const char *text, int state)
+

A generator function for filename completion in the general case. +text is a partial filename. +The Bash source is a useful reference for writing application-specific +completion functions (the Bash completion functions call this and other +Readline functions). +

+ +
+
Function: char * rl_username_completion_function (const char *text, int state)
+

A completion generator for usernames. text contains a partial +username preceded by a random character (usually ‘~’). As with all +completion generators, state is zero on the first call and non-zero +for subsequent calls. +

+ +
+
+
+ +

2.6.3 Completion Variables

+ +
+
Variable: rl_compentry_func_t * rl_completion_entry_function
+

A pointer to the generator function for rl_completion_matches(). +NULL means to use rl_filename_completion_function(), +the default filename completer. +

+ +
+
Variable: rl_completion_func_t * rl_attempted_completion_function
+

A pointer to an alternative function to create matches. +The function is called with text, start, and end. +start and end are indices in rl_line_buffer defining +the boundaries of text, which is a character string. +If this function exists and returns NULL, or if this variable is +set to NULL, then rl_complete() will call the value of +rl_completion_entry_function to generate matches, otherwise the +array of strings returned will be used. +If this function sets the rl_attempted_completion_over +variable to a non-zero value, Readline will not perform its default +completion even if this function returns no matches. +

+ +
+
Variable: rl_quote_func_t * rl_filename_quoting_function
+

A pointer to a function that will quote a filename in an +application-specific fashion. This is called if filename completion is being +attempted and one of the characters in rl_filename_quote_characters +appears in a completed filename. The function is called with +text, match_type, and quote_pointer. The text +is the filename to be quoted. The match_type is either +SINGLE_MATCH, if there is only one completion match, or +MULT_MATCH. Some functions use this to decide whether or not to +insert a closing quote character. The quote_pointer is a pointer +to any opening quote character the user typed. Some functions choose +to reset this character. +

+ +
+
Variable: rl_dequote_func_t * rl_filename_dequoting_function
+

A pointer to a function that will remove application-specific quoting +characters from a filename before completion is attempted, so those +characters do not interfere with matching the text against names in +the filesystem. It is called with text, the text of the word +to be dequoted, and quote_char, which is the quoting character +that delimits the filename (usually ‘'’ or ‘"’). If +quote_char is zero, the filename was not in an embedded string. +

+ +
+
Variable: rl_linebuf_func_t * rl_char_is_quoted_p
+

A pointer to a function to call that determines whether or not a specific +character in the line buffer is quoted, according to whatever quoting +mechanism the program calling Readline uses. The function is called with +two arguments: text, the text of the line, and index, the +index of the character in the line. It is used to decide whether a +character found in rl_completer_word_break_characters should be +used to break words for the completer. +

+ +
+
Variable: rl_compignore_func_t * rl_ignore_some_completions_function
+

This function, if defined, is called by the completer when real filename +completion is done, after all the matching names have been generated. +It is passed a NULL terminated array of matches. +The first element (matches[0]) is the +maximal substring common to all matches. This function can +re-arrange the list of matches as required, but each element deleted +from the array must be freed. +

+ +
+
Variable: rl_icppfunc_t * rl_directory_completion_hook
+

This function, if defined, is allowed to modify the directory portion +of filenames Readline completes. +It could be used to expand symbolic links or shell variables in pathnames. +It is called with the address of a string (the current directory name) as an +argument, and may modify that string. +If the string is replaced with a new string, the old value should be freed. +Any modified directory name should have a trailing slash. +The modified value will be used as part of the completion, replacing +the directory portion of the pathname the user typed. +At the least, even if no other expansion is performed, this function should +remove any quote characters from the directory name, because its result will +be passed directly to opendir(). +

+

The directory completion hook returns an integer that should be non-zero if +the function modifies its directory argument. +The function should not modify the directory argument if it returns 0. +

+ +
+
Variable: rl_icppfunc_t * rl_directory_rewrite_hook;
+

If non-zero, this is the address of a function to call when completing +a directory name. This function takes the address of the directory name +to be modified as an argument. Unlike rl_directory_completion_hook, +it only modifies the directory name used in opendir, not what is +displayed when the possible completions are printed or inserted. It is +called before rl_directory_completion_hook. +At the least, even if no other expansion is performed, this function should +remove any quote characters from the directory name, because its result will +be passed directly to opendir(). +

+

The directory rewrite hook returns an integer that should be non-zero if +the function modifies its directory argument. +The function should not modify the directory argument if it returns 0. +

+ +
+
Variable: rl_icppfunc_t * rl_filename_stat_hook
+

If non-zero, this is the address of a function for the completer to +call before deciding which character to append to a completed name. +This function modifies its filename name argument, and the modified value +is passed to stat() to determine the file’s type and characteristics. +This function does not need to remove quote characters from the filename. +

+

The stat hook returns an integer that should be non-zero if +the function modifies its directory argument. +The function should not modify the directory argument if it returns 0. +

+ +
+
Variable: rl_dequote_func_t * rl_filename_rewrite_hook
+

If non-zero, this is the address of a function called when reading +directory entries from the filesystem for completion and comparing +them to the partial word to be completed. The function should +perform any necessary application or system-specific conversion on +the filename, such as converting between character sets or converting +from a filesystem format to a character input format. +The function takes two arguments: fname, the filename to be converted, +and fnlen, its length in bytes. +It must either return its first argument (if no conversion takes place) +or the converted filename in newly-allocated memory. The converted +form is used to compare against the word to be completed, and, if it +matches, is added to the list of matches. Readline will free the +allocated string. +

+ +
+
Variable: rl_compdisp_func_t * rl_completion_display_matches_hook
+

If non-zero, then this is the address of a function to call when +completing a word would normally display the list of possible matches. +This function is called in lieu of Readline displaying the list. +It takes three arguments: +(char **matches, int num_matches, int max_length) +where matches is the array of matching strings, +num_matches is the number of strings in that array, and +max_length is the length of the longest string in that array. +Readline provides a convenience function, rl_display_match_list, +that takes care of doing the display to Readline’s output stream. +You may call that function from this hook. +

+ +
+
Variable: const char * rl_basic_word_break_characters
+

The basic list of characters that signal a break between words for the +completer routine. The default value of this variable is the characters +which break words for completion in Bash: +" \t\n\"\\'`@$><=;|&{(". +

+ +
+
Variable: const char * rl_basic_quote_characters
+

A list of quote characters which can cause a word break. +

+ +
+
Variable: const char * rl_completer_word_break_characters
+

The list of characters that signal a break between words for +rl_complete_internal(). The default list is the value of +rl_basic_word_break_characters. +

+ +
+
Variable: rl_cpvfunc_t * rl_completion_word_break_hook
+

If non-zero, this is the address of a function to call when Readline is +deciding where to separate words for word completion. It should return +a character string like rl_completer_word_break_characters to be +used to perform the current completion. The function may choose to set +rl_completer_word_break_characters itself. If the function +returns NULL, rl_completer_word_break_characters is used. +

+ +
+
Variable: const char * rl_completer_quote_characters
+

A list of characters which can be used to quote a substring of the line. +Completion occurs on the entire substring, and within the substring +rl_completer_word_break_characters are treated as any other character, +unless they also appear within this list. +

+ +
+
Variable: const char * rl_filename_quote_characters
+

A list of characters that cause a filename to be quoted by the completer +when they appear in a completed filename. The default is the null string. +

+ +
+
Variable: const char * rl_special_prefixes
+

The list of characters that are word break characters, but should be +left in text when it is passed to the completion function. +Programs can use this to help determine what kind of completing to do. +For instance, Bash sets this variable to "$@" so that it can complete +shell variables and hostnames. +

+ +
+
Variable: int rl_completion_query_items
+

Up to this many items will be displayed in response to a +possible-completions call. After that, Readline asks the user for +confirmation before displaying them. +The default value is 100. A negative value +indicates that Readline should never ask for confirmation. +

+ +
+
Variable: int rl_completion_append_character
+

When a single completion alternative matches at the end of the command +line, this character is appended to the inserted completion text. The +default is a space character (‘ ’). Setting this to the null +character (‘\0’) prevents anything being appended automatically. +This can be changed in application-specific completion functions to +provide the “most sensible word separator character” according to +an application-specific command line syntax specification. +It is set to the default before any application-specific completion function +is called, and may only be changed within such a function. +

+ +
+
Variable: int rl_completion_suppress_append
+

If non-zero, rl_completion_append_character is not appended to +matches at the end of the command line, as described above. +It is set to 0 before any application-specific completion function +is called, and may only be changed within such a function. +

+ +
+
Variable: int rl_completion_quote_character
+

When Readline is completing quoted text, as delimited by one of the +characters in rl_completer_quote_characters, it sets this variable +to the quoting character found. +This is set before any application-specific completion function is called. +

+ +
+
Variable: int rl_completion_suppress_quote
+

If non-zero, Readline does not append a matching quote character when +performing completion on a quoted string. +It is set to 0 before any application-specific completion function +is called, and may only be changed within such a function. +

+ +
+
Variable: int rl_completion_found_quote
+

When Readline is completing quoted text, it sets this variable +to a non-zero value if the word being completed contains or is delimited +by any quoting characters, including backslashes. +This is set before any application-specific completion function is called. +

+ +
+ +

If non-zero, a slash will be appended to completed filenames that are +symbolic links to directory names, subject to the value of the +user-settable mark-directories variable. +This variable exists so that application-specific completion functions +can override the user’s global preference (set via the +mark-symlinked-directories Readline variable) if appropriate. +This variable is set to the user’s preference before any +application-specific completion function is called, so unless that +function modifies the value, the user’s preferences are honored. +

+ +
+
Variable: int rl_ignore_completion_duplicates
+

If non-zero, then duplicates in the matches are removed. +The default is 1. +

+ +
+
Variable: int rl_filename_completion_desired
+

Non-zero means that the results of the matches are to be treated as +filenames. This is always zero when completion is attempted, +and can only be changed +within an application-specific completion function. If it is set to a +non-zero value by such a function, directory names have a slash appended +and Readline attempts to quote completed filenames if they contain any +characters in rl_filename_quote_characters and +rl_filename_quoting_desired is set to a non-zero value. +

+ +
+
Variable: int rl_filename_quoting_desired
+

Non-zero means that the results of the matches are to be quoted using +double quotes (or an application-specific quoting mechanism) if the +completed filename contains any characters in +rl_filename_quote_chars. This is always non-zero +when completion is attempted, and can only be changed within an +application-specific completion function. +The quoting is effected via a call to the function pointed to +by rl_filename_quoting_function. +

+ +
+
Variable: int rl_attempted_completion_over
+

If an application-specific completion function assigned to +rl_attempted_completion_function sets this variable to a non-zero +value, Readline will not perform its default filename completion even +if the application’s completion function returns no matches. +It should be set only by an application’s completion function. +

+ +
+
Variable: int rl_sort_completion_matches
+

If an application sets this variable to 0, Readline will not sort the +list of completions (which implies that it cannot remove any duplicate +completions). The default value is 1, which means that Readline will +sort the completions and, depending on the value of +rl_ignore_completion_duplicates, will attempt to remove duplicate +matches. +

+ +
+
Variable: int rl_completion_type
+

Set to a character describing the type of completion Readline is currently +attempting; see the description of rl_complete_internal() +(see Completion Functions) for the list of characters. +This is set to the appropriate value before any application-specific +completion function is called, allowing such functions to present +the same interface as rl_complete(). +

+ +
+
Variable: int rl_completion_invoking_key
+

Set to the final character in the key sequence that invoked one of the +completion functions that call rl_complete_internal(). This is +set to the appropriate value before any application-specific completion +function is called. +

+ +
+
Variable: int rl_inhibit_completion
+

If this variable is non-zero, completion is inhibited. The completion +character will be inserted as any other bound to self-insert. +

+ +
+
+
+ +

2.6.4 A Short Completion Example

+ +

Here is a small application demonstrating the use of the GNU Readline +library. It is called fileman, and the source code resides in +examples/fileman.c. This sample application provides +completion of command names, line editing features, and access to the +history list. +

+
+
/* fileman.c -- A tiny application which demonstrates how to use the
+   GNU Readline library.  This application interactively allows users
+   to manipulate files and their modes. */
+
+#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>
+#include <locale.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
+
+#include <time.h>
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+extern char *xmalloc PARAMS((size_t));
+
+/* The names of functions that actually do the manipulation. */
+int com_list PARAMS((char *));
+int com_view PARAMS((char *));
+int com_rename PARAMS((char *));
+int com_stat PARAMS((char *));
+int com_pwd PARAMS((char *));
+int com_delete PARAMS((char *));
+int com_help PARAMS((char *));
+int com_cd PARAMS((char *));
+int com_quit PARAMS((char *));
+
+/* A structure which contains information on the commands this program
+   can understand. */
+
+typedef struct {
+  char *name;			/* User printable name of the function. */
+  rl_icpfunc_t *func;		/* Function to call to do the job. */
+  char *doc;			/* Documentation for this function.  */
+} COMMAND;
+
+COMMAND commands[] = {
+  { "cd", com_cd, "Change to directory DIR" },
+  { "delete", com_delete, "Delete FILE" },
+  { "help", com_help, "Display this text" },
+  { "?", com_help, "Synonym for `help'" },
+  { "list", com_list, "List files in DIR" },
+  { "ls", com_list, "Synonym for `list'" },
+  { "pwd", com_pwd, "Print the current working directory" },
+  { "quit", com_quit, "Quit using Fileman" },
+  { "rename", com_rename, "Rename FILE to NEWNAME" },
+  { "stat", com_stat, "Print out statistics on FILE" },
+  { "view", com_view, "View the contents of FILE" },
+  { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this global means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+     char *s;
+{
+  char *r;
+
+  r = xmalloc (strlen (s) + 1);
+  strcpy (r, s);
+  return (r);
+}
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *line, *s;
+
+  setlocale (LC_ALL, "");
+
+  progname = argv[0];
+
+  initialize_readline ();	/* Bind our completer. */
+
+  /* Loop reading and executing lines until the user quits. */
+  for ( ; done == 0; )
+    {
+      line = readline ("FileMan: ");
+
+      if (!line)
+        break;
+
+      /* Remove leading and trailing whitespace from the line.
+         Then, if there is anything left, add it to the history list
+         and execute it. */
+      s = stripwhite (line);
+
+      if (*s)
+        {
+          add_history (s);
+          execute_line (s);
+        }
+
+      free (line);
+    }
+  exit (0);
+}
+
+/* Execute a command line. */
+int
+execute_line (line)
+     char *line;
+{
+  register int i;
+  COMMAND *command;
+  char *word;
+
+  /* Isolate the command word. */
+  i = 0;
+  while (line[i] && whitespace (line[i]))
+    i++;
+  word = line + i;
+
+  while (line[i] && !whitespace (line[i]))
+    i++;
+
+  if (line[i])
+    line[i++] = '\0';
+
+  command = find_command (word);
+
+  if (!command)
+    {
+      fprintf (stderr, "%s: No such command for FileMan.\n", word);
+      return (-1);
+    }
+
+  /* Get argument to command, if any. */
+  while (whitespace (line[i]))
+    i++;
+
+  word = line + i;
+
+  /* Call the function. */
+  return ((*(command->func)) (word));
+}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+   command.  Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+     char *name;
+{
+  register int i;
+
+  for (i = 0; commands[i].name; i++)
+    if (strcmp (name, commands[i].name) == 0)
+      return (&commands[i]);
+
+  return ((COMMAND *)NULL);
+}
+
+/* Strip whitespace from the start and end of STRING.  Return a pointer
+   into STRING. */
+char *
+stripwhite (string)
+     char *string;
+{
+  register char *s, *t;
+
+  for (s = string; whitespace (*s); s++)
+    ;
+    
+  if (*s == 0)
+    return (s);
+
+  t = s + strlen (s) - 1;
+  while (t > s && whitespace (*t))
+    t--;
+  *++t = '\0';
+
+  return s;
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                  Interface to Readline Completion                */
+/*                                                                  */
+/* **************************************************************** */
+
+char *command_generator PARAMS((const char *, int));
+char **fileman_completion PARAMS((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete.  We want to try to complete
+   on command names if this is the first word in the line, or on filenames
+   if not. */
+initialize_readline ()
+{
+  /* Allow conditional parsing of the ~/.inputrc file. */
+  rl_readline_name = "FileMan";
+
+  /* Tell the completer that we want a crack first. */
+  rl_attempted_completion_function = fileman_completion;
+}
+
+/* Attempt to complete on the contents of TEXT.  START and END bound the
+   region of rl_line_buffer that contains the word to complete.  TEXT is
+   the word to complete.  We can use the entire contents of rl_line_buffer
+   in case we want to do some simple parsing.  Return the array of matches,
+   or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+     const char *text;
+     int start, end;
+{
+  char **matches;
+
+  matches = (char **)NULL;
+
+  /* If this word is at the start of the line, then it is a command
+     to complete.  Otherwise it is the name of a file in the current
+     directory. */
+  if (start == 0)
+    matches = rl_completion_matches (text, command_generator);
+
+  return (matches);
+}
+
+/* Generator function for command completion.  STATE lets us know whether
+   to start from scratch; without any state (i.e. STATE == 0), then we
+   start at the top of the list. */
+char *
+command_generator (text, state)
+     const char *text;
+     int state;
+{
+  static int list_index, len;
+  char *name;
+
+  /* If this is a new word to complete, initialize now.  This includes
+     saving the length of TEXT for efficiency, and initializing the index
+     variable to 0. */
+  if (!state)
+    {
+      list_index = 0;
+      len = strlen (text);
+    }
+
+  /* Return the next name which partially matches from the command list. */
+  while (name = commands[list_index].name)
+    {
+      list_index++;
+
+      if (strncmp (name, text, len) == 0)
+        return (dupstr(name));
+    }
+
+  /* If no names matched, then return NULL. */
+  return ((char *)NULL);
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                       FileMan Commands                           */
+/*                                                                  */
+/* **************************************************************** */
+
+/* String to pass to system ().  This is for the LIST, VIEW and RENAME
+   commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+     char *arg;
+{
+  if (!arg)
+    arg = "";
+
+  sprintf (syscom, "ls -FClg %s", arg);
+  return (system (syscom));
+}
+
+com_view (arg)
+     char *arg;
+{
+  if (!valid_argument ("view", arg))
+    return 1;
+
+#if defined (__MSDOS__)
+  /* more.com doesn't grok slashes in pathnames */
+  sprintf (syscom, "less %s", arg);
+#else
+  sprintf (syscom, "more %s", arg);
+#endif
+  return (system (syscom));
+}
+
+com_rename (arg)
+     char *arg;
+{
+  too_dangerous ("rename");
+  return (1);
+}
+
+com_stat (arg)
+     char *arg;
+{
+  struct stat finfo;
+
+  if (!valid_argument ("stat", arg))
+    return (1);
+
+  if (stat (arg, &finfo) == -1)
+    {
+      perror (arg);
+      return (1);
+    }
+
+  printf ("Statistics for `%s':\n", arg);
+
+  printf ("%s has %d link%s, and is %d byte%s in length.\n",
+	  arg,
+          finfo.st_nlink,
+          (finfo.st_nlink == 1) ? "" : "s",
+          finfo.st_size,
+          (finfo.st_size == 1) ? "" : "s");
+  printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+  printf ("      Last access at: %s", ctime (&finfo.st_atime));
+  printf ("    Last modified at: %s", ctime (&finfo.st_mtime));
+  return (0);
+}
+
+com_delete (arg)
+     char *arg;
+{
+  too_dangerous ("delete");
+  return (1);
+}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+   not present. */
+com_help (arg)
+     char *arg;
+{
+  register int i;
+  int printed = 0;
+
+  for (i = 0; commands[i].name; i++)
+    {
+      if (!*arg || (strcmp (arg, commands[i].name) == 0))
+        {
+          printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+          printed++;
+        }
+    }
+
+  if (!printed)
+    {
+      printf ("No commands match `%s'.  Possibilities 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);
+}
+
+ +
+
+
+
+
+ +

Appendix A GNU Free Documentation License

+ +
Version 1.3, 3 November 2008 +
+ +
+
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+http://fsf.org/
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+ +
    +
  1. PREAMBLE + +

    The purpose of this License is to make a manual, textbook, or other +functional and useful document free in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. +

    +

    This License is a kind of “copyleft”, which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. +

    +

    We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. +

    +
  2. APPLICABILITY AND DEFINITIONS + +

    This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The “Document”, below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as “you”. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. +

    +

    A “Modified Version” of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. +

    +

    A “Secondary Section” is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document’s overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. +

    +

    The “Invariant Sections” are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. +

    +

    The “Cover Texts” are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. +

    +

    A “Transparent” copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not “Transparent” is called “Opaque”. +

    +

    Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. +

    +

    The “Title Page” means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, “Title Page” means +the text near the most prominent appearance of the work’s title, +preceding the beginning of the body of the text. +

    +

    The “publisher” means any person or entity that distributes copies +of the Document to the public. +

    +

    A section “Entitled XYZ” means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as “Acknowledgements”, +“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” +of such a section when you modify the Document means that it remains a +section “Entitled XYZ” according to this definition. +

    +

    The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. +

    +
  3. VERBATIM COPYING + +

    You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. +

    +

    You may also lend copies, under the same conditions stated above, and +you may publicly display copies. +

    +
  4. COPYING IN QUANTITY + +

    If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document’s license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. +

    +

    If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. +

    +

    If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. +

    +

    It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. +

    +
  5. MODIFICATIONS + +

    You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: +

    +
      +
    1. Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
    2. List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +
    3. State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
    4. Preserve all the copyright notices of the Document. + +
    5. Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
    6. Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
    7. Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document’s license notice. + +
    8. Include an unaltered copy of this License. + +
    9. Preserve the section Entitled “History”, Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled “History” in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
    10. Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the “History” section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +
    12. Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
    13. Delete any section Entitled “Endorsements”. Such a section +may not be included in the Modified Version. + +
    14. Do not retitle any existing section to be Entitled “Endorsements” or +to conflict in title with any Invariant Section. + +
    15. Preserve any Warranty Disclaimers. +
    + +

    If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version’s license notice. +These titles must be distinct from any other section titles. +

    +

    You may add a section Entitled “Endorsements”, provided it contains +nothing but endorsements of your Modified Version by various +parties—for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. +

    +

    You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. +

    +

    The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. +

    +
  6. COMBINING DOCUMENTS + +

    You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. +

    +

    The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. +

    +

    In the combination, you must combine any sections Entitled “History” +in the various original documents, forming one section Entitled +“History”; likewise combine any sections Entitled “Acknowledgements”, +and any sections Entitled “Dedications”. You must delete all +sections Entitled “Endorsements.” +

    +
  7. COLLECTIONS OF DOCUMENTS + +

    You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. +

    +

    You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. +

    +
  8. AGGREGATION WITH INDEPENDENT WORKS + +

    A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an “aggregate” if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation’s users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. +

    +

    If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document’s Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. +

    +
  9. TRANSLATION + +

    Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. +

    +

    If a section in the Document is Entitled “Acknowledgements”, +“Dedications”, or “History”, the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. +

    +
  10. TERMINATION + +

    You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. +

    +

    However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. +

    +

    Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. +

    +

    Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. +

    +
  11. FUTURE REVISIONS OF THIS LICENSE + +

    The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. +

    +

    Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License “or any later version” applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy’s public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. +

    +
  12. RELICENSING + +

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +“Massive Multiauthor Collaboration” (or “MMC”) contained in the +site means any set of copyrightable works thus published on the MMC +site. +

    +

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. +

    +

    “Incorporate” means to publish or republish a Document, in whole or +in part, as part of another Document. +

    +

    An MMC is “eligible for relicensing” if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. +

    +

    The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. +

    +
+ +

ADDENDUM: How to use this License for your documents

+ +

To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: +

+
+
  Copyright (C)  year  your name.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+
+ +

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the “with…Texts.” line with this: +

+
+
    with the Invariant Sections being list their titles, with
+    the Front-Cover Texts being list, and with the Back-Cover Texts
+    being list.
+
+ +

If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. +

+

If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. +

+ + +
+
+ +
+ +

Function and Variable Index

+
Jump to:   _ +   +
+A +   +B +   +C +   +D +   +E +   +F +   +H +   +I +   +K +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +Y +   +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index Entry  Section

_
_rl_digit_p: Utility Functions
_rl_digit_value: Utility Functions
_rl_lowercase_p: Utility Functions
_rl_to_lower: Utility Functions
_rl_to_upper: Utility Functions
_rl_uppercase_p: Utility Functions

A
abort (C-g): Miscellaneous Commands
accept-line (Newline or Return): Commands For History
active-region-end-color: Readline Init File Syntax
active-region-start-color: Readline Init File Syntax

B
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
bind-tty-special-chars: Readline Init File Syntax
blink-matching-paren: Readline Init File Syntax
bracketed-paste-begin (): Commands For Text

C
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-display (M-C-l): Commands For Moving
clear-screen (C-l): Commands For Moving
colored-completion-prefix: Readline Init File Syntax
colored-stats: Readline Init File Syntax
comment-begin: Readline Init File Syntax
complete (TAB): Commands For Completion
completion-display-width: Readline Init File Syntax
completion-ignore-case: Readline Init File Syntax
completion-map-case: Readline Init File Syntax
completion-prefix-display-length: Readline Init File Syntax
completion-query-items: Readline Init File Syntax
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

D
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
disable-completion: Readline Init File Syntax
do-lowercase-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

E
echo-control-characters: Readline Init File Syntax
editing-mode: Readline Init File Syntax
emacs-editing-mode (C-e): Miscellaneous Commands
emacs-mode-string: Readline Init File Syntax
enable-active-region: Readline Init File Syntax
enable-bracketed-paste: Readline Init File Syntax
enable-keypad: Readline Init File Syntax
end-kbd-macro (C-x )): Keyboard Macros
end-of-file (usually C-d): Commands For Text
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

F
fetch-history (): Commands For History
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

H
history-preserve-point: Readline Init File Syntax
history-search-backward (): Commands For History
history-search-forward (): Commands For History
history-size: Readline Init File Syntax
history-substring-search-backward (): Commands For History
history-substring-search-forward (): Commands For History
horizontal-scroll-mode: Readline Init File Syntax

I
input-meta: Readline Init File Syntax
insert-comment (M-#): Miscellaneous Commands
insert-completions (M-*): Commands For Completion
isearch-terminators: Readline Init File Syntax

K
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

M
mark-modified-lines: Readline Init File Syntax
mark-symlinked-directories: Readline Init File Syntax
match-hidden-files: Readline Init File Syntax
menu-complete (): Commands For Completion
menu-complete-backward (): Commands For Completion
menu-complete-display-prefix: Readline Init File Syntax
meta-flag: Readline Init File Syntax

N
next-history (C-n): Commands For History
next-screen-line (): Commands For Moving
non-incremental-forward-search-history (M-n): Commands For History
non-incremental-reverse-search-history (M-p): Commands For History

O
operate-and-get-next (C-o): Commands For History
output-meta: Readline Init File Syntax
overwrite-mode (): Commands For Text

P
page-completions: Readline Init File Syntax
possible-completions (M-?): Commands For Completion
prefix-meta (ESC): Miscellaneous Commands
previous-history (C-p): Commands For History
previous-screen-line (): Commands For Moving
print-last-kbd-macro (): Keyboard Macros

Q
quoted-insert (C-q or C-v): Commands For Text

R
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-all-at-newline: Readline Init File Syntax
revert-line (M-r): Miscellaneous Commands
rl_activate_mark: Miscellaneous Functions
rl_add_defun: Function Naming
rl_add_funmap_entry: Associating Function Names and Bindings
rl_add_undo: Allowing Undoing
rl_alphabetic: Utility Functions
rl_already_prompted: Readline Variables
rl_attempted_completion_function: Completion Variables
rl_attempted_completion_over: Completion Variables
rl_basic_quote_characters: Completion Variables
rl_basic_word_break_characters: Completion Variables
rl_begin_undo_group: Allowing Undoing
rl_binding_keymap: Readline Variables
rl_bind_key: Binding Keys
rl_bind_keyseq: Binding Keys
rl_bind_keyseq_if_unbound: Binding Keys
rl_bind_keyseq_if_unbound_in_map: Binding Keys
rl_bind_keyseq_in_map: Binding Keys
rl_bind_key_if_unbound: Binding Keys
rl_bind_key_if_unbound_in_map: Binding Keys
rl_bind_key_in_map: Binding Keys
rl_callback_handler_install: Alternate Interface
rl_callback_handler_remove: Alternate Interface
rl_callback_read_char: Alternate Interface
rl_callback_sigcleanup: Alternate Interface
rl_catch_signals: Readline Signal Handling
rl_catch_sigwinch: Readline Signal Handling
rl_change_environment: Readline Signal Handling
rl_char_is_quoted_p: Completion Variables
rl_check_signals: Readline Signal Handling
rl_cleanup_after_signal: Readline Signal Handling
rl_clear_history: Miscellaneous Functions
rl_clear_message: Redisplay
rl_clear_pending_input: Character Input
rl_clear_signals: Readline Signal Handling
rl_clear_visible_line: Redisplay
rl_complete: How Completing Works
rl_complete: Completion Functions
rl_completer_quote_characters: Completion Variables
rl_completer_word_break_characters: Completion Variables
rl_complete_internal: Completion Functions
rl_completion_append_character: Completion Variables
rl_completion_display_matches_hook: Completion Variables
rl_completion_entry_function: How Completing Works
rl_completion_entry_function: Completion Variables
rl_completion_found_quote: Completion Variables
rl_completion_invoking_key: Completion Variables
rl_completion_mark_symlink_dirs: Completion Variables
rl_completion_matches: Completion Functions
rl_completion_mode: Completion Functions
rl_completion_query_items: Completion Variables
rl_completion_quote_character: Completion Variables
rl_completion_suppress_append: Completion Variables
rl_completion_suppress_quote: Completion Variables
rl_completion_type: Completion Variables
rl_completion_word_break_hook: Completion Variables
rl_copy_keymap: Keymaps
rl_copy_text: Modifying Text
rl_crlf: Redisplay
rl_deactivate_mark: Miscellaneous Functions
rl_delete_text: Modifying Text
rl_deprep_terminal: Terminal Management
rl_deprep_term_function: Readline Variables
rl_ding: Utility Functions
rl_directory_completion_hook: Completion Variables
rl_directory_rewrite_hook;: Completion Variables
rl_discard_keymap: Keymaps
rl_dispatching: Readline Variables
rl_display_match_list: Utility Functions
rl_display_prompt: Readline Variables
rl_done: Readline Variables
rl_do_undo: Allowing Undoing
rl_echo_signal_char: Readline Signal Handling
rl_editing_mode: Readline Variables
rl_empty_keymap: Keymaps
rl_end: Readline Variables
rl_end_undo_group: Allowing Undoing
rl_eof_found: Readline Variables
rl_erase_empty_line: Readline Variables
rl_event_hook: Readline Variables
rl_execute_next: Character Input
rl_executing_key: Readline Variables
rl_executing_keymap: Readline Variables
rl_executing_keyseq: Readline Variables
rl_executing_macro: Readline Variables
rl_expand_prompt: Redisplay
rl_explicit_arg: Readline Variables
rl_extend_line_buffer: Utility Functions
rl_filename_completion_desired: Completion Variables
rl_filename_completion_function: Completion Functions
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_filename_rewrite_hook: Completion Variables
rl_filename_stat_hook: Completion Variables
rl_forced_update_display: Redisplay
rl_free: Utility Functions
rl_free_keymap: Keymaps
rl_free_line_state: Readline Signal Handling
rl_free_undo_list: Allowing Undoing
rl_function_dumper: Associating Function Names and Bindings
rl_function_of_keyseq: Associating Function Names and Bindings
rl_function_of_keyseq_len: Associating Function Names and Bindings
rl_funmap_names: Associating Function Names and Bindings
rl_generic_bind: Binding Keys
rl_getc: Character Input
rl_getc_function: Readline Variables
rl_get_keymap: Keymaps
rl_get_keymap_by_name: Keymaps
rl_get_keymap_name: Keymaps
rl_get_screen_size: Readline Signal Handling
rl_get_termcap: Miscellaneous Functions
rl_gnu_readline_p: 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_input_available_hook: Readline Variables
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_keep_mark_active: Miscellaneous Functions
rl_key_sequence_length: Readline Variables
rl_kill_text: Modifying Text
rl_last_func: Readline Variables
rl_library_version: Readline Variables
rl_line_buffer: Readline Variables
rl_list_funmap_names: Associating Function Names and Bindings
rl_macro_bind: Miscellaneous Functions
rl_macro_dumper: Miscellaneous Functions
rl_make_bare_keymap: Keymaps
rl_make_keymap: Keymaps
rl_mark: Readline Variables
rl_mark_active_p: Miscellaneous Functions
rl_message: Redisplay
rl_modifying: Allowing Undoing
rl_named_function: Associating Function Names and Bindings
rl_numeric_arg: Readline Variables
rl_num_chars_to_read: Readline Variables
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_pending_signal: Readline Signal Handling
rl_persistent_signal_handlers: Readline Signal Handling
rl_point: Readline Variables
rl_possible_completions: Completion Functions
rl_prefer_env_winsize: Readline Variables
rl_prep_terminal: Terminal Management
rl_prep_term_function: Readline Variables
rl_pre_input_hook: Readline Variables
rl_prompt: Readline Variables
rl_push_macro_input: Modifying Text
rl_readline_name: Readline Variables
rl_readline_state: Readline Variables
rl_readline_version: Readline Variables
rl_read_init_file: Binding Keys
rl_read_key: Character Input
rl_redisplay: Redisplay
rl_redisplay_function: Readline Variables
rl_replace_line: Utility Functions
rl_reset_after_signal: Readline Signal Handling
rl_reset_line_state: Redisplay
rl_reset_screen_size: Readline Signal Handling
rl_reset_terminal: Terminal Management
rl_resize_terminal: Readline Signal Handling
rl_restore_prompt: Redisplay
rl_restore_state: Utility Functions
rl_save_prompt: Redisplay
rl_save_state: Utility Functions
rl_set_key: Binding Keys
rl_set_keyboard_input_timeout: Character Input
rl_set_keymap: Keymaps
rl_set_keymap_name: Keymaps
rl_set_paren_blink_timeout: Miscellaneous Functions
rl_set_prompt: Redisplay
rl_set_screen_size: Readline Signal Handling
rl_set_signals: Readline Signal Handling
rl_set_timeout: Character Input
rl_show_char: Redisplay
rl_signal_event_hook: Readline Variables
rl_sort_completion_matches: Completion Variables
rl_special_prefixes: Completion Variables
rl_startup_hook: Readline Variables
rl_stuff_char: Character Input
rl_terminal_name: Readline Variables
rl_timeout_event_hook: Readline Variables
rl_timeout_remaining: Character Input
rl_trim_arg_from_keyseq: Associating Function Names and Bindings
rl_tty_set_default_bindings: Terminal Management
rl_tty_set_echoing: Terminal Management
rl_tty_unset_default_bindings: Terminal Management
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
rl_username_completion_function: Completion Functions
rl_variable_bind: Miscellaneous Functions
rl_variable_dumper: Miscellaneous Functions
rl_variable_value: Miscellaneous Functions

S
self-insert (a, b, A, 1, !, …): Commands For Text
set-mark (C-@): Miscellaneous Commands
shell-transpose-words (M-C-t): Commands For Killing
show-all-if-ambiguous: Readline Init File Syntax
show-all-if-unmodified: Readline Init File Syntax
show-mode-in-prompt: Readline Init File Syntax
skip-completed-text: Readline Init File Syntax
skip-csi-sequence (): Miscellaneous Commands
start-kbd-macro (C-x (): Keyboard Macros

T
tab-insert (M-TAB): Commands For Text
tilde-expand (M-~): Miscellaneous Commands
transpose-chars (C-t): Commands For Text
transpose-words (M-t): Commands For Text

U
undo (C-_ or C-x C-u): Miscellaneous Commands
universal-argument (): Numeric Arguments
unix-filename-rubout (): Commands For Killing
unix-line-discard (C-u): Commands For Killing
unix-word-rubout (C-w): Commands For Killing
upcase-word (M-u): Commands For Text

V
vi-cmd-mode-string: Readline Init File Syntax
vi-editing-mode (M-C-j): Miscellaneous Commands
vi-ins-mode-string: Readline Init File Syntax
visible-stats: Readline Init File Syntax

Y
yank (C-y): Commands For Killing
yank-last-arg (M-. or M-_): Commands For History
yank-nth-arg (M-C-y): Commands For History
yank-pop (M-y): Commands For Killing

+
Jump to:   _ +   +
+A +   +B +   +C +   +D +   +E +   +F +   +H +   +I +   +K +   +M +   +N +   +O +   +P +   +Q +   +R +   +S +   +T +   +U +   +V +   +Y +   +
+ +
+
+ + + + + diff --git a/doc/readline.info b/doc/readline.info new file mode 100644 index 0000000..4ea6b8c --- /dev/null +++ b/doc/readline.info @@ -0,0 +1,5320 @@ +This is readline.info, produced by makeinfo version 6.8 from rlman.texi. + +This manual describes the GNU Readline Library (version 8.2, 19 +September 2022), a library which aids in the consistency of user +interface across discrete programs which provide a command line +interface. + + Copyright (C) 1988-2022 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". + +INFO-DIR-SECTION Libraries +START-INFO-DIR-ENTRY +* Readline: (readline). The GNU readline library API. +END-INFO-DIR-ENTRY + + +File: readline.info, Node: Top, Next: Command Line Editing, Up: (dir) + +GNU Readline Library +******************** + +This document describes the GNU Readline Library, a utility which aids +in the consistency of user interface across discrete programs which +provide a command line interface. The Readline home page is +. + +* Menu: + +* Command Line Editing:: GNU Readline User's Manual. +* Programming with GNU Readline:: GNU Readline Programmer's Manual. +* GNU Free Documentation License:: License for copying this 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 + +1 Command Line Editing +********************** + +This chapter describes the basic features of the GNU command line +editing interface. + +* Menu: + +* Introduction and Notation:: Notation used in this text. +* Readline Interaction:: The minimum set of commands for editing a line. +* Readline Init File:: Customizing Readline from a user's view. +* Bindable Readline Commands:: A description of most of the Readline commands + available for binding +* Readline vi Mode:: A short description of how to make Readline + behave like the vi editor. + + +File: readline.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing + +1.1 Introduction to Line Editing +================================ + +The following paragraphs describe the notation used to represent +keystrokes. + + The text 'C-k' is read as 'Control-K' and describes the character +produced when the 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 +key is pressed. The Meta key is labeled on many keyboards. On +keyboards with two keys labeled (usually to either side of the +space bar), the on the left side is generally set to work as a +Meta key. The 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, or another key working as a +Meta key, the identical keystroke can be generated by typing +_first_, and then typing . Either process is known as "metafying" +the 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, , +, , , , and all stand for themselves when seen +in this text, or in an init file (*note Readline Init File::). If your +keyboard lacks a key, typing will produce the desired +character. The key may be labeled or on some +keyboards. + + +File: readline.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing + +1.2 Readline Interaction +======================== + +Often during an interactive session you type in a long line of text, +only to notice that the first word on the line is misspelled. The +Readline library gives you a set of commands for manipulating the text +as you type it in, allowing you to just fix your typo, and not forcing +you to retype the majority of the line. Using these editing commands, +you move the cursor to the place that needs correction, and delete or +insert the text of the corrections. Then, when you are satisfied with +the line, you simply press . You do not have to be at the end of +the line to press ; 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 + +1.2.1 Readline Bare Essentials +------------------------------ + +In order to enter characters into the line, simply type them. The typed +character appears where the cursor was, and then the cursor moves one +space to the right. If you mistype a character, you can use your erase +character to back up and delete the mistyped character. + + Sometimes you may mistype a character, and not notice the error until +you have typed several other characters. In that case, you can type +'C-b' to move the cursor to the left, and then correct your mistake. +Afterwards, you can move the cursor to the right with 'C-f'. + + When you add text in the middle of a line, you will notice that +characters to the right of the cursor are 'pushed over' to make room for +the text that you have inserted. Likewise, when you delete text behind +the cursor, characters to the right of the cursor are 'pulled back' to +fill in the blank space created by the removal of the text. A list of +the bare essentials for editing the text of an input line follows. + +'C-b' + Move back one character. +'C-f' + Move forward one character. + or + 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 key might be set to +delete the character to the left of the cursor and the 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 + +1.2.2 Readline Movement Commands +-------------------------------- + +The above table describes the most basic keystrokes that you need in +order to do editing of the input line. For your convenience, many other +commands have been added in addition to 'C-b', 'C-f', 'C-d', and . +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 + +1.2.3 Readline Killing Commands +------------------------------- + +"Killing" text means to delete the text from the line, but to save it +away for later use, usually by "yanking" (re-inserting) it back into the +line. ('Cut' and 'paste' are more recent jargon for 'kill' and 'yank'.) + + If the description for a command says that it 'kills' text, then you +can be sure that you can get the text back in a different (or the same) +place later. + + When you use a kill command, the text is saved in a "kill-ring". Any +number of consecutive kills save all of the killed text together, so +that when you yank it back, you get it all. The kill ring is not line +specific; the text that you killed on a previously typed line is +available to be yanked back later, when you are typing another line. + + Here is the list of commands for killing text. + +'C-k' + Kill the text from the current cursor position to the end of the + line. + +'M-d' + Kill from the cursor to the end of the current word, or, if between + words, to the end of the next word. Word boundaries are the same + as those used by 'M-f'. + +'M-' + Kill from the cursor to the start of the current word, or, if + between words, to the start of the previous word. Word boundaries + are the same as those used by 'M-b'. + +'C-w' + Kill from the cursor to the previous whitespace. This is different + than 'M-' 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 + +1.2.4 Readline Arguments +------------------------ + +You can pass numeric arguments to Readline commands. Sometimes the +argument acts as a repeat count, other times it is the sign of the +argument that is significant. If you pass a negative argument to a +command which normally acts in a forward direction, that command will +act in a backward direction. For example, to kill text back to the +start of the line, you might type 'M-- C-k'. + + The general way to pass numeric arguments to a command is to type +meta digits before the command. If the first 'digit' typed is a minus +sign ('-'), then the sign of the argument will be negative. Once you +have typed one meta digit to get the argument started, you can type the +remainder of the digits, and then the command. For example, to give the +'C-d' command an argument of 10, you could type 'M-1 0 C-d', which will +delete the next ten characters on the input line. + + +File: readline.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction + +1.2.5 Searching for Commands in the History +------------------------------------------- + +Readline provides commands for searching through the command history for +lines containing a specified string. There are two search modes: +"incremental" and "non-incremental". + + Incremental searches begin before the user has finished typing the +search string. As each character of the search string is typed, +Readline displays the next entry from the history matching the string +typed so far. An incremental search requires only as many characters as +needed to find the desired history entry. To search backward in the +history for a particular string, type 'C-r'. Typing 'C-s' searches +forward through the history. The characters present in the value of the +'isearch-terminators' variable are used to terminate an incremental +search. If that variable has not been assigned a value, the 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 will terminate the +search and accept the line, thereby executing the command from the +history list. A movement command will terminate the search, make the +last line found the current line, and begin editing. + + Readline remembers the last incremental search string. If two 'C-r's +are typed without any intervening characters defining a new search +string, any remembered search string is used. + + Non-incremental searches read the entire search string before +starting to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. + + +File: readline.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing + +1.3 Readline Init File +====================== + +Although the Readline library comes with a set of Emacs-like keybindings +installed by default, it is possible to use a different set of +keybindings. Any user can customize programs that use Readline by +putting commands in an "inputrc" file, conventionally in their home +directory. The name of this file is taken from the value of the +environment variable 'INPUTRC'. If that variable is unset, the default +is '~/.inputrc'. If that file does not exist or cannot be read, the +ultimate default is '/etc/inputrc'. + + When a program which uses the Readline library starts up, the init +file is read, and the key bindings are set. + + In addition, the 'C-x C-r' command re-reads this init file, thus +incorporating any changes that you might have made to it. + +* Menu: + +* Readline Init File Syntax:: Syntax for the commands in the inputrc file. + +* Conditional Init Constructs:: Conditional key bindings in the inputrc file. + +* Sample Init File:: An example inputrc file. + + +File: readline.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File + +1.3.1 Readline Init File Syntax +------------------------------- + +There are only a few basic constructs allowed in the Readline init file. +Blank lines are ignored. Lines beginning with a '#' are comments. +Lines beginning with a '$' indicate conditional constructs (*note +Conditional Init Constructs::). Other lines denote variable settings +and key bindings. + +Variable Settings + You can modify the run-time behavior of Readline by altering the + values of variables in Readline using the 'set' command within the + init file. The syntax is simple: + + set VARIABLE VALUE + + Here, for example, is how to change from the default Emacs-like key + binding to use 'vi' line editing commands: + + set editing-mode vi + + Variable names and values, where appropriate, are recognized + without regard to case. Unrecognized variable names are ignored. + + Boolean variables (those that can be set to on or off) are set to + on if the value is null or empty, ON (case-insensitive), or 1. Any + other value results in the variable being set to off. + + A great deal of run-time behavior is changeable with the following + variables. + + 'active-region-start-color' + A string variable that controls the text color and background + when displaying the text in the active region (see the + description of 'enable-active-region' below). This string + must not take up any physical character positions on the + display, so it should consist only of terminal escape + sequences. It is output to the terminal before displaying the + text in the active region. This variable is reset to the + default value whenever the terminal type changes. The default + value is the string that puts the terminal in standout mode, + as obtained from the terminal's terminfo description. A + sample value might be '\e[01;33m'. + + 'active-region-end-color' + A string variable that "undoes" the effects of + 'active-region-start-color' and restores "normal" terminal + display appearance after displaying text in the active region. + This string must not take up any physical character positions + on the display, so it should consist only of terminal escape + sequences. It is output to the terminal after displaying the + text in the active region. This variable is reset to the + default value whenever the terminal type changes. The default + value is the string that restores the terminal from standout + mode, as obtained from the terminal's terminfo description. A + sample value might be '\e[0m'. + + 'bell-style' + Controls what happens when Readline wants to ring the terminal + bell. If set to 'none', Readline never rings the bell. If + set to 'visible', Readline uses a visible bell if one is + available. If set to 'audible' (the default), Readline + attempts to ring the terminal's bell. + + 'bind-tty-special-chars' + If set to 'on' (the default), Readline attempts to bind the + control characters treated specially by the kernel's terminal + driver to their Readline equivalents. + + 'blink-matching-paren' + If set to 'on', Readline attempts to briefly move the cursor + to an opening parenthesis when a closing parenthesis is + inserted. The default is 'off'. + + 'colored-completion-prefix' + If set to 'on', when listing completions, Readline displays + the common prefix of the set of possible completions using a + different color. The color definitions are taken from the + value of the 'LS_COLORS' environment variable. If there is a + color definition in 'LS_COLORS' for the custom suffix + 'readline-colored-completion-prefix', Readline uses this color + for the common prefix instead of its default. The default is + 'off'. + + 'colored-stats' + If set to 'on', Readline displays possible completions using + different colors to indicate their file type. The color + definitions are taken from the value of the 'LS_COLORS' + environment variable. The default is 'off'. + + 'comment-begin' + The string to insert at the beginning of the line when the + 'insert-comment' command is executed. The default value is + '"#"'. + + 'completion-display-width' + The number of screen columns used to display possible matches + when performing completion. The value is ignored if it is + less than 0 or greater than the terminal screen width. A + value of 0 will cause matches to be displayed one per line. + The default value is -1. + + 'completion-ignore-case' + If set to 'on', Readline performs filename matching and + completion in a case-insensitive fashion. The default value + is 'off'. + + 'completion-map-case' + If set to 'on', and COMPLETION-IGNORE-CASE is enabled, + Readline treats hyphens ('-') and underscores ('_') as + equivalent when performing case-insensitive filename matching + and completion. The default value is 'off'. + + 'completion-prefix-display-length' + The length in characters of the common prefix of a list of + possible completions that is displayed without modification. + When set to a value greater than zero, common prefixes longer + than this value are replaced with an ellipsis when displaying + possible completions. + + 'completion-query-items' + The number of possible completions that determines when the + user is asked whether the list of possibilities should be + displayed. If the number of possible completions is greater + than or equal to this value, Readline will ask whether or not + the user wishes to view them; otherwise, they are simply + listed. This variable must be set to an integer value greater + than or equal to zero. A zero value means Readline should + never ask; negative values are treated as zero. 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 character, converting them + to a meta-prefixed key sequence. The default value is 'on', + but will be set to 'off' if the locale is one that contains + eight-bit characters. This variable is dependent on the + 'LC_CTYPE' locale category, and may change if the locale is + changed. + + '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'. + + 'echo-control-characters' + When set to 'on', on operating systems that indicate they + support it, Readline echoes a character corresponding to a + signal generated from the keyboard. The default is 'on'. + + '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'. + + 'emacs-mode-string' + If the SHOW-MODE-IN-PROMPT variable is enabled, this string is + displayed immediately before the last line of the primary + prompt when emacs editing mode is active. The value is + expanded like a key binding, so the standard set of meta- and + control prefixes and backslash escape sequences is available. + Use the '\1' and '\2' escapes to begin and end sequences of + non-printing characters, which can be used to embed a terminal + control sequence into the mode string. The default is '@'. + + 'enable-active-region' + The "point" is the current cursor position, and "mark" refers + to a saved cursor position (*note Commands For Moving::). The + text between the point and mark is referred to as the + "region". When this variable is set to 'On', Readline allows + certain commands to designate the region as "active". When + the region is active, Readline highlights the text in the + region using the value of the 'active-region-start-color', + which defaults to the string that enables the terminal's + standout mode. The active region shows the text inserted by + bracketed-paste and any matching text found by incremental and + non-incremental history searches. The default is 'On'. + + 'enable-bracketed-paste' + When set to 'On', Readline configures the terminal to insert + each paste into the editing buffer as a single string of + characters, instead of treating each character as if it had + been read from the keyboard. This is called putting the + terminal into "bracketed paste mode"; it prevents Readline + from executing any editing commands bound to key sequences + appearing in the pasted text. The default is 'On'. + + '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'. + + 'enable-meta-key' + When set to 'on', Readline will try to enable any meta + modifier key the terminal claims to support when it is called. + On many terminals, the meta key is used to send eight-bit + characters. The default is 'on'. + + 'expand-tilde' + If set to 'on', tilde expansion is performed when Readline + attempts word completion. The default is 'off'. + + 'history-preserve-point' + If set to 'on', the history code attempts to place the point + (the current cursor position) at the same location on each + history line retrieved with 'previous-history' or + 'next-history'. The default is 'off'. + + 'history-size' + Set the maximum number of history entries saved in the history + list. If set to zero, any existing history entries are + deleted and no new entries are saved. If set to a value less + than zero, the number of history entries is not limited. By + default, the number of history entries is not limited. If an + attempt is made to set HISTORY-SIZE to a non-numeric value, + the maximum number of history entries will be set to 500. + + '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. This variable is automatically set to 'on' + for terminals of height 1. By default, this variable is set + to 'off'. + + 'input-meta' + If set to 'on', Readline will enable eight-bit input (it will + not clear the eighth bit in the characters it reads), + regardless of what the terminal claims it can support. The + default value is 'off', but Readline will set it to 'on' if + the locale contains eight-bit characters. The name + 'meta-flag' is a synonym for this variable. This variable is + dependent on the 'LC_CTYPE' locale category, and may change if + the locale is changed. + + '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 and 'C-J' will terminate + an incremental search. + + 'keymap' + Sets Readline's idea of the current keymap for key binding + commands. Built-in 'keymap' names are 'emacs', + 'emacs-standard', 'emacs-meta', 'emacs-ctlx', 'vi', 'vi-move', + 'vi-command', and 'vi-insert'. 'vi' is equivalent to + 'vi-command' ('vi-move' is also a synonym); 'emacs' is + equivalent to 'emacs-standard'. Applications may add + additional names. The default value is 'emacs'. The value of + the 'editing-mode' variable also affects the default keymap. + + 'keyseq-timeout' + Specifies the duration Readline will wait for a character when + reading an ambiguous key sequence (one that can form a + complete key sequence using the input read so far, or can take + additional input to complete a longer key sequence). If no + input is received within the timeout, Readline will use the + shorter but complete key sequence. Readline uses this value + to determine whether or not input is available on the current + input source ('rl_instream' by default). The value is + specified in milliseconds, so a value of 1000 means that + Readline will wait one second for additional input. If this + variable is set to a value less than or equal to zero, or to a + non-numeric value, Readline will wait until another key is + pressed to decide which key sequence to complete. The default + value is '500'. + + 'mark-directories' + If set to 'on', completed directory names have a slash + appended. The default is 'on'. + + 'mark-modified-lines' + This variable, when set to 'on', causes Readline to display an + asterisk ('*') at the start of history lines which have been + modified. This variable is 'off' by default. + + 'mark-symlinked-directories' + If set to 'on', completed names which are symbolic links to + directories have a slash appended (subject to the value of + 'mark-directories'). The default is 'off'. + + 'match-hidden-files' + This variable, when set to 'on', causes Readline to match + files whose names begin with a '.' (hidden files) when + performing filename completion. If set to 'off', the leading + '.' must be supplied by the user in the filename to be + completed. This variable is 'on' by default. + + 'menu-complete-display-prefix' + If set to 'on', menu completion displays the common prefix of + the list of possible completions (which may be empty) before + cycling through the list. The default is 'off'. + + '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', but Readline will set it to + 'on' if the locale contains eight-bit characters. This + variable is dependent on the 'LC_CTYPE' locale category, and + may change if the locale is changed. + + 'page-completions' + If set to 'on', Readline uses an internal 'more'-like pager to + display a screenful of possible completions at a time. This + variable is 'on' by default. + + 'print-completions-horizontally' + If set to 'on', Readline will display completions with matches + sorted horizontally in alphabetical order, rather than down + the screen. The default is 'off'. + + 'revert-all-at-newline' + If set to 'on', Readline will undo all changes to history + lines before returning when 'accept-line' is executed. By + default, history lines may be modified and retain individual + undo lists across calls to 'readline()'. The default is + 'off'. + + 'show-all-if-ambiguous' + This alters the default behavior of the completion functions. + If set to 'on', words which have more than one possible + completion cause the matches to be listed immediately instead + of ringing the bell. The default value is 'off'. + + 'show-all-if-unmodified' + This alters the default behavior of the completion functions + in a fashion similar to SHOW-ALL-IF-AMBIGUOUS. If set to + 'on', words which have more than one possible completion + without any possible partial completion (the possible + completions don't share a common prefix) cause the matches to + be listed immediately instead of ringing the bell. The + default value is 'off'. + + 'show-mode-in-prompt' + If set to 'on', add a string to the beginning of the prompt + indicating the editing mode: emacs, vi command, or vi + insertion. The mode strings are user-settable (e.g., + EMACS-MODE-STRING). The default value is 'off'. + + 'skip-completed-text' + If set to 'on', this alters the default completion behavior + when inserting a single match into the line. It's only active + when performing completion in the middle of a word. If + enabled, Readline does not insert characters from the + completion that match characters after point in the word being + completed, so portions of the word following the cursor are + not duplicated. For instance, if this is enabled, attempting + completion when the cursor is after the 'e' in 'Makefile' will + result in 'Makefile' rather than 'Makefilefile', assuming + there is a single possible completion. The default value is + 'off'. + + 'vi-cmd-mode-string' + If the SHOW-MODE-IN-PROMPT variable is enabled, this string is + displayed immediately before the last line of the primary + prompt when vi editing mode is active and in command mode. + The value is expanded like a key binding, so the standard set + of meta- and control prefixes and backslash escape sequences + is available. Use the '\1' and '\2' escapes to begin and end + sequences of non-printing characters, which can be used to + embed a terminal control sequence into the mode string. The + default is '(cmd)'. + + 'vi-ins-mode-string' + If the SHOW-MODE-IN-PROMPT variable is enabled, this string is + displayed immediately before the last line of the primary + prompt when vi editing mode is active and in insertion mode. + The value is expanded like a key binding, so the standard set + of meta- and control prefixes and backslash escape sequences + is available. Use the '\1' and '\2' escapes to begin and end + sequences of non-printing characters, which can be used to + embed a terminal control sequence into the mode string. The + default is '(ins)'. + + 'visible-stats' + If set to 'on', a character denoting a file's type is appended + to the filename when listing possible completions. The + default is 'off'. + +Key Bindings + The syntax for controlling key bindings in the init file is simple. + First you need to find the name of the command that you want to + change. The following sections contain tables of the command name, + the default keybinding, if any, and a short description of what the + command does. + + Once you know the name of the command, simply place on a line in + the init file the name of the key you wish to bind the command to, + a colon, and then the name of the command. There can be no space + between the key name and the colon - that will be interpreted as + part of the key name. The name of the key can be expressed in + different ways, depending on what you find most comfortable. + + In addition to command names, Readline allows keys to be bound to a + string that is inserted when the key is pressed (a MACRO). + + KEYNAME: FUNCTION-NAME or MACRO + KEYNAME is the name of a key spelled out in English. For + example: + Control-u: universal-argument + Meta-Rubout: backward-kill-word + Control-o: "> output" + + In the example above, 'C-u' is bound to the function + 'universal-argument', 'M-DEL' is bound to the function + 'backward-kill-word', and 'C-o' is bound to run the macro + expressed on the right hand side (that is, to insert the text + '> output' into the line). + + A number of symbolic character names are recognized while + processing this key binding syntax: DEL, ESC, ESCAPE, LFD, + NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB. + + "KEYSEQ": FUNCTION-NAME or MACRO + KEYSEQ differs from KEYNAME above in that strings denoting an + entire key sequence can be specified, by placing the key + sequence in double quotes. Some GNU Emacs style key escapes + can be used, as in the following example, but the special + character names are not recognized. + + "\C-u": universal-argument + "\C-x\C-r": re-read-init-file + "\e[11~": "Function Key 1" + + In the above example, 'C-u' is again bound to the function + 'universal-argument' (just as it was in the first example), + ''C-x' 'C-r'' is bound to the function 're-read-init-file', + and ' <[> <1> <1> <~>' is bound to insert the text + 'Function Key 1'. + + The following GNU Emacs style escape sequences are available when + specifying key sequences: + + '\C-' + control prefix + '\M-' + meta prefix + '\e' + an escape character + '\\' + backslash + '\"' + <">, a double quotation mark + '\'' + <'>, a single quote or apostrophe + + In addition to the GNU Emacs style escape sequences, a second set + of backslash escapes is available: + + '\a' + alert (bell) + '\b' + backspace + '\d' + delete + '\f' + form feed + '\n' + newline + '\r' + carriage return + '\t' + horizontal tab + '\v' + vertical tab + '\NNN' + the eight-bit character whose value is the octal value NNN + (one to three digits) + '\xHH' + the eight-bit character whose value is the hexadecimal value + HH (one or two hex digits) + + When entering the text of a macro, single or double quotes must be + used to indicate a macro definition. Unquoted text is assumed to + be a function name. In the macro body, the backslash escapes + described above are expanded. Backslash will quote any other + character in the macro text, including '"' and '''. For example, + the following binding will make ''C-x' \' insert a single '\' into + the line: + "\C-x\\": "\\" + + +File: readline.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File + +1.3.2 Conditional Init Constructs +--------------------------------- + +Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key bindings and +variable settings to be performed as the result of tests. There are +four parser directives used. + +'$if' + The '$if' construct allows bindings to be made based on the editing + mode, the terminal being used, or the application using Readline. + The text of the test, after any comparison operator, extends to the + end of the line; unless otherwise noted, 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. + + 'version' + The 'version' test may be used to perform comparisons against + specific Readline versions. The 'version' expands to the + current Readline version. The set of comparison operators + includes '=' (and '=='), '!=', '<=', '>=', '<', and '>'. The + version number supplied on the right side of the operator + consists of a major version number, an optional decimal point, + and an optional minor version (e.g., '7.1'). If the minor + version is omitted, it is assumed to be '0'. The operator may + be separated from the string 'version' and from the version + number argument by whitespace. The following example sets a + variable if the Readline version being used is 7.0 or newer: + $if version >= 7.0 + set show-mode-in-prompt on + $endif + + 'application' + The APPLICATION construct is used to include + application-specific settings. Each program using the + Readline library sets the APPLICATION NAME, and you can test + for a particular value. This could be used to bind key + sequences to functions useful for a specific program. For + instance, the following command adds a key sequence that + quotes the current or previous word in Bash: + $if Bash + # Quote the current or previous word + "\C-xq": "\eb\"\ef\"" + $endif + + 'variable' + The VARIABLE construct provides simple equality tests for + Readline variables and values. The permitted comparison + operators are '=', '==', and '!='. The variable name must be + separated from the comparison operator by whitespace; the + operator may be separated from the value on the right hand + side by whitespace. Both string and boolean variables may be + tested. Boolean variables must be tested against the values + ON and OFF. The following example is equivalent to the + 'mode=emacs' test described above: + $if editing-mode == emacs + set show-mode-in-prompt on + $endif + +'$endif' + This command, as seen in the previous example, terminates an '$if' + command. + +'$else' + Commands in this branch of the '$if' directive are executed if the + test fails. + +'$include' + This directive takes a single filename as an argument and reads + commands and bindings from that file. For example, the following + directive reads from '/etc/inputrc': + $include /etc/inputrc + + +File: readline.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File + +1.3.3 Sample Init File +---------------------- + +Here is an example of an INPUTRC file. This illustrates key binding, +variable assignment, and conditional syntax. + + # This file controls the behaviour of line input editing for + # programs that use the GNU Readline library. Existing + # programs include FTP, Bash, and GDB. + # + # You can re-read the inputrc file with C-x C-r. + # Lines beginning with '#' are comments. + # + # First, include any system-wide 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 150 or more possible completions for a word, + # ask whether or not the user 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 + +1.4 Bindable Readline Commands +============================== + +* Menu: + +* Commands For Moving:: Moving about the line. +* Commands For History:: Getting at previous lines. +* Commands For Text:: Commands for changing text. +* Commands For Killing:: Commands for killing and yanking. +* Numeric Arguments:: Specifying numeric arguments, repeat counts. +* Commands For Completion:: Getting Readline to do the typing for you. +* Keyboard Macros:: Saving and re-executing typed characters +* Miscellaneous Commands:: Other miscellaneous commands. + +This section describes Readline commands that may be bound to key +sequences. Command names without an accompanying key sequence are +unbound by default. + + In the following descriptions, "point" refers to the current cursor +position, and "mark" refers to a cursor position saved by the 'set-mark' +command. The text between the point and mark is referred to as the +"region". + + +File: readline.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands + +1.4.1 Commands For Moving +------------------------- + +'beginning-of-line (C-a)' + Move to the start of the current line. + +'end-of-line (C-e)' + Move to the end of the line. + +'forward-char (C-f)' + Move forward a character. + +'backward-char (C-b)' + Move back a character. + +'forward-word (M-f)' + Move forward to the end of the next word. Words are composed of + letters and digits. + +'backward-word (M-b)' + Move back to the start of the current or previous word. Words are + composed of letters and digits. + +'previous-screen-line ()' + Attempt to move point to the same physical screen column on the + previous physical screen line. This will not have the desired + effect if the current Readline line does not take up more than one + physical line or if point is not greater than the length of the + prompt plus the screen width. + +'next-screen-line ()' + Attempt to move point to the same physical screen column on the + next physical screen line. This will not have the desired effect + if the current Readline line does not take up more than one + physical line or if the length of the current Readline line is not + greater than the length of the prompt plus the screen width. + +'clear-display (M-C-l)' + Clear the screen and, if possible, the terminal's scrollback + buffer, then redraw the current line, leaving the current line at + the top of the screen. + +'clear-screen (C-l)' + Clear the screen, then 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 + +1.4.2 Commands For Manipulating The History +------------------------------------------- + +'accept-line (Newline or Return)' + Accept the line regardless of where the cursor is. If this line is + non-empty, it may be added to the history list for future recall + with 'add_history()'. If this line is a modified history line, the + history line is restored to its original state. + +'previous-history (C-p)' + Move 'back' through the history list, fetching the previous + command. + +'next-history (C-n)' + Move 'forward' through the history list, fetching the next command. + +'beginning-of-history (M-<)' + Move to the first line in the history. + +'end-of-history (M->)' + Move to the end of the input history, i.e., the line currently + being entered. + +'reverse-search-history (C-r)' + Search backward starting at the current line and moving 'up' + through the history as necessary. This is an incremental search. + This command sets the region to the matched text and activates the + mark. + +'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. + This command sets the region to the matched text and activates the + mark. + +'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. The search string may match + anywhere in a history line. + +'non-incremental-forward-search-history (M-n)' + Search forward starting at the current line and moving 'down' + through the history as necessary using a non-incremental search for + a string supplied by the user. The search string may match + anywhere in a history line. + +'history-search-forward ()' + Search forward through the history for the string of characters + between the start of the current line and the point. The search + string must match at the beginning of a history line. 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. The search + string must match at the beginning of a history line. This is a + non-incremental search. By default, this command is unbound. + +'history-substring-search-forward ()' + Search forward through the history for the string of characters + between the start of the current line and the point. The search + string may match anywhere in a history line. This is a + non-incremental search. By default, this command is unbound. + +'history-substring-search-backward ()' + Search backward through the history for the string of characters + between the start of the current line and the point. The search + string may match anywhere in a history line. This is a + non-incremental search. By default, this command is unbound. + +'yank-nth-arg (M-C-y)' + Insert the first argument to the previous command (usually the + second word on the previous line) at point. With an argument N, + insert the Nth word from the previous command (the words in the + previous command begin with word 0). A negative argument inserts + the Nth word from the end of the previous command. Once the + argument N is computed, the argument is extracted as if the '!N' + history expansion had been specified. + +'yank-last-arg (M-. or M-_)' + Insert last argument to the previous command (the last word of the + previous history entry). With a numeric argument, behave exactly + like 'yank-nth-arg'. Successive calls to 'yank-last-arg' move back + through the history list, inserting the last word (or the word + specified by the argument to the first call) of each line in turn. + Any numeric argument supplied to these successive calls determines + the direction to move through the history. A negative argument + switches the direction through the history (back or forward). The + history expansion facilities are used to extract the last argument, + as if the '!$' history expansion had been specified. + +'operate-and-get-next (C-o)' + Accept the current line for return to the calling application as if + a newline had been entered, and fetch the next line relative to the + current line from the history for editing. A numeric argument, if + supplied, specifies the history entry to use instead of the current + line. + +'fetch-history ()' + With a numeric argument, fetch that entry from the history list and + make it the current line. Without an argument, move back to the + first entry in the history list. + + +File: readline.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands + +1.4.3 Commands For Changing Text +-------------------------------- + +'end-of-file (usually C-d)' + The character indicating end-of-file as set, for example, by + 'stty'. If this character is read when there are no characters on + the line, and point is at the beginning of the line, Readline + interprets it as the end of input and returns EOF. + +'delete-char (C-d)' + Delete the character at point. If this function is bound to the + same character as the tty EOF character, as 'C-d' commonly is, see + above for the effects. + +'backward-delete-char (Rubout)' + Delete the character behind the cursor. A numeric argument means + to kill the characters instead of deleting them. + +'forward-backward-delete-char ()' + Delete the character under the cursor, unless the cursor is at the + end of the line, in which case the character behind the cursor is + deleted. By default, this is not bound to a key. + +'quoted-insert (C-q or C-v)' + Add the next character typed to the line verbatim. This is how to + insert key sequences like 'C-q', for example. + +'tab-insert (M-)' + Insert a tab character. + +'self-insert (a, b, A, 1, !, ...)' + Insert yourself. + +'bracketed-paste-begin ()' + This function is intended to be bound to the "bracketed paste" + escape sequence sent by some terminals, and such a binding is + assigned by default. It allows Readline to insert the pasted text + as a single unit without treating each character as if it had been + read from the keyboard. The characters are inserted as if each one + was bound to 'self-insert' instead of executing any editing + commands. + + Bracketed paste sets the region (the characters between point and + the mark) to the inserted text. It uses the concept of an _active + mark_: when the mark is active, Readline redisplay uses the + terminal's standout mode to denote the region. + +'transpose-chars (C-t)' + Drag the character before the cursor forward over the character at + the cursor, moving the cursor forward as well. If the insertion + point is at the end of the line, then this transposes the last two + characters of the line. Negative arguments have no effect. + +'transpose-words (M-t)' + Drag the word before point past the word after point, moving point + past that word as well. If the insertion point is at the end of + the line, this transposes the last two words on the line. + +'upcase-word (M-u)' + Uppercase the current (or following) word. With a negative + argument, uppercase the previous word, but do not move the cursor. + +'downcase-word (M-l)' + Lowercase the current (or following) word. With a negative + argument, lowercase the previous word, but do not move the cursor. + +'capitalize-word (M-c)' + Capitalize the current (or following) word. With a negative + argument, capitalize the previous word, but do not move the cursor. + +'overwrite-mode ()' + Toggle overwrite mode. With an explicit positive numeric argument, + switches to overwrite mode. With an explicit non-positive numeric + argument, switches to insert mode. This command affects only + 'emacs' mode; 'vi' mode does overwrite differently. Each call to + 'readline()' starts in insert mode. + + In overwrite mode, characters bound to 'self-insert' replace the + text at point rather than pushing the text to the right. + Characters bound to 'backward-delete-char' replace the character + before point with a space. + + By default, this command is unbound. + + +File: readline.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands + +1.4.4 Killing And Yanking +------------------------- + +'kill-line (C-k)' + Kill the text from point to the end of the line. With a negative + numeric argument, kill backward from the cursor to the beginning of + the current line. + +'backward-kill-line (C-x Rubout)' + Kill backward from the cursor to the beginning of the current line. + With a negative numeric argument, kill forward from the cursor to + the end of the current line. + +'unix-line-discard (C-u)' + Kill backward from the cursor to the beginning of the current line. + +'kill-whole-line ()' + Kill all characters on the current line, no matter where point is. + By default, this is unbound. + +'kill-word (M-d)' + Kill from point to the end of the current word, or if between + words, to the end of the next word. Word boundaries are the same + as 'forward-word'. + +'backward-kill-word (M-)' + Kill the word behind point. Word boundaries are the same as + 'backward-word'. + +'shell-transpose-words (M-C-t)' + Drag the word before point past the word after point, moving point + past that word as well. If the insertion point is at the end of + the line, this transposes the last two words on the line. Word + boundaries are the same as 'shell-forward-word' and + 'shell-backward-word'. + +'unix-word-rubout (C-w)' + Kill the word behind point, using white space as a word boundary. + The killed text is saved on the kill-ring. + +'unix-filename-rubout ()' + Kill the word behind point, using white space and the slash + character as the word boundaries. The killed text is saved on the + kill-ring. + +'delete-horizontal-space ()' + Delete all spaces and tabs around point. By default, this is + unbound. + +'kill-region ()' + Kill the text in the current region. By default, this command is + unbound. + +'copy-region-as-kill ()' + Copy the text in the region to the kill buffer, so it can be yanked + right away. By default, this command is unbound. + +'copy-backward-word ()' + Copy the word before point to the kill buffer. The word boundaries + are the same as 'backward-word'. By default, this command is + unbound. + +'copy-forward-word ()' + Copy the word following point to the kill buffer. The word + boundaries are the same as 'forward-word'. By default, this + command is unbound. + +'yank (C-y)' + Yank the top of the kill ring into the buffer at point. + +'yank-pop (M-y)' + Rotate the kill-ring, and yank the new top. You can only do this + if the prior command is 'yank' or 'yank-pop'. + + +File: readline.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands + +1.4.5 Specifying Numeric Arguments +---------------------------------- + +'digit-argument (M-0, M-1, ... M--)' + Add this digit to the argument already accumulating, or start a new + argument. 'M--' starts a negative argument. + +'universal-argument ()' + This is another way to specify an argument. If this command is + followed by one or more digits, optionally with a leading minus + sign, those digits define the argument. If the command is followed + by digits, executing 'universal-argument' again ends the numeric + argument, but is otherwise ignored. As a special case, if this + command is immediately followed by a character that is neither a + digit nor 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 + +1.4.6 Letting Readline Type For You +----------------------------------- + +'complete ()' + Attempt to perform completion on the text before point. The actual + completion performed is application-specific. The default is + filename completion. + +'possible-completions (M-?)' + List the possible completions of the text before point. When + displaying completions, Readline sets the number of columns used + for display to the value of 'completion-display-width', the value + of the environment variable 'COLUMNS', or the screen width, in that + order. + +'insert-completions (M-*)' + Insert all completions of the text before point that would have + been generated by 'possible-completions'. + +'menu-complete ()' + Similar to 'complete', but replaces the word to be completed with a + single match from the list of possible completions. Repeated + execution of 'menu-complete' steps through the list of possible + completions, inserting each match in turn. At the end of the list + of completions, the bell is rung (subject to the setting of + 'bell-style') and the original text is restored. An argument of N + moves N positions forward in the list of matches; a negative + argument may be used to move backward through the list. This + command is intended to be bound to , but is unbound by + default. + +'menu-complete-backward ()' + Identical to 'menu-complete', but moves backward through the list + of possible completions, as if 'menu-complete' had been given a + negative argument. + +'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 + +1.4.7 Keyboard Macros +--------------------- + +'start-kbd-macro (C-x ()' + Begin saving the characters typed into the current keyboard macro. + +'end-kbd-macro (C-x ))' + Stop saving the characters typed into the current keyboard macro + and save the definition. + +'call-last-kbd-macro (C-x e)' + Re-execute the last keyboard macro defined, by making the + characters in the macro appear as if typed at the keyboard. + +'print-last-kbd-macro ()' + Print the last keyboard macro defined in a format suitable for the + INPUTRC file. + + +File: readline.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands + +1.4.8 Some Miscellaneous Commands +--------------------------------- + +'re-read-init-file (C-x C-r)' + Read in the contents of the INPUTRC file, and incorporate any + bindings or variable assignments found there. + +'abort (C-g)' + Abort the current editing command and ring the terminal's bell + (subject to the setting of 'bell-style'). + +'do-lowercase-version (M-A, M-B, M-X, ...)' + If the metafied character X is upper case, run the command that is + bound to the corresponding metafied lower case character. The + behavior is undefined if X is already lower case. + +'prefix-meta ()' + Metafy the next character typed. This is for keyboards without a + meta key. Typing ' f' is equivalent to typing 'M-f'. + +'undo (C-_ or C-x C-u)' + Incremental undo, separately remembered for each line. + +'revert-line (M-r)' + Undo all changes made to this line. This is like executing the + 'undo' command enough times to get back to the beginning. + +'tilde-expand (M-~)' + Perform tilde expansion on the current word. + +'set-mark (C-@)' + Set the mark to the point. If a numeric argument is supplied, the + mark is set to that position. + +'exchange-point-and-mark (C-x C-x)' + Swap the point with the mark. The current cursor position is set + to the saved position, and the old cursor position is saved as the + mark. + +'character-search (C-])' + A character is read and point is moved to the next occurrence of + that character. A negative argument 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 argument searches for subsequent + occurrences. + +'skip-csi-sequence ()' + Read enough characters to consume a multi-key sequence such as + those defined for keys like Home and End. Such sequences begin + with a Control Sequence Indicator (CSI), usually ESC-[. If this + sequence is bound to "\e[", keys producing such sequences will have + no effect unless explicitly bound to a Readline command, instead of + inserting stray characters into the editing buffer. This is + unbound by default, but usually bound to ESC-[. + +'insert-comment (M-#)' + Without a numeric argument, the value of the 'comment-begin' + variable is inserted at the beginning of the current line. If a + numeric argument is supplied, this command acts as a toggle: if the + characters at the beginning of the line do not match the value of + 'comment-begin', the value is inserted, otherwise the characters in + 'comment-begin' are deleted from the beginning of the line. In + either case, the line is accepted as if a newline had been typed. + +'dump-functions ()' + Print all of the functions and their key bindings to the Readline + output stream. If a numeric argument is supplied, the output is + formatted in such a way that it can be made part of an INPUTRC + file. This command is unbound by default. + +'dump-variables ()' + Print all of the settable variables and their values to the + Readline output stream. If a numeric argument is supplied, the + output is formatted in such a way that it can be made part of an + INPUTRC file. This command is unbound by default. + +'dump-macros ()' + Print all of the Readline key sequences bound to macros and the + strings they output. If a numeric argument is supplied, the output + is formatted in such a way that it can be made part of an INPUTRC + file. This command is unbound by default. + +'emacs-editing-mode (C-e)' + When in 'vi' command mode, this causes a switch to 'emacs' editing + mode. + +'vi-editing-mode (M-C-j)' + When in 'emacs' editing mode, this causes a switch to 'vi' editing + mode. + + +File: readline.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing + +1.5 Readline vi Mode +==================== + +While the Readline library does not have a full set of 'vi' editing +functions, it does contain enough to allow simple editing of the line. +The Readline 'vi' mode behaves as specified in the POSIX standard. + + In order to switch interactively between 'emacs' and 'vi' editing +modes, use the command 'M-C-j' (bound to emacs-editing-mode when in 'vi' +mode and to vi-editing-mode in 'emacs' mode). The Readline default is +'emacs' mode. + + When you enter a line in 'vi' mode, you are already placed in +'insertion' mode, as if you had typed an 'i'. Pressing switches +you into 'command' mode, where you can edit the text of the line with +the standard 'vi' movement keys, move to previous history lines with 'k' +and subsequent lines with 'j', and so forth. + + This document describes the GNU Readline Library, a utility for +aiding in the consistency of user interface across discrete programs +that need to provide a command line interface. + + Copyright (C) 1988-2022 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: GNU Free Documentation License, Prev: Command Line Editing, Up: Top + +2 Programming with GNU Readline +******************************* + +This chapter describes the interface between the GNU Readline Library +and other programs. If you are a programmer, and you wish to include +the features found in GNU Readline such as completion, line editing, and +interactive history manipulation in your own programs, this section is +for you. + +* Menu: + +* Basic Behavior:: Using the default behavior of Readline. +* Custom Functions:: Adding your own functions to Readline. +* Readline Variables:: Variables accessible to custom + functions. +* Readline Convenience Functions:: Functions which Readline supplies to + aid in writing your own custom + functions. +* Readline Signal Handling:: How Readline behaves when it receives signals. +* Custom Completers:: Supplanting or supplementing Readline's + completion functions. + + +File: readline.info, Node: Basic Behavior, Next: Custom Functions, Up: Programming with GNU Readline + +2.1 Basic Behavior +================== + +Many programs provide a command line interface, such as 'mail', 'ftp', +and 'sh'. For such programs, the default behaviour of Readline is +sufficient. This section describes how to use Readline in the simplest +way possible, perhaps to replace calls in your code to 'gets()' or +'fgets()'. + + The function 'readline()' prints a prompt PROMPT and then reads and +returns a single line of text from the user. If PROMPT is 'NULL' or the +empty string, no prompt is displayed. The line 'readline' returns is +allocated with 'malloc()'; the caller should 'free()' the line when it +has finished with it. The declaration for 'readline' in ANSI C is + + char *readline (const char *PROMPT); + +So, one might say + char *line = readline ("Enter a line: "); +in order to read a line of text from the user. The line returned has +the final newline removed, so only the text remains. + + If 'readline' encounters an 'EOF' while reading the line, and the +line is empty at that point, then '(char *)NULL' is returned. +Otherwise, the line is ended just as if a newline had been typed. + + Readline performs some expansion on the PROMPT before it is displayed +on the screen. See the description of 'rl_expand_prompt' (*note +Redisplay::) for additional details, especially if PROMPT will contain +characters that do not consume physical screen space when displayed. + + If you want the user to be able to get at the line later, (with +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 +completion: completion on file names. If you do not want Readline to +complete on filenames, you can change the binding of the key with +'rl_bind_key()'. + + int rl_bind_key (int KEY, rl_command_func_t *FUNCTION); + + 'rl_bind_key()' takes two arguments: KEY is the character that you +want to bind, and FUNCTION is the address of the function to call when +KEY is pressed. Binding to 'rl_insert()' makes 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 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 + +2.2 Custom Functions +==================== + +Readline provides many functions for manipulating the text of the line, +but it isn't possible to anticipate the needs of all programs. This +section describes the various functions and variables defined within the +Readline library which allow a user program to add customized +functionality to Readline. + + Before declaring any functions that customize Readline's behavior, or +using any functionality Readline provides in other code, an application +writer should include the file '' in any file that +uses Readline's features. Since some of the definitions in 'readline.h' +use the 'stdio' library, the file '' should be included before +'readline.h'. + + 'readline.h' defines a C preprocessor variable that should be treated +as an integer, 'RL_READLINE_VERSION', which may be used to conditionally +compile application code depending on the installed Readline version. +The value is a hexadecimal encoding of the major and minor version +numbers of the library, of the form 0xMMMM. MM is the two-digit major +version number; MM is the two-digit minor version number. For Readline +4.2, for example, the value of 'RL_READLINE_VERSION' would be '0x0402'. + +* Menu: + +* Readline Typedefs:: C declarations to make code readable. +* Function Writing:: Variables and calling conventions. + + +File: readline.info, Node: Readline Typedefs, Next: Function Writing, Up: Custom Functions + +2.2.1 Readline Typedefs +----------------------- + +For readability, we declare a number of new object types, all pointers +to functions. + + The reason for declaring these new types is to make it easier to +write code describing pointers to C functions with appropriately +prototyped arguments and return values. + + For instance, say we want to declare a variable FUNC as a pointer to +a function which takes two 'int' arguments and returns an 'int' (this is +the type of all of the Readline bindable functions). Instead of the +classic C declaration + + 'int (*func)();' + +or the ANSI-C style declaration + + 'int (*func)(int, int);' + +we may write + + 'rl_command_func_t *func;' + + The full list of function pointer types available is + +'typedef int rl_command_func_t (int, int);' + +'typedef char *rl_compentry_func_t (const char *, int);' + +'typedef char **rl_completion_func_t (const char *, int, int);' + +'typedef char *rl_quote_func_t (char *, int, char *);' + +'typedef char *rl_dequote_func_t (char *, int);' + +'typedef int rl_compignore_func_t (char **);' + +'typedef void rl_compdisp_func_t (char **, int, int);' + +'typedef int rl_hook_func_t (void);' + +'typedef int rl_getc_func_t (FILE *);' + +'typedef int rl_linebuf_func_t (char *, int);' + +'typedef int rl_intfunc_t (int);' +'#define rl_ivoidfunc_t rl_hook_func_t' +'typedef int rl_icpfunc_t (char *);' +'typedef int rl_icppfunc_t (char **);' + +'typedef void rl_voidfunc_t (void);' +'typedef void rl_vintfunc_t (int);' +'typedef void rl_vcpfunc_t (char *);' +'typedef void rl_vcppfunc_t (char **);' + + +File: readline.info, Node: Function Writing, Prev: Readline Typedefs, Up: Custom Functions + +2.2.2 Writing a New Function +---------------------------- + +In order to write new functions for Readline, you need to know the +calling conventions for keyboard-invoked functions, and the names of the +variables that describe the current state of the line read so far. + + The calling sequence for a command 'foo' looks like + + int foo (int count, int key) + +where COUNT is the numeric argument (or 1 if defaulted) and KEY is the +key that invoked this function. + + It is completely up to the function as to what should be done with +the numeric argument. Some functions use it as a repeat count, some as +a flag, and others to choose alternate behavior (refreshing the current +line as opposed to refreshing the screen, for example). Some choose to +ignore it. In general, if a function uses the numeric argument as a +repeat count, it should be able to do something useful with both +negative and positive arguments. At the very least, it should be aware +that it can be passed a negative argument. + + A command function should return 0 if its action completes +successfully, and a value greater than zero if some error occurs. This +is the convention obeyed by all of the builtin Readline bindable command +functions. + + +File: readline.info, Node: Readline Variables, Next: Readline Convenience Functions, Prev: Custom Functions, Up: Programming with GNU Readline + +2.3 Readline Variables +====================== + +These variables are available to function writers. + + -- Variable: char * rl_line_buffer + This is the line gathered so far. You are welcome to modify the + contents of the line, but see *note Allowing Undoing::. The + function 'rl_extend_line_buffer' is available to increase the + memory allocated to 'rl_line_buffer'. + + -- Variable: int rl_point + The offset of the current cursor position in 'rl_line_buffer' (the + _point_). + + -- Variable: int rl_end + The number of characters present in 'rl_line_buffer'. When + 'rl_point' is at the end of the line, 'rl_point' and 'rl_end' are + equal. + + -- Variable: int rl_mark + The MARK (saved position) in the current line. If set, the mark + and point define a _region_. + + -- Variable: int rl_done + Setting this to a non-zero value causes Readline to return the + current line immediately. Readline will set this variable when it + has read a key sequence bound to 'accept-line' and is about to + return the line to the caller. + + -- Variable: int rl_eof_found + Readline will set this variable when it has read an EOF character + (e.g., the stty 'EOF' character) on an empty line or encountered a + read error and is about to return a NULL line to the caller. + + -- Variable: int rl_num_chars_to_read + Setting this to a positive value before calling 'readline()' causes + Readline to return after accepting that many characters, rather + than reading up to a character bound to 'accept-line'. + + -- Variable: int rl_pending_input + Setting this to a value makes it the next keystroke read. This is + a way to stuff a single character into the input stream. + + -- Variable: int rl_dispatching + Set to a non-zero value if a function is being called from a key + binding; zero otherwise. Application functions can test this to + discover whether they were called directly or by Readline's + dispatching mechanism. + + -- Variable: int rl_erase_empty_line + Setting this to a non-zero value causes Readline to completely + erase the current line, including any prompt, any time a newline is + typed as the only character on an otherwise-empty line. The cursor + is moved to the beginning of the newly-blank line. + + -- Variable: char * rl_prompt + The prompt Readline uses. This is set from the argument to + 'readline()', and should not be assigned to directly. The + 'rl_set_prompt()' function (*note Redisplay::) may be used to + modify the prompt string after calling 'readline()'. + + -- Variable: char * rl_display_prompt + The string displayed as the prompt. This is usually identical to + RL_PROMPT, but may be changed temporarily by functions that use the + prompt string as a message area, such as incremental search. + + -- Variable: int rl_already_prompted + If an application wishes to display the prompt itself, rather than + have Readline do it the first time 'readline()' is called, it + should set this variable to a non-zero value after displaying the + prompt. The prompt must also be passed as the argument to + 'readline()' so the redisplay functions can update the display + properly. The calling application is responsible for managing the + value; Readline never sets it. + + -- Variable: const char * rl_library_version + The version number of this revision of the library. + + -- Variable: int rl_readline_version + An integer encoding the current version of the library. The + encoding is of the form 0xMMMM, where MM is the two-digit major + version number, and MM is the two-digit minor version number. For + example, for Readline-4.2, 'rl_readline_version' would have the + value 0x0402. + + -- Variable: int rl_gnu_readline_p + Always set to 1, denoting that this is GNU Readline rather than + some emulation. + + -- Variable: const char * rl_terminal_name + The terminal type, used for initialization. If not set by the + application, Readline sets this to the value of the 'TERM' + environment variable the first time it is called. + + -- Variable: const char * rl_readline_name + This variable is set to a unique name by each application using + Readline. The value allows conditional parsing of the inputrc file + (*note Conditional Init Constructs::). + + -- Variable: FILE * rl_instream + The stdio stream from which Readline reads input. If 'NULL', + Readline defaults to STDIN. + + -- Variable: FILE * rl_outstream + The stdio stream to which Readline performs output. If 'NULL', + Readline defaults to STDOUT. + + -- Variable: int rl_prefer_env_winsize + If non-zero, Readline gives values found in the 'LINES' and + 'COLUMNS' environment variables greater precedence than values + fetched from the kernel when computing the screen dimensions. + + -- Variable: rl_command_func_t * rl_last_func + The address of the last command function Readline executed. May be + used to test whether or not a function is being executed twice in + succession, for example. + + -- Variable: rl_hook_func_t * rl_startup_hook + If non-zero, this is the address of a function to call just before + 'readline' prints the first prompt. + + -- Variable: rl_hook_func_t * rl_pre_input_hook + If non-zero, this is the address of a function to call after the + first prompt has been printed and just before 'readline' starts + reading input characters. + + -- Variable: rl_hook_func_t * rl_event_hook + If non-zero, this is the address of a function to call periodically + when Readline is waiting for terminal input. By default, this will + be called at most ten times a second if there is no keyboard input. + + -- Variable: rl_getc_func_t * rl_getc_function + If non-zero, Readline will call indirectly through this pointer to + get a character from the input stream. By default, it is set to + 'rl_getc', the default Readline character input function (*note + Character Input::). In general, an application that sets + RL_GETC_FUNCTION should consider setting RL_INPUT_AVAILABLE_HOOK as + well. + + -- Variable: rl_hook_func_t * rl_signal_event_hook + If non-zero, this is the address of a function to call if a read + system call is interrupted when Readline is reading terminal input. + + -- Variable: rl_hook_func_t * rl_timeout_event_hook + If non-zero, this is the address of a function to call if Readline + times out while reading input. + + -- Variable: rl_hook_func_t * rl_input_available_hook + If non-zero, Readline will use this function's return value when it + needs to determine whether or not there is available input on the + current input source. The default hook checks 'rl_instream'; if an + application is using a different input source, it should set the + hook appropriately. Readline queries for available input when + implementing intra-key-sequence timeouts during input and + incremental searches. This may use an application-specific timeout + before returning a value; Readline uses the value passed to + 'rl_set_keyboard_input_timeout()' or the value of the user-settable + KEYSEQ-TIMEOUT variable. This is designed for use by applications + using Readline's callback interface (*note Alternate Interface::), + which may not use the traditional 'read(2)' and file descriptor + interface, or other applications using a different input mechanism. + If an application uses an input mechanism or hook that can + potentially exceed the value of KEYSEQ-TIMEOUT, it should increase + the timeout or set this hook appropriately even when not using the + callback interface. In general, an application that sets + RL_GETC_FUNCTION should consider setting RL_INPUT_AVAILABLE_HOOK as + well. + + -- Variable: rl_voidfunc_t * rl_redisplay_function + If non-zero, Readline will call indirectly through this pointer to + update the display with the current contents of the editing buffer. + By default, it is set to 'rl_redisplay', the default Readline + redisplay function (*note Redisplay::). + + -- Variable: rl_vintfunc_t * rl_prep_term_function + If non-zero, Readline will call indirectly through this pointer to + initialize the terminal. The function takes a single argument, an + 'int' flag that says whether or not to use eight-bit characters. + By default, this is set to 'rl_prep_terminal' (*note Terminal + Management::). + + -- Variable: rl_voidfunc_t * rl_deprep_term_function + If non-zero, Readline will call indirectly through this pointer to + reset the terminal. This function should undo the effects of + 'rl_prep_term_function'. By default, this is set to + 'rl_deprep_terminal' (*note Terminal Management::). + + -- Variable: Keymap rl_executing_keymap + This variable is set to the keymap (*note Keymaps::) in which the + currently executing Readline function was found. + + -- Variable: Keymap rl_binding_keymap + This variable is set to the keymap (*note Keymaps::) in which the + last key binding occurred. + + -- Variable: char * rl_executing_macro + This variable is set to the text of any currently-executing macro. + + -- Variable: int rl_executing_key + The key that caused the dispatch to the currently-executing + Readline function. + + -- Variable: char * rl_executing_keyseq + The full key sequence that caused the dispatch to the + currently-executing Readline function. + + -- Variable: int rl_key_sequence_length + The number of characters in RL_EXECUTING_KEYSEQ. + + -- Variable: int rl_readline_state + A variable with bit values that encapsulate the current Readline + state. A bit is set with the 'RL_SETSTATE' macro, and unset with + the 'RL_UNSETSTATE' macro. Use the 'RL_ISSTATE' macro to test + whether a particular state bit is set. Current state bits include: + + 'RL_STATE_NONE' + Readline has not yet been called, nor has it begun to + initialize. + 'RL_STATE_INITIALIZING' + Readline is initializing its internal data structures. + 'RL_STATE_INITIALIZED' + Readline has completed its initialization. + 'RL_STATE_TERMPREPPED' + Readline has modified the terminal modes to do its own input + and redisplay. + 'RL_STATE_READCMD' + Readline is reading a command from the keyboard. + 'RL_STATE_METANEXT' + Readline is reading more input after reading the meta-prefix + character. + 'RL_STATE_DISPATCHING' + Readline is dispatching to a command. + 'RL_STATE_MOREINPUT' + Readline is reading more input while executing an editing + command. + 'RL_STATE_ISEARCH' + Readline is performing an incremental history search. + 'RL_STATE_NSEARCH' + Readline is performing a non-incremental history search. + 'RL_STATE_SEARCH' + Readline is searching backward or forward through the history + for a string. + 'RL_STATE_NUMERICARG' + Readline is reading a numeric argument. + 'RL_STATE_MACROINPUT' + Readline is currently getting its input from a + previously-defined keyboard macro. + 'RL_STATE_MACRODEF' + Readline is currently reading characters defining a keyboard + macro. + 'RL_STATE_OVERWRITE' + Readline is in overwrite mode. + 'RL_STATE_COMPLETING' + Readline is performing word completion. + 'RL_STATE_SIGHANDLER' + Readline is currently executing the readline signal handler. + 'RL_STATE_UNDOING' + Readline is performing an undo. + 'RL_STATE_INPUTPENDING' + Readline has input pending due to a call to + 'rl_execute_next()'. + 'RL_STATE_TTYCSAVED' + Readline has saved the values of the terminal's special + characters. + 'RL_STATE_CALLBACK' + Readline is currently using the alternate (callback) interface + (*note Alternate Interface::). + 'RL_STATE_VIMOTION' + Readline is reading the argument to a vi-mode "motion" + command. + 'RL_STATE_MULTIKEY' + Readline is reading a multiple-keystroke command. + 'RL_STATE_VICMDONCE' + Readline has entered vi command (movement) mode at least one + time during the current call to 'readline()'. + 'RL_STATE_DONE' + Readline has read a key sequence bound to 'accept-line' and is + about to return the line to the caller. + 'RL_STATE_TIMEOUT' + Readline has timed out (it did not receive a line or specified + number of characters before the timeout duration specified by + 'rl_set_timeout' elapsed) and is returning that status to the + caller. + 'RL_STATE_EOF' + Readline has read an EOF character (e.g., the stty 'EOF' + character) or encountered a read error and is about to return + a NULL line to the caller. + + -- Variable: int rl_explicit_arg + Set to a non-zero value if an explicit numeric argument was + specified by the user. Only valid in a bindable command function. + + -- Variable: int rl_numeric_arg + Set to the value of any numeric argument explicitly specified by + the user before executing the current Readline function. Only + valid in a bindable command function. + + -- Variable: int rl_editing_mode + Set to a value denoting Readline's current editing mode. A value + of 1 means Readline is currently in emacs mode; 0 means that vi + mode is active. + + +File: readline.info, Node: Readline Convenience Functions, Next: Readline Signal Handling, Prev: Readline Variables, Up: Programming with GNU Readline + +2.4 Readline Convenience Functions +================================== + +* Menu: + +* Function Naming:: How to give a function you write a name. +* Keymaps:: Making keymaps. +* Binding Keys:: Changing Keymaps. +* Associating Function Names and Bindings:: Translate function names to + key sequences. +* Allowing Undoing:: How to make your functions undoable. +* Redisplay:: Functions to control line display. +* Modifying Text:: Functions to modify 'rl_line_buffer'. +* Character Input:: Functions to read keyboard input. +* Terminal Management:: Functions to manage terminal settings. +* Utility Functions:: Generally useful functions and hooks. +* Miscellaneous Functions:: Functions that don't fall into any category. +* Alternate Interface:: Using Readline in a 'callback' fashion. +* A Readline Example:: An example Readline function. +* Alternate Interface Example:: An example program using the alternate interface. + + +File: readline.info, Node: Function Naming, Next: Keymaps, Up: Readline Convenience Functions + +2.4.1 Naming a Function +----------------------- + +The user can dynamically change the bindings of keys while using +Readline. This is done by representing the function with a descriptive +name. The user is able to type the descriptive name when referring to +the function. Thus, in an init file, one might find + + Meta-Rubout: backward-kill-word + + This binds the keystroke to the function +_descriptively_ named 'backward-kill-word'. You, as the programmer, +should bind the functions you write to descriptive names as well. +Readline provides a function for doing that: + + -- Function: int rl_add_defun (const char *name, rl_command_func_t + *function, int key) + Add NAME to the list of named functions. Make FUNCTION be the + function that gets called. If KEY is not -1, then bind it to + FUNCTION using 'rl_bind_key()'. + + Using this function alone is sufficient for most applications. It is +the recommended way to add a few functions to the default functions that +Readline has built in. If you need to do something other than adding a +function to Readline, you may need to use the underlying functions +described below. + + +File: readline.info, Node: Keymaps, Next: Binding Keys, Prev: Function Naming, Up: Readline Convenience Functions + +2.4.2 Selecting a Keymap +------------------------ + +Key bindings take place on a "keymap". The keymap is the association +between the keys that the user types and the functions that get run. +You can make your own keymaps, copy existing keymaps, and tell Readline +which keymap to use. + + -- Function: Keymap rl_make_bare_keymap (void) + Returns a new, empty keymap. The space for the keymap is allocated + with 'malloc()'; the caller should free it by calling + 'rl_free_keymap()' when done. + + -- Function: Keymap rl_copy_keymap (Keymap map) + Return a new keymap which is a copy of MAP. + + -- Function: Keymap rl_make_keymap (void) + Return a new keymap with the printing characters bound to + rl_insert, the lowercase Meta characters bound to run their + equivalents, and the Meta digits bound to produce numeric + arguments. + + -- Function: void rl_discard_keymap (Keymap keymap) + Free the storage associated with the data in KEYMAP. The caller + should free KEYMAP. + + -- Function: void rl_free_keymap (Keymap keymap) + Free all storage associated with KEYMAP. This calls + 'rl_discard_keymap' to free subordindate keymaps and macros. + + -- Function: int rl_empty_keymap (Keymap keymap) + Return non-zero if there are no keys bound to functions in KEYMAP; + zero if there are any keys bound. + + Readline has several internal keymaps. These functions allow you to +change which keymap is active. + + -- Function: Keymap rl_get_keymap (void) + Returns the currently active keymap. + + -- Function: void rl_set_keymap (Keymap keymap) + Makes KEYMAP the currently active keymap. + + -- Function: Keymap rl_get_keymap_by_name (const char *name) + Return the keymap matching NAME. NAME is one which would be + supplied in a 'set keymap' inputrc line (*note Readline Init + File::). + + -- Function: char * rl_get_keymap_name (Keymap keymap) + Return the name matching KEYMAP. NAME is one which would be + supplied in a 'set keymap' inputrc line (*note Readline Init + File::). + + -- Function: int rl_set_keymap_name (const char *name, Keymap keymap) + Set the name of KEYMAP. This name will then be "registered" and + available for use in a 'set keymap' inputrc directive *note + Readline Init File::). The NAME may not be one of Readline's + builtin keymap names; you may not add a different name for one of + Readline's builtin keymaps. You may replace the name associated + with a given keymap by calling this function more than once with + the same KEYMAP argument. You may associate a registered NAME with + a new keymap by calling this function more than once with the same + NAME argument. There is no way to remove a named keymap once the + name has been registered. Readline will make a copy of NAME. The + return value is greater than zero unless NAME is one of Readline's + builtin keymap names or KEYMAP is one of Readline's builtin + keymaps. + + +File: readline.info, Node: Binding Keys, Next: Associating Function Names and Bindings, Prev: Keymaps, Up: Readline Convenience Functions + +2.4.3 Binding Keys +------------------ + +Key sequences are associate with functions through the keymap. Readline +has several internal keymaps: 'emacs_standard_keymap', +'emacs_meta_keymap', 'emacs_ctlx_keymap', 'vi_movement_keymap', and +'vi_insertion_keymap'. 'emacs_standard_keymap' is the default, and the +examples in this manual assume that. + + Since 'readline()' installs a set of default key bindings the first +time it is called, there is always the danger that a custom binding +installed before the first call to 'readline()' will be overridden. An +alternate mechanism is to install custom key bindings in an +initialization function assigned to the 'rl_startup_hook' variable +(*note Readline Variables::). + + These functions manage key bindings. + + -- Function: int rl_bind_key (int key, rl_command_func_t *function) + Binds KEY to FUNCTION in the currently active keymap. Returns + non-zero in the case of an invalid KEY. + + -- Function: int rl_bind_key_in_map (int key, rl_command_func_t + *function, Keymap map) + Bind KEY to FUNCTION in MAP. Returns non-zero in the case of an + invalid KEY. + + -- Function: int rl_bind_key_if_unbound (int key, rl_command_func_t + *function) + Binds KEY to FUNCTION if it is not already bound in the currently + active keymap. Returns non-zero in the case of an invalid KEY or + if KEY is already bound. + + -- Function: int rl_bind_key_if_unbound_in_map (int key, + rl_command_func_t *function, Keymap map) + Binds KEY to FUNCTION if it is not already bound in MAP. Returns + non-zero in the case of an invalid KEY or if KEY is already bound. + + -- Function: int rl_unbind_key (int key) + Bind KEY to the null function in the currently active keymap. + Returns non-zero in case of error. + + -- Function: int rl_unbind_key_in_map (int key, Keymap map) + Bind KEY to the null function in MAP. Returns non-zero in case of + error. + + -- Function: int rl_unbind_function_in_map (rl_command_func_t + *function, Keymap map) + Unbind all keys that execute FUNCTION in MAP. + + -- Function: int rl_unbind_command_in_map (const char *command, Keymap + map) + Unbind all keys that are bound to COMMAND in MAP. + + -- Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t + *function) + Bind the key sequence represented by the string KEYSEQ to the + function FUNCTION, beginning in the current keymap. This makes new + keymaps as necessary. The return value is non-zero if KEYSEQ is + invalid. + + -- Function: int rl_bind_keyseq_in_map (const char *keyseq, + rl_command_func_t *function, Keymap map) + Bind the key sequence represented by the string KEYSEQ to the + function FUNCTION. This makes new keymaps as necessary. Initial + bindings are performed in MAP. The return value is non-zero if + KEYSEQ is invalid. + + -- Function: int rl_set_key (const char *keyseq, rl_command_func_t + *function, Keymap map) + Equivalent to 'rl_bind_keyseq_in_map'. + + -- Function: int rl_bind_keyseq_if_unbound (const char *keyseq, + rl_command_func_t *function) + Binds KEYSEQ to FUNCTION if it is not already bound in the + currently active keymap. Returns non-zero in the case of an + invalid KEYSEQ or if KEYSEQ is already bound. + + -- Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, + rl_command_func_t *function, Keymap map) + Binds KEYSEQ to FUNCTION if it is not already bound in MAP. + Returns non-zero in the case of an invalid KEYSEQ or if KEYSEQ is + already bound. + + -- Function: int rl_generic_bind (int type, const char *keyseq, char + *data, Keymap map) + Bind the key sequence represented by the string KEYSEQ to the + arbitrary pointer DATA. TYPE says what kind of data is pointed to + by DATA; this can be a function ('ISFUNC'), a macro ('ISMACR'), or + a keymap ('ISKMAP'). This makes new keymaps as necessary. The + initial keymap in which to do bindings is MAP. + + -- Function: int rl_parse_and_bind (char *line) + Parse LINE as if it had been read from the 'inputrc' file and + perform any key bindings and variable assignments found (*note + Readline Init File::). + + -- Function: int rl_read_init_file (const char *filename) + Read keybindings and variable assignments from FILENAME (*note + Readline Init File::). + + +File: readline.info, Node: Associating Function Names and Bindings, Next: Allowing Undoing, Prev: Binding Keys, Up: Readline Convenience Functions + +2.4.4 Associating Function Names and Bindings +--------------------------------------------- + +These functions allow you to find out what keys invoke named functions +and the functions invoked by a particular key sequence. You may also +associate a new function name with an arbitrary function. + + -- Function: rl_command_func_t * rl_named_function (const char *name) + Return the function with name NAME. + + -- Function: rl_command_func_t * rl_function_of_keyseq (const char + *keyseq, Keymap map, int *type) + Return the function invoked by KEYSEQ in keymap MAP. If MAP is + 'NULL', the current keymap is used. If TYPE is not 'NULL', the + type of the object is returned in the 'int' variable it points to + (one of 'ISFUNC', 'ISKMAP', or 'ISMACR'). It takes a "translated" + key sequence and should not be used if the key sequence can include + NUL. + + -- Function: rl_command_func_t * rl_function_of_keyseq_len (const char + *keyseq, size_t len, Keymap map, int *type) + Return the function invoked by KEYSEQ of length LEN in keymap MAP. + Equivalent to 'rl_function_of_keyseq' with the addition of the LEN + parameter. It takes a "translated" key sequence and should be used + if the key sequence can include NUL. + + -- Function: int rl_trim_arg_from_keyseq (const char *keyseq, size_t + len, Keymap map) + If there is a numeric argument at the beginning of KEYSEQ, possibly + including digits, return the index of the first character in KEYSEQ + following the numeric argument. This can be used to skip over the + numeric argument (which is available as 'rl_numeric_arg' while + traversing the key sequence that invoked the current command. + + -- Function: char ** rl_invoking_keyseqs (rl_command_func_t *function) + Return an array of strings representing the key sequences used to + invoke FUNCTION in the current keymap. + + -- Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t + *function, Keymap map) + Return an array of strings representing the key sequences used to + invoke FUNCTION in the keymap MAP. + + -- Function: void rl_function_dumper (int readable) + Print the Readline function names and the key sequences currently + bound to them to 'rl_outstream'. If READABLE is non-zero, the list + is formatted in such a way that it can be made part of an 'inputrc' + file and re-read. + + -- Function: void rl_list_funmap_names (void) + Print the names of all bindable Readline functions to + 'rl_outstream'. + + -- Function: const char ** rl_funmap_names (void) + Return a NULL terminated array of known function names. The array + is sorted. The array itself is allocated, but not the strings + inside. You should free the array, but not the pointers, using + 'free' or 'rl_free' when you are done. + + -- Function: int rl_add_funmap_entry (const char *name, + rl_command_func_t *function) + Add NAME to the list of bindable Readline command names, and make + FUNCTION the function to be called when NAME is invoked. + + +File: readline.info, Node: Allowing Undoing, Next: Redisplay, Prev: Associating Function Names and Bindings, Up: Readline Convenience Functions + +2.4.5 Allowing Undoing +---------------------- + +Supporting the undo command is a painless thing, and makes your +functions much more useful. It is certainly easy to try something if +you know you can undo it. + + If your function simply inserts text once, or deletes text once, and +uses 'rl_insert_text()' or 'rl_delete_text()' to do it, then undoing is +already done for you automatically. + + If you do multiple insertions or multiple deletions, or any +combination of these operations, you should group them together into one +operation. This is done with 'rl_begin_undo_group()' and +'rl_end_undo_group()'. + + The types of events that can be undone are: + + enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; + + Notice that 'UNDO_DELETE' means to insert some text, and +'UNDO_INSERT' means to delete some text. That is, the undo code tells +what to undo, not how to undo it. 'UNDO_BEGIN' and 'UNDO_END' are tags +added by 'rl_begin_undo_group()' and 'rl_end_undo_group()'. + + -- Function: int rl_begin_undo_group (void) + Begins saving undo information in a group construct. The undo + information usually comes from calls to 'rl_insert_text()' and + 'rl_delete_text()', but could be the result of calls to + 'rl_add_undo()'. + + -- Function: int rl_end_undo_group (void) + Closes the current undo group started with 'rl_begin_undo_group + ()'. There should be one call to 'rl_end_undo_group()' for each + call to 'rl_begin_undo_group()'. + + -- Function: void rl_add_undo (enum undo_code what, int start, int end, + char *text) + Remember how to undo an event (according to WHAT). The affected + text runs from START to END, and encompasses TEXT. + + -- Function: void rl_free_undo_list (void) + Free the existing undo list. + + -- Function: int rl_do_undo (void) + Undo the first thing on the undo list. Returns '0' if there was + nothing to undo, non-zero if something was undone. + + Finally, if you neither insert nor delete text, but directly modify +the existing text (e.g., change its case), call 'rl_modifying()' once, +just before you modify the text. You must supply the indices of the +text range that you are going to modify. + + -- Function: int rl_modifying (int start, int end) + Tell Readline to save the text between START and END as a single + undo unit. It is assumed that you will subsequently modify that + text. + + +File: readline.info, Node: Redisplay, Next: Modifying Text, Prev: Allowing Undoing, Up: Readline Convenience Functions + +2.4.6 Redisplay +--------------- + + -- Function: void rl_redisplay (void) + Change what's displayed on the screen to reflect the current + contents of 'rl_line_buffer'. + + -- Function: int rl_forced_update_display (void) + Force the line to be updated and redisplayed, whether or not + Readline thinks the screen display is correct. + + -- Function: int rl_on_new_line (void) + Tell the update functions that we have moved onto a new (empty) + line, usually after outputting a newline. + + -- Function: int rl_on_new_line_with_prompt (void) + Tell the update functions that we have moved onto a new line, with + RL_PROMPT already displayed. This could be used by applications + that want to output the prompt string themselves, but still need + Readline to know the prompt string length for redisplay. It should + be used after setting RL_ALREADY_PROMPTED. + + -- Function: int rl_clear_visible_line (void) + Clear the screen lines corresponding to the current line's + contents. + + -- Function: int rl_reset_line_state (void) + Reset the display state to a clean state and redisplay the current + line starting on a new line. + + -- Function: int rl_crlf (void) + Move the cursor to the start of the next screen line. + + -- Function: int rl_show_char (int c) + Display character C on 'rl_outstream'. If Readline has not been + set to display meta characters directly, this will convert meta + characters to a meta-prefixed key sequence. This is intended for + use by applications which wish to do their own redisplay. + + -- Function: int rl_message (const char *, ...) + The arguments are a format string as would be supplied to 'printf', + possibly containing conversion specifications such as '%d', and any + additional arguments necessary to satisfy the conversion + specifications. The resulting string is displayed in the "echo + area". The echo area is also used to display numeric arguments and + search strings. You should call 'rl_save_prompt' to save the + prompt information before calling this function. + + -- Function: int rl_clear_message (void) + Clear the message in the echo area. If the prompt was saved with a + call to 'rl_save_prompt' before the last call to 'rl_message', call + 'rl_restore_prompt' before calling this function. + + -- Function: void rl_save_prompt (void) + Save the local Readline prompt display state in preparation for + displaying a new message in the message area with 'rl_message()'. + + -- Function: void rl_restore_prompt (void) + Restore the local Readline prompt display state saved by the most + recent call to 'rl_save_prompt'. if 'rl_save_prompt' was called to + save the prompt before a call to 'rl_message', this function should + be called before the corresponding call to 'rl_clear_message'. + + -- Function: int rl_expand_prompt (char *prompt) + Expand any special character sequences in PROMPT and set up the + local Readline prompt redisplay variables. This function is called + by 'readline()'. It may also be called to expand the primary + prompt if the 'rl_on_new_line_with_prompt()' function or + 'rl_already_prompted' variable is used. It returns the number of + visible characters on the last line of the (possibly multi-line) + prompt. Applications may indicate that the prompt contains + characters that take up no physical screen space when displayed by + bracketing a sequence of such characters with the special markers + 'RL_PROMPT_START_IGNORE' and 'RL_PROMPT_END_IGNORE' (declared in + 'readline.h' as '\001' and '\002', respectively). This may be used + to embed terminal-specific escape sequences in prompts. + + -- Function: int rl_set_prompt (const char *prompt) + Make Readline use PROMPT for subsequent redisplay. This calls + 'rl_expand_prompt()' to expand the prompt and sets 'rl_prompt' to + the result. + + +File: readline.info, Node: Modifying Text, Next: Character Input, Prev: Redisplay, Up: Readline Convenience Functions + +2.4.7 Modifying Text +-------------------- + + -- Function: int rl_insert_text (const char *text) + Insert TEXT into the line at the current cursor position. Returns + the number of characters inserted. + + -- Function: int rl_delete_text (int start, int end) + Delete the text between START and END in the current line. Returns + the number of characters deleted. + + -- Function: char * rl_copy_text (int start, int end) + Return a copy of the text between START and END in the current + line. + + -- Function: int rl_kill_text (int start, int end) + Copy the text between START and END in the current line to the kill + ring, appending or prepending to the last kill if the last command + was a kill command. The text is deleted. If START is less than + END, the text is appended, otherwise prepended. If the last + command was not a kill, a new kill ring slot is used. + + -- Function: int rl_push_macro_input (char *macro) + Cause MACRO to be inserted into the line, as if it had been invoked + by a key bound to a macro. Not especially useful; use + 'rl_insert_text()' instead. + + +File: readline.info, Node: Character Input, Next: Terminal Management, Prev: Modifying Text, Up: Readline Convenience Functions + +2.4.8 Character Input +--------------------- + + -- Function: int rl_read_key (void) + Return the next character available from Readline's current input + stream. This handles input inserted into the input stream via + RL_PENDING_INPUT (*note Readline Variables::) and + 'rl_stuff_char()', macros, and characters read from the keyboard. + While waiting for input, this function will call any function + assigned to the 'rl_event_hook' variable. + + -- Function: int rl_getc (FILE *stream) + Return the next character available from STREAM, which is assumed + to be the keyboard. + + -- Function: int rl_stuff_char (int c) + Insert C into the Readline input stream. It will be "read" before + Readline attempts to read characters from the terminal with + 'rl_read_key()'. Up to 512 characters may be pushed back. + 'rl_stuff_char' returns 1 if the character was successfully + inserted; 0 otherwise. + + -- Function: int rl_execute_next (int c) + Make C be the next command to be executed when 'rl_read_key()' is + called. This sets RL_PENDING_INPUT. + + -- Function: int rl_clear_pending_input (void) + Unset RL_PENDING_INPUT, effectively negating the effect of any + previous call to 'rl_execute_next()'. This works only if the + pending input has not already been read with 'rl_read_key()'. + + -- Function: int rl_set_keyboard_input_timeout (int u) + While waiting for keyboard input in 'rl_read_key()', Readline will + wait for U microseconds for input before calling any function + assigned to 'rl_event_hook'. U must be greater than or equal to + zero (a zero-length timeout is equivalent to a poll). The default + waiting period is one-tenth of a second. Returns the old timeout + value. + + -- Function: int rl_set_timeout (unsigned int secs, unsigned int usecs) + Set a timeout for subsequent calls to 'readline()'. If Readline + does not read a complete line, or the number of characters + specified by 'rl_num_chars_to_read', before the duration specified + by SECS (in seconds) and USECS (microseconds), it returns and sets + 'RL_STATE_TIMEOUT' in 'rl_readline_state'. Passing 0 for 'secs' + and 'usecs' cancels any previously set timeout; the convenience + macro 'rl_clear_timeout()' is shorthand for this. Returns 0 if the + timeout is set successfully. + + -- Function: int rl_timeout_remaining (unsigned int *secs, unsigned int + *usecs) + Return the number of seconds and microseconds remaining in the + current timeout duration in *SECS and *USECS, respectively. Both + *SECS and *USECS must be non-NULL to return any values. The return + value is -1 on error or when there is no timeout set, 0 when the + timeout has expired (leaving *SECS and *USECS unchanged), and 1 if + the timeout has not expired. If either of SECS and USECS is + 'NULL', the return value indicates whether the timeout has expired. + + +File: readline.info, Node: Terminal Management, Next: Utility Functions, Prev: Character Input, Up: Readline Convenience Functions + +2.4.9 Terminal Management +------------------------- + + -- Function: void rl_prep_terminal (int meta_flag) + Modify the terminal settings for Readline's use, so 'readline()' + can read a single character at a time from the keyboard. The + META_FLAG argument should be non-zero if Readline should read + eight-bit input. + + -- Function: void rl_deprep_terminal (void) + Undo the effects of 'rl_prep_terminal()', leaving the terminal in + the state in which it was before the most recent call to + 'rl_prep_terminal()'. + + -- Function: void rl_tty_set_default_bindings (Keymap kmap) + Read the operating system's terminal editing characters (as would + be displayed by 'stty') to their Readline equivalents. The + bindings are performed in KMAP. + + -- Function: void rl_tty_unset_default_bindings (Keymap kmap) + Reset the bindings manipulated by 'rl_tty_set_default_bindings' so + that the terminal editing characters are bound to 'rl_insert'. The + bindings are performed in KMAP. + + -- Function: int rl_tty_set_echoing (int value) + Set Readline's idea of whether or not it is echoing output to its + output stream (RL_OUTSTREAM). If VALUE is 0, Readline does not + display output to RL_OUTSTREAM; any other value enables output. + The initial value is set when Readline initializes the terminal + settings. This function returns the previous value. + + -- Function: int rl_reset_terminal (const char *terminal_name) + Reinitialize Readline's idea of the terminal settings using + TERMINAL_NAME as the terminal type (e.g., 'vt100'). If + TERMINAL_NAME is 'NULL', the value of the 'TERM' environment + variable is used. + + +File: readline.info, Node: Utility Functions, Next: Miscellaneous Functions, Prev: Terminal Management, Up: Readline Convenience Functions + +2.4.10 Utility Functions +------------------------ + + -- Function: int rl_save_state (struct readline_state *sp) + Save a snapshot of Readline's internal state to SP. The contents + of the READLINE_STATE structure are documented in 'readline.h'. + The caller is responsible for allocating the structure. + + -- Function: int rl_restore_state (struct readline_state *sp) + Restore Readline's internal state to that stored in SP, which must + have been saved by a call to 'rl_save_state'. The contents of the + READLINE_STATE structure are documented in 'readline.h'. The + caller is responsible for freeing the structure. + + -- Function: void rl_free (void *mem) + Deallocate the memory pointed to by MEM. MEM must have been + allocated by 'malloc'. + + -- Function: void rl_replace_line (const char *text, int clear_undo) + Replace the contents of 'rl_line_buffer' with TEXT. The point and + mark are preserved, if possible. If CLEAR_UNDO is non-zero, the + undo list associated with the current line is cleared. + + -- Function: void rl_extend_line_buffer (int len) + Ensure that 'rl_line_buffer' has enough space to hold LEN + characters, possibly reallocating it if necessary. + + -- Function: int rl_initialize (void) + Initialize or re-initialize Readline's internal state. It's not + strictly necessary to call this; 'readline()' calls it before + reading any input. + + -- Function: int rl_ding (void) + Ring the terminal bell, obeying the setting of 'bell-style'. + + -- Function: int rl_alphabetic (int c) + Return 1 if C is an alphabetic character. + + -- Function: void rl_display_match_list (char **matches, int len, int + max) + A convenience function for displaying a list of strings in columnar + format on Readline's output stream. 'matches' is the list of + strings, in argv format, such as a list of completion matches. + 'len' is the number of strings in 'matches', and 'max' is the + length of the longest string in 'matches'. This function uses the + setting of 'print-completions-horizontally' to select how the + matches are displayed (*note Readline Init File Syntax::). When + displaying completions, this function sets the number of columns + used for display to the value of 'completion-display-width', the + value of the environment variable 'COLUMNS', or the screen width, + in that order. + + The following are implemented as macros, defined in 'chardefs.h'. +Applications should refrain from using them. + + -- Function: int _rl_uppercase_p (int c) + Return 1 if C is an uppercase alphabetic character. + + -- Function: int _rl_lowercase_p (int c) + Return 1 if C is a lowercase alphabetic character. + + -- Function: int _rl_digit_p (int c) + Return 1 if C is a numeric character. + + -- Function: int _rl_to_upper (int c) + If C is a lowercase alphabetic character, return the corresponding + uppercase character. + + -- Function: int _rl_to_lower (int c) + If C is an uppercase alphabetic character, return the corresponding + lowercase character. + + -- Function: int _rl_digit_value (int c) + If C is a number, return the value it represents. + + +File: readline.info, Node: Miscellaneous Functions, Next: Alternate Interface, Prev: Utility Functions, Up: Readline Convenience Functions + +2.4.11 Miscellaneous Functions +------------------------------ + + -- Function: int rl_macro_bind (const char *keyseq, const char *macro, + Keymap map) + Bind the key sequence KEYSEQ to invoke the macro MACRO. The + binding is performed in MAP. When KEYSEQ is invoked, the MACRO + will be inserted into the line. This function is deprecated; use + 'rl_generic_bind()' instead. + + -- Function: void rl_macro_dumper (int readable) + Print the key sequences bound to macros and their values, using the + current keymap, to 'rl_outstream'. If READABLE is non-zero, the + list is formatted in such a way that it can be made part of an + 'inputrc' file and re-read. + + -- Function: int rl_variable_bind (const char *variable, const char + *value) + Make the Readline variable VARIABLE have VALUE. This behaves as if + the Readline command 'set VARIABLE VALUE' had been executed in an + 'inputrc' file (*note Readline Init File Syntax::). + + -- Function: char * rl_variable_value (const char *variable) + Return a string representing the value of the Readline variable + VARIABLE. For boolean variables, this string is either 'on' or + 'off'. + + -- Function: void rl_variable_dumper (int readable) + Print the Readline variable names and their current values to + 'rl_outstream'. If READABLE is non-zero, the list is formatted in + such a way that it can be made part of an 'inputrc' file and + re-read. + + -- Function: int rl_set_paren_blink_timeout (int u) + Set the time interval (in microseconds) that Readline waits when + showing a balancing character when 'blink-matching-paren' has been + enabled. + + -- Function: char * rl_get_termcap (const char *cap) + Retrieve the string value of the termcap capability CAP. Readline + fetches the termcap entry for the current terminal name and uses + those capabilities to move around the screen line and perform other + terminal-specific operations, like erasing a line. Readline does + not use all of a terminal's capabilities, and this function will + return values for only those capabilities Readline uses. + + -- Function: void rl_clear_history (void) + Clear the history list by deleting all of the entries, in the same + manner as the History library's 'clear_history()' function. This + differs from 'clear_history' because it frees private data Readline + saves in the history list. + + -- Function: void rl_activate_mark (void) + Enable an _active_ mark. When this is enabled, the text between + point and mark (the REGION) is displayed in the terminal's standout + mode (a FACE). This is called by various Readline functions that + set the mark and insert text, and is available for applications to + call. + + -- Function: void rl_deactivate_mark (void) + Turn off the active mark. + + -- Function: void rl_keep_mark_active (void) + Indicate that the mark should remain active when the current + Readline function completes and after redisplay occurs. In most + cases, the mark remains active for only the duration of a single + bindable Readline function. + + -- Function: int rl_mark_active_p (void) + Return a non-zero value if the mark is currently active; zero + otherwise. + + +File: readline.info, Node: Alternate Interface, Next: A Readline Example, Prev: Miscellaneous Functions, Up: Readline Convenience Functions + +2.4.12 Alternate Interface +-------------------------- + +An alternate interface is available to plain 'readline()'. Some +applications need to interleave keyboard I/O with file, device, or +window system I/O, typically by using a main loop to 'select()' on +various file descriptors. To accommodate this need, Readline can also +be invoked as a 'callback' function from an event loop. There are +functions available to make this easy. + + -- Function: void rl_callback_handler_install (const char *prompt, + rl_vcpfunc_t *lhandler) + Set up the terminal for Readline I/O and display the initial + expanded value of PROMPT. Save the value of LHANDLER to use as a + handler function to call when a complete line of input has been + entered. The handler function receives the text of the line as an + argument. As with 'readline()', the handler function should 'free' + the line when it it finished with it. + + -- Function: void rl_callback_read_char (void) + Whenever an application determines that keyboard input is + available, it should call 'rl_callback_read_char()', which will + read the next character from the current input source. If that + character completes the line, 'rl_callback_read_char' will invoke + the LHANDLER function installed by 'rl_callback_handler_install' to + process the line. Before calling the LHANDLER function, the + terminal settings are reset to the values they had before calling + 'rl_callback_handler_install'. If the LHANDLER function returns, + and the line handler remains installed, the terminal settings are + modified for Readline's use again. 'EOF' is indicated by calling + LHANDLER with a 'NULL' line. + + -- Function: void rl_callback_sigcleanup (void) + Clean up any internal state the callback interface uses to maintain + state between calls to rl_callback_read_char (e.g., the state of + any active incremental searches). This is intended to be used by + applications that wish to perform their own signal handling; + Readline's internal signal handler calls this when appropriate. + + -- Function: void rl_callback_handler_remove (void) + Restore the terminal to its initial state and remove the line + handler. You may call this function from within a callback as well + as independently. If the LHANDLER installed by + 'rl_callback_handler_install' does not exit the program, either + this function or the function referred to by the value of + 'rl_deprep_term_function' should be called before the program exits + to reset the terminal settings. + + +File: readline.info, Node: A Readline Example, Next: Alternate Interface Example, Prev: Alternate Interface, Up: Readline Convenience Functions + +2.4.13 A Readline Example +------------------------- + +Here is a function which changes lowercase characters to their uppercase +equivalents, and uppercase characters to lowercase. If this function +was bound to 'M-c', then typing 'M-c' would change the case of the +character under point. Typing 'M-1 0 M-c' would change the case of the +following 10 characters, leaving the cursor on the last character +changed. + + /* Invert the case of the COUNT following characters. */ + int + invert_case_line (count, key) + int count, key; + { + register int start, end, i; + + start = rl_point; + + if (rl_point >= rl_end) + return (0); + + if (count < 0) + { + direction = -1; + count = -count; + } + else + direction = 1; + + /* Find the end of the range to modify. */ + end = start + (count * direction); + + /* Force it to be within range. */ + if (end > rl_end) + end = rl_end; + else if (end < 0) + end = 0; + + if (start == end) + return (0); + + if (start > end) + { + int temp = start; + start = end; + end = temp; + } + + /* Tell readline that we are modifying the line, + so it will save the undo information. */ + rl_modifying (start, end); + + for (i = start; i != end; i++) + { + if (_rl_uppercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]); + else if (_rl_lowercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]); + } + /* Move point to on top of the last character changed. */ + rl_point = (direction == 1) ? end - 1 : start; + return (0); + } + + +File: readline.info, Node: Alternate Interface Example, Prev: A Readline Example, Up: Readline Convenience Functions + +2.4.14 Alternate Interface Example +---------------------------------- + +Here is a complete program that illustrates Readline's alternate +interface. It reads lines from the terminal and displays them, +providing the standard history and TAB completion functions. It +understands the EOF character or "exit" to exit the program. + + /* Standard include files. stdio.h is required. */ + #include + #include + #include + #include + + /* Used for select(2) */ + #include + #include + + #include + + #include + + /* Standard readline include files. */ + #include + #include + + static void cb_linehandler (char *); + static void sighandler (int); + + int running; + int sigwinch_received; + const char *prompt = "rltest$ "; + + /* Handle SIGWINCH and window size changes when readline is not active and + reading a character. */ + static void + sighandler (int sig) + { + sigwinch_received = 1; + } + + /* Callback function called for each line when accept-line executed, EOF + seen, or EOF character read. This sets a flag and returns; it could + also call exit(3). */ + static void + cb_linehandler (char *line) + { + /* Can use ^D (stty eof) or `exit' to exit. */ + if (line == NULL || strcmp (line, "exit") == 0) + { + if (line == 0) + printf ("\n"); + printf ("exit\n"); + /* This function needs to be called to reset the terminal settings, + and calling it from the line handler keeps one extra prompt from + being displayed. */ + rl_callback_handler_remove (); + + running = 0; + } + else + { + if (*line) + add_history (line); + printf ("input line: %s\n", line); + free (line); + } + } + + int + main (int c, char **v) + { + fd_set fds; + int r; + + /* Set the default locale values according to environment variables. */ + setlocale (LC_ALL, ""); + + /* Handle window size changes when readline is not active and reading + characters. */ + signal (SIGWINCH, sighandler); + + /* Install the line handler. */ + rl_callback_handler_install (prompt, cb_linehandler); + + /* Enter a simple event loop. This waits until something is available + to read on readline's input stream (defaults to standard input) and + calls the builtin character read callback to read it. It does not + have to modify the user's terminal settings. */ + running = 1; + while (running) + { + FD_ZERO (&fds); + FD_SET (fileno (rl_instream), &fds); + + r = select (FD_SETSIZE, &fds, NULL, NULL, NULL); + if (r < 0 && errno != EINTR) + { + perror ("rltest: select"); + rl_callback_handler_remove (); + break; + } + if (sigwinch_received) + { + rl_resize_terminal (); + sigwinch_received = 0; + } + if (r < 0) + continue; + + if (FD_ISSET (fileno (rl_instream), &fds)) + rl_callback_read_char (); + } + + printf ("rltest: Event loop has exited\n"); + return 0; + } + + +File: readline.info, Node: Readline Signal Handling, Next: Custom Completers, Prev: Readline Convenience Functions, Up: Programming with GNU Readline + +2.5 Readline Signal Handling +============================ + +Signals are asynchronous events sent to a process by the Unix kernel, +sometimes on behalf of another process. They are intended to indicate +exceptional events, like a user pressing the terminal's interrupt key, +or a network connection being broken. There is a class of signals that +can be sent to the process currently reading input from the keyboard. +Since Readline changes the terminal attributes when it is called, it +needs to perform special processing when such a signal is received in +order to restore the terminal to a sane state, or provide application +writers with functions to do so manually. + + Readline contains an internal signal handler that is installed for a +number of signals ('SIGINT', 'SIGQUIT', 'SIGTERM', 'SIGHUP', 'SIGALRM', +'SIGTSTP', 'SIGTTIN', and 'SIGTTOU'). When one of these signals is +received, the signal handler will reset the terminal attributes to those +that were in effect before 'readline()' was called, reset the signal +handling to what it was before 'readline()' was called, and resend the +signal to the calling application. If and when the calling +application's signal handler returns, Readline will reinitialize the +terminal and continue to accept input. When a 'SIGINT' is received, the +Readline signal handler performs some additional work, which will cause +any partially-entered line to be aborted (see the description of +'rl_free_line_state()' below). + + There is an additional Readline signal handler, for 'SIGWINCH', which +the kernel sends to a process whenever the terminal's size changes (for +example, if a user resizes an 'xterm'). The Readline 'SIGWINCH' handler +updates Readline's internal screen size information, and then calls any +'SIGWINCH' signal handler the calling application has installed. +Readline calls the application's 'SIGWINCH' signal handler without +resetting the terminal to its original state. If the application's +signal handler does more than update its idea of the terminal size and +return (for example, a 'longjmp' back to a main processing loop), it +_must_ call 'rl_cleanup_after_signal()' (described below), to restore +the terminal state. + + When an application is using the callback interface (*note Alternate +Interface::), Readline installs signal handlers only for the duration of +the call to 'rl_callback_read_char'. Applications using the callback +interface should be prepared to clean up Readline's state if they wish +to handle the signal before the line handler completes and restores the +terminal state. + + If an application using the callback interface wishes to have +Readline install its signal handlers at the time the application calls +'rl_callback_handler_install' and remove them only when a complete line +of input has been read, it should set the +'rl_persistent_signal_handlers' variable to a non-zero value. This +allows an application to defer all of the handling of the signals +Readline catches to Readline. Applications should use this variable +with care; it can result in Readline catching signals and not acting on +them (or allowing the application to react to them) until the +application calls 'rl_callback_read_char'. This can result in an +application becoming less responsive to keyboard signals like SIGINT. If +an application does not want or need to perform any signal handling, or +does not need to do any processing between calls to +'rl_callback_read_char', setting this variable may be desirable. + + 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', 'SIGHUP', 'SIGALRM', 'SIGTSTP', + 'SIGTTIN', and 'SIGTTOU'. + + The default value of 'rl_catch_signals' is 1. + + -- Variable: int rl_catch_sigwinch + If this variable is set to a non-zero value, Readline will install + a signal handler for 'SIGWINCH'. + + The default value of 'rl_catch_sigwinch' is 1. + + -- Variable: int rl_persistent_signal_handlers + If an application using the callback interface wishes Readline's + signal handlers to be installed and active during the set of calls + to 'rl_callback_read_char' that constitutes an entire single line, + it should set this variable to a non-zero value. + + The default value of 'rl_persistent_signal_handlers' is 0. + + -- Variable: int rl_change_environment + If this variable is set to a non-zero value, and Readline is + handling 'SIGWINCH', Readline will modify the LINES and COLUMNS + environment variables upon receipt of a 'SIGWINCH' + + The default value of 'rl_change_environment' 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: int rl_pending_signal (void) + Return the signal number of the most recent signal Readline + received but has not yet handled, or 0 if there is no pending + 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 wants to force Readline to handle any signals that +have arrived while it has been executing, 'rl_check_signals()' will call +Readline's internal signal handler if there are any pending signals. +This is primarily intended for those applications that use a custom +'rl_getc_function' (*note Readline Variables::) and wish to handle +signals received while waiting for input. + + -- Function: void rl_check_signals (void) + If there are any pending signals, call Readline's internal signal + handling functions to process them. 'rl_pending_signal()' can be + used independently to determine whether or not there are any + pending signals. + + If an application does not wish Readline to catch 'SIGWINCH', it may +call 'rl_resize_terminal()' or 'rl_set_screen_size()' to force Readline +to update its idea of the terminal size when it receives a 'SIGWINCH'. + + -- Function: void rl_echo_signal_char (int sig) + If an application wishes to install its own signal handlers, but + still have Readline display characters that generate signals, + calling this function with SIG set to 'SIGINT', 'SIGQUIT', or + 'SIGTSTP' will display the character generating that signal. + + -- Function: void rl_resize_terminal (void) + Update Readline's internal screen size by reading values from the + kernel. + + -- Function: void rl_set_screen_size (int rows, int cols) + Set Readline's idea of the terminal size to ROWS rows and COLS + columns. If either ROWS or COLUMNS is less than or equal to 0, + Readline's idea of that terminal dimension is unchanged. This is + intended to tell Readline the physical dimensions of the terminal, + and is used internally to calculate the maximum number of + characters that may appear on a single line and on the screen. + + If an application does not want to install a 'SIGWINCH' handler, but +is still interested in the screen dimensions, it may query Readline's +idea of the screen size. + + -- Function: void rl_get_screen_size (int *rows, int *cols) + Return Readline's idea of the terminal's size in the variables + pointed to by the arguments. + + -- Function: void rl_reset_screen_size (void) + Cause Readline to reobtain the screen size and recalculate its + dimensions. + + The following functions install and remove Readline's signal +handlers. + + -- Function: int rl_set_signals (void) + Install Readline's signal handler for 'SIGINT', 'SIGQUIT', + 'SIGTERM', 'SIGHUP', '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 + +2.6 Custom Completers +===================== + +Typically, a program that reads commands from the user has a way of +disambiguating commands and data. If your program is one of these, then +it can provide completion for commands, data, or both. The following +sections describe how your program and Readline cooperate to provide +this service. + +* Menu: + +* How Completing Works:: The logic used to do completion. +* Completion Functions:: Functions provided by Readline. +* Completion Variables:: Variables which control completion. +* A Short Completion Example:: An example of writing completer subroutines. + + +File: readline.info, Node: How Completing Works, Next: Completion Functions, Up: Custom Completers + +2.6.1 How Completing Works +-------------------------- + +In order to complete some text, the full list of possible completions +must be available. That is, it is not possible to accurately expand a +partial word without knowing all of the possible words which make sense +in that context. The Readline library provides the user interface to +completion, and two of the most common completion functions: filename +and username. For completing other types of text, you must write your +own completion function. This section describes exactly what such +functions must do, and provides an example. + + There are three major functions used to perform completion: + + 1. The user-interface function 'rl_complete()'. This function is + called with the same arguments as other bindable Readline + functions: COUNT and INVOKING_KEY. It isolates the word to be + completed and calls 'rl_completion_matches()' to generate a list of + possible completions. It then either lists the possible + completions, inserts the possible completions, or actually performs + the completion, depending on which behavior is desired. + + 2. The internal function 'rl_completion_matches()' uses an + application-supplied "generator" function to generate the list of + possible matches, and then returns the array of these matches. The + caller should place the address of its generator function in + 'rl_completion_entry_function'. + + 3. The generator function is called repeatedly from + 'rl_completion_matches()', returning a string each time. The + arguments to the generator function are TEXT and STATE. TEXT is + the partial word to be completed. STATE is zero the first time the + function is called, allowing the generator to perform any necessary + initialization, and a positive non-zero integer for each subsequent + call. The generator function returns '(char *)NULL' to inform + 'rl_completion_matches()' that there are no more possibilities + left. Usually the generator function computes the list of possible + completions when STATE is zero, and returns them one at a time on + subsequent calls. Each string the generator function returns as a + match must be allocated with 'malloc()'; Readline frees the strings + when it has finished with them. Such a generator function is + referred to as an "application-specific completion function". + + -- Function: int rl_complete (int ignore, int invoking_key) + Complete the word at or before point. You have supplied the + function that does the initial simple matching selection algorithm + (see 'rl_completion_matches()'). The default is to do filename + completion. + + -- Variable: rl_compentry_func_t * rl_completion_entry_function + This is a pointer to the generator function for + 'rl_completion_matches()'. If the value of + 'rl_completion_entry_function' is 'NULL' then the default filename + generator function, 'rl_filename_completion_function()', is used. + An "application-specific completion function" is a function whose + address is assigned to 'rl_completion_entry_function' and whose + return values are used to generate possible completions. + + +File: readline.info, Node: Completion Functions, Next: Completion Variables, Prev: How Completing Works, Up: Custom Completers + +2.6.2 Completion Functions +-------------------------- + +Here is the complete list of callable completion functions present in +Readline. + + -- Function: int rl_complete_internal (int what_to_do) + Complete the word at or before point. WHAT_TO_DO says what to do + with the completion. A value of '?' means list the possible + completions. 'TAB' means do standard completion. '*' means insert + all of the possible completions. '!' means to display all of the + possible completions, if there is more than one, as well as + performing partial completion. '@' is similar to '!', but possible + completions are not listed if the possible completions share a + common prefix. + + -- Function: int rl_complete (int ignore, int invoking_key) + Complete the word at or before point. You have supplied the + function that does the initial simple matching selection algorithm + (see 'rl_completion_matches()' and 'rl_completion_entry_function'). + The default is to do filename completion. This calls + 'rl_complete_internal()' with an argument depending on + INVOKING_KEY. + + -- Function: int rl_possible_completions (int count, int invoking_key) + List the possible completions. See description of 'rl_complete + ()'. This calls 'rl_complete_internal()' with an argument of '?'. + + -- Function: int rl_insert_completions (int count, int invoking_key) + Insert the list of possible completions into the line, deleting the + partially-completed word. See description of 'rl_complete()'. + This calls 'rl_complete_internal()' with an argument of '*'. + + -- Function: int rl_completion_mode (rl_command_func_t *cfunc) + Returns the appropriate value to pass to 'rl_complete_internal()' + depending on whether CFUNC was called twice in succession and the + values of the 'show-all-if-ambiguous' and 'show-all-if-unmodified' + variables. Application-specific completion functions may use this + function to present the same interface as 'rl_complete()'. + + -- Function: char ** rl_completion_matches (const char *text, + rl_compentry_func_t *entry_func) + Returns an array of strings which is a list of completions for + TEXT. If there are no completions, returns 'NULL'. The first + entry in the returned array is the substitution for TEXT. The + remaining entries are the possible completions. The array is + terminated with a 'NULL' pointer. + + ENTRY_FUNC is a function of two args, and returns a 'char *'. The + first argument is TEXT. The second is a state argument; it is zero + on the first call, and non-zero on subsequent calls. ENTRY_FUNC + returns a 'NULL' pointer to the caller when there are no more + matches. + + -- Function: char * rl_filename_completion_function (const char *text, + int state) + A generator function for filename completion in the general case. + TEXT is a partial filename. The Bash source is a useful reference + for writing application-specific completion functions (the Bash + completion functions call this and other Readline functions). + + -- Function: char * rl_username_completion_function (const char *text, + int state) + A completion generator for usernames. TEXT contains a partial + username preceded by a random character (usually '~'). As with all + completion generators, STATE is zero on the first call and non-zero + for subsequent calls. + + +File: readline.info, Node: Completion Variables, Next: A Short Completion Example, Prev: Completion Functions, Up: Custom Completers + +2.6.3 Completion Variables +-------------------------- + + -- Variable: rl_compentry_func_t * rl_completion_entry_function + A pointer to the generator function for 'rl_completion_matches()'. + 'NULL' means to use 'rl_filename_completion_function()', the + default filename completer. + + -- Variable: rl_completion_func_t * rl_attempted_completion_function + A pointer to an alternative function to create matches. The + function is called with TEXT, START, and END. START and END are + indices in 'rl_line_buffer' defining the boundaries of TEXT, which + is a character string. If this function exists and returns 'NULL', + or if this variable is set to 'NULL', then 'rl_complete()' will + call the value of 'rl_completion_entry_function' to generate + matches, otherwise the array of strings returned will be used. If + this function sets the 'rl_attempted_completion_over' variable to a + non-zero value, Readline will not perform its default completion + even if this function returns no matches. + + -- Variable: rl_quote_func_t * rl_filename_quoting_function + A pointer to a function that will quote a filename in an + application-specific fashion. This is called if filename + completion is being attempted and one of the characters in + 'rl_filename_quote_characters' appears in a completed filename. + The function is called with TEXT, MATCH_TYPE, and QUOTE_POINTER. + The TEXT is the filename to be quoted. The MATCH_TYPE is either + 'SINGLE_MATCH', if there is only one completion match, or + 'MULT_MATCH'. Some functions use this to decide whether or not to + insert a closing quote character. The QUOTE_POINTER is a pointer + to any opening quote character the user typed. Some functions + choose to reset this character. + + -- Variable: rl_dequote_func_t * rl_filename_dequoting_function + A pointer to a function that will remove application-specific + quoting characters from a filename before completion is attempted, + so those characters do not interfere with matching the text against + names in the filesystem. It is called with TEXT, the text of the + word to be dequoted, and QUOTE_CHAR, which is the quoting character + that delimits the filename (usually ''' or '"'). If QUOTE_CHAR is + zero, the filename was not in an embedded string. + + -- Variable: rl_linebuf_func_t * rl_char_is_quoted_p + A pointer to a function to call that determines whether or not a + specific character in the line buffer is quoted, according to + whatever quoting mechanism the program calling Readline uses. The + function is called with two arguments: TEXT, the text of the line, + and INDEX, the index of the character in the line. It is used to + decide whether a character found in + 'rl_completer_word_break_characters' should be used to break words + for the completer. + + -- Variable: rl_compignore_func_t * rl_ignore_some_completions_function + This function, if defined, is called by the completer when real + filename completion is done, after all the matching names have been + generated. It is passed a 'NULL' terminated array of matches. The + first element ('matches[0]') is the maximal substring common to all + matches. This function can re-arrange the list of matches as + required, but each element deleted from the array must be freed. + + -- Variable: rl_icppfunc_t * rl_directory_completion_hook + This function, if defined, is allowed to modify the directory + portion of filenames Readline completes. It could be used to + expand symbolic links or shell variables in pathnames. It is + called with the address of a string (the current directory name) as + an argument, and may modify that string. If the string is replaced + with a new string, the old value should be freed. Any modified + directory name should have a trailing slash. The modified value + will be used as part of the completion, replacing the directory + portion of the pathname the user typed. At the least, even if no + other expansion is performed, this function should remove any quote + characters from the directory name, because its result will be + passed directly to 'opendir()'. + + The directory completion hook returns an integer that should be + non-zero if the function modifies its directory argument. The + function should not modify the directory argument if it returns 0. + + -- Variable: rl_icppfunc_t * rl_directory_rewrite_hook; + If non-zero, this is the address of a function to call when + completing a directory name. This function takes the address of + the directory name to be modified as an argument. Unlike + 'rl_directory_completion_hook', it only modifies the directory name + used in 'opendir', not what is displayed when the possible + completions are printed or inserted. It is called before + rl_directory_completion_hook. At the least, even if no other + expansion is performed, this function should remove any quote + characters from the directory name, because its result will be + passed directly to 'opendir()'. + + The directory rewrite hook returns an integer that should be + non-zero if the function modifies its directory argument. The + function should not modify the directory argument if it returns 0. + + -- Variable: rl_icppfunc_t * rl_filename_stat_hook + If non-zero, this is the address of a function for the completer to + call before deciding which character to append to a completed name. + This function modifies its filename name argument, and the modified + value is passed to 'stat()' to determine the file's type and + characteristics. This function does not need to remove quote + characters from the filename. + + The stat hook returns an integer that should be non-zero if the + function modifies its directory argument. The function should not + modify the directory argument if it returns 0. + + -- Variable: rl_dequote_func_t * rl_filename_rewrite_hook + If non-zero, this is the address of a function called when reading + directory entries from the filesystem for completion and comparing + them to the partial word to be completed. The function should + perform any necessary application or system-specific conversion on + the filename, such as converting between character sets or + converting from a filesystem format to a character input format. + The function takes two arguments: FNAME, the filename to be + converted, and FNLEN, its length in bytes. It must either return + its first argument (if no conversion takes place) or the converted + filename in newly-allocated memory. The converted form is used to + compare against the word to be completed, and, if it matches, is + added to the list of matches. Readline will free the allocated + string. + + -- Variable: rl_compdisp_func_t * rl_completion_display_matches_hook + If non-zero, then this is the address of a function to call when + completing a word would normally display the list of possible + matches. This function is called in lieu of Readline displaying + the list. It takes three arguments: ('char **'MATCHES, 'int' + NUM_MATCHES, 'int' MAX_LENGTH) where MATCHES is the array of + matching strings, NUM_MATCHES is the number of strings in that + array, and MAX_LENGTH is the length of the longest string in that + array. Readline provides a convenience function, + 'rl_display_match_list', that takes care of doing the display to + Readline's output stream. You may call that function from this + hook. + + -- Variable: const char * rl_basic_word_break_characters + The basic list of characters that signal a break between words for + the completer routine. The default value of this variable is the + characters which break words for completion in Bash: '" + \t\n\"\\'`@$><=;|&{("'. + + -- Variable: const char * rl_basic_quote_characters + A list of quote characters which can cause a word break. + + -- Variable: const char * rl_completer_word_break_characters + The list of characters that signal a break between words for + 'rl_complete_internal()'. The default list is the value of + 'rl_basic_word_break_characters'. + + -- Variable: rl_cpvfunc_t * rl_completion_word_break_hook + If non-zero, this is the address of a function to call when + Readline is deciding where to separate words for word completion. + It should return a character string like + 'rl_completer_word_break_characters' to be used to perform the + current completion. The function may choose to set + 'rl_completer_word_break_characters' itself. If the function + returns 'NULL', 'rl_completer_word_break_characters' is used. + + -- Variable: const char * rl_completer_quote_characters + A list of characters which can be used to quote a substring of the + line. Completion occurs on the entire substring, and within the + substring 'rl_completer_word_break_characters' are treated as any + other character, unless they also appear within this list. + + -- Variable: const char * rl_filename_quote_characters + A list of characters that cause a filename to be quoted by the + completer when they appear in a completed filename. The default is + the null string. + + -- Variable: const char * rl_special_prefixes + The list of characters that are word break characters, but should + be left in TEXT when it is passed to the completion function. + Programs can use this to help determine what kind of completing to + do. For instance, Bash sets this variable to "$@" so that it can + complete shell variables and hostnames. + + -- Variable: int rl_completion_query_items + Up to this many items will be displayed in response to a + possible-completions call. After that, Readline asks the user for + confirmation before displaying them. The default value is 100. A + negative value indicates that Readline should never ask for + confirmation. + + -- Variable: int rl_completion_append_character + When a single completion alternative matches at the end of the + command line, this character is appended to the inserted completion + text. The default is a space character (' '). Setting this to the + null character ('\0') prevents anything being appended + automatically. This can be changed in application-specific + completion functions to provide the "most sensible word separator + character" according to an application-specific command line syntax + specification. It is set to the default before any + application-specific completion function is called, and may only be + changed within such a function. + + -- Variable: int rl_completion_suppress_append + If non-zero, RL_COMPLETION_APPEND_CHARACTER is not appended to + matches at the end of the command line, as described above. It is + set to 0 before any application-specific completion function is + called, and may only be changed within such a function. + + -- Variable: int rl_completion_quote_character + When Readline is completing quoted text, as delimited by one of the + characters in RL_COMPLETER_QUOTE_CHARACTERS, it sets this variable + to the quoting character found. This is set before any + application-specific completion function is called. + + -- Variable: int rl_completion_suppress_quote + If non-zero, Readline does not append a matching quote character + when performing completion on a quoted string. It is set to 0 + before any application-specific completion function is called, and + may only be changed within such a function. + + -- Variable: int rl_completion_found_quote + When Readline is completing quoted text, it sets this variable to a + non-zero value if the word being completed contains or is delimited + by any quoting characters, including backslashes. This is set + before any application-specific completion function is called. + + -- Variable: int rl_completion_mark_symlink_dirs + If non-zero, a slash will be appended to completed filenames that + are symbolic links to directory names, subject to the value of the + user-settable MARK-DIRECTORIES variable. This variable exists so + that application-specific completion functions can override the + user's global preference (set via the MARK-SYMLINKED-DIRECTORIES + Readline variable) if appropriate. This variable is set to the + user's preference before any application-specific completion + function is called, so unless that function modifies the value, the + user's preferences are honored. + + -- Variable: int rl_ignore_completion_duplicates + If non-zero, then duplicates in the matches are removed. The + default is 1. + + -- Variable: int rl_filename_completion_desired + Non-zero means that the results of the matches are to be treated as + filenames. This is _always_ zero when completion is attempted, and + can only be changed within an application-specific completion + function. If it is set to a non-zero value by such a function, + directory names have a slash appended and Readline attempts to + quote completed filenames if they contain any characters in + 'rl_filename_quote_characters' and 'rl_filename_quoting_desired' is + set to a non-zero value. + + -- Variable: int rl_filename_quoting_desired + Non-zero means that the results of the matches are to be quoted + using double quotes (or an application-specific quoting mechanism) + if the completed filename contains any characters in + 'rl_filename_quote_chars'. This is _always_ non-zero when + completion is attempted, and can only be changed within an + application-specific completion function. The quoting is effected + via a call to the function pointed to by + 'rl_filename_quoting_function'. + + -- Variable: int rl_attempted_completion_over + If an application-specific completion function assigned to + 'rl_attempted_completion_function' sets this variable to a non-zero + value, Readline will not perform its default filename completion + even if the application's completion function returns no matches. + It should be set only by an application's completion function. + + -- Variable: int rl_sort_completion_matches + If an application sets this variable to 0, Readline will not sort + the list of completions (which implies that it cannot remove any + duplicate completions). The default value is 1, which means that + Readline will sort the completions and, depending on the value of + 'rl_ignore_completion_duplicates', will attempt to remove duplicate + matches. + + -- Variable: int rl_completion_type + Set to a character describing the type of completion Readline is + currently attempting; see the description of + 'rl_complete_internal()' (*note Completion Functions::) for the + list of characters. This is set to the appropriate value before + any application-specific completion function is called, allowing + such functions to present the same interface as 'rl_complete()'. + + -- Variable: int rl_completion_invoking_key + Set to the final character in the key sequence that invoked one of + the completion functions that call 'rl_complete_internal()'. This + is set to the appropriate value before any application-specific + completion function is called. + + -- Variable: int rl_inhibit_completion + If this variable is non-zero, completion is inhibited. The + completion character will be inserted as any other bound to + 'self-insert'. + + +File: readline.info, Node: A Short Completion Example, Prev: Completion Variables, Up: Custom Completers + +2.6.4 A Short Completion Example +-------------------------------- + +Here is a small application demonstrating the use of the GNU Readline +library. It is called 'fileman', and the source code resides in +'examples/fileman.c'. This sample application provides completion of +command names, line editing features, and access to the history list. + + /* fileman.c -- A tiny application which demonstrates how to use the + GNU Readline library. This application interactively allows users + to manipulate files and their modes. */ + + #ifdef HAVE_CONFIG_H + # include + #endif + + #include + #ifdef HAVE_SYS_FILE_H + # include + #endif + #include + + #ifdef HAVE_UNISTD_H + # include + #endif + + #include + #include + #include + #include + + #if defined (HAVE_STRING_H) + # include + #else /* !HAVE_STRING_H */ + # include + #endif /* !HAVE_STRING_H */ + + #ifdef HAVE_STDLIB_H + # include + #endif + + #include + + #include + #include + + extern char *xmalloc PARAMS((size_t)); + + /* The names of functions that actually do the manipulation. */ + int com_list PARAMS((char *)); + int com_view PARAMS((char *)); + int com_rename PARAMS((char *)); + int com_stat PARAMS((char *)); + int com_pwd PARAMS((char *)); + int com_delete PARAMS((char *)); + int com_help PARAMS((char *)); + int com_cd PARAMS((char *)); + int com_quit PARAMS((char *)); + + /* A structure which contains information on the commands this program + can understand. */ + + typedef struct { + char *name; /* User printable name of the function. */ + rl_icpfunc_t *func; /* Function to call to do the job. */ + char *doc; /* Documentation for this function. */ + } COMMAND; + + COMMAND commands[] = { + { "cd", com_cd, "Change to directory DIR" }, + { "delete", com_delete, "Delete FILE" }, + { "help", com_help, "Display this text" }, + { "?", com_help, "Synonym for `help'" }, + { "list", com_list, "List files in DIR" }, + { "ls", com_list, "Synonym for `list'" }, + { "pwd", com_pwd, "Print the current working directory" }, + { "quit", com_quit, "Quit using Fileman" }, + { "rename", com_rename, "Rename FILE to NEWNAME" }, + { "stat", com_stat, "Print out statistics on FILE" }, + { "view", com_view, "View the contents of FILE" }, + { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } + }; + + /* Forward declarations. */ + char *stripwhite (); + COMMAND *find_command (); + + /* The name of this program, as taken from argv[0]. */ + char *progname; + + /* When non-zero, this global means the user is done using this program. */ + int done; + + char * + dupstr (s) + char *s; + { + char *r; + + r = xmalloc (strlen (s) + 1); + strcpy (r, s); + return (r); + } + + main (argc, argv) + int argc; + char **argv; + { + char *line, *s; + + setlocale (LC_ALL, ""); + + progname = argv[0]; + + initialize_readline (); /* Bind our completer. */ + + /* Loop reading and executing lines until the user quits. */ + for ( ; done == 0; ) + { + line = readline ("FileMan: "); + + if (!line) + break; + + /* Remove leading and trailing whitespace from the line. + Then, if there is anything left, add it to the history list + and execute it. */ + s = stripwhite (line); + + if (*s) + { + add_history (s); + execute_line (s); + } + + free (line); + } + exit (0); + } + + /* Execute a command line. */ + int + execute_line (line) + char *line; + { + register int i; + COMMAND *command; + char *word; + + /* Isolate the command word. */ + i = 0; + while (line[i] && whitespace (line[i])) + i++; + word = line + i; + + while (line[i] && !whitespace (line[i])) + i++; + + if (line[i]) + line[i++] = '\0'; + + command = find_command (word); + + if (!command) + { + fprintf (stderr, "%s: No such command for FileMan.\n", word); + return (-1); + } + + /* Get argument to command, if any. */ + while (whitespace (line[i])) + i++; + + word = line + i; + + /* Call the function. */ + return ((*(command->func)) (word)); + } + + /* Look up NAME as the name of a command, and return a pointer to that + command. Return a NULL pointer if NAME isn't a command name. */ + COMMAND * + find_command (name) + char *name; + { + register int i; + + for (i = 0; commands[i].name; i++) + if (strcmp (name, commands[i].name) == 0) + return (&commands[i]); + + return ((COMMAND *)NULL); + } + + /* Strip whitespace from the start and end of STRING. Return a pointer + into STRING. */ + char * + stripwhite (string) + char *string; + { + register char *s, *t; + + for (s = string; whitespace (*s); s++) + ; + + if (*s == 0) + return (s); + + t = s + strlen (s) - 1; + while (t > s && whitespace (*t)) + t--; + *++t = '\0'; + + return s; + } + + /* **************************************************************** */ + /* */ + /* Interface to Readline Completion */ + /* */ + /* **************************************************************** */ + + char *command_generator PARAMS((const char *, int)); + char **fileman_completion PARAMS((const char *, int, int)); + + /* Tell the GNU Readline library how to complete. We want to try to complete + on command names if this is the first word in the line, or on filenames + if not. */ + initialize_readline () + { + /* Allow conditional parsing of the ~/.inputrc file. */ + rl_readline_name = "FileMan"; + + /* Tell the completer that we want a crack first. */ + rl_attempted_completion_function = fileman_completion; + } + + /* Attempt to complete on the contents of TEXT. START and END bound the + region of rl_line_buffer that contains the word to complete. TEXT is + the word to complete. We can use the entire contents of rl_line_buffer + in case we want to do some simple parsing. Return the array of matches, + or NULL if there aren't any. */ + char ** + fileman_completion (text, start, end) + const char *text; + int start, end; + { + char **matches; + + matches = (char **)NULL; + + /* If this word is at the start of the line, then it is a command + to complete. Otherwise it is the name of a file in the current + directory. */ + if (start == 0) + matches = rl_completion_matches (text, command_generator); + + return (matches); + } + + /* Generator function for command completion. STATE lets us know whether + to start from scratch; without any state (i.e. STATE == 0), then we + start at the top of the list. */ + char * + command_generator (text, state) + const char *text; + int state; + { + static int list_index, len; + char *name; + + /* If this is a new word to complete, initialize now. This includes + saving the length of TEXT for efficiency, and initializing the index + variable to 0. */ + if (!state) + { + list_index = 0; + len = strlen (text); + } + + /* Return the next name which partially matches from the command list. */ + while (name = commands[list_index].name) + { + list_index++; + + if (strncmp (name, text, len) == 0) + return (dupstr(name)); + } + + /* If no names matched, then return NULL. */ + return ((char *)NULL); + } + + /* **************************************************************** */ + /* */ + /* FileMan Commands */ + /* */ + /* **************************************************************** */ + + /* String to pass to system (). This is for the LIST, VIEW and RENAME + commands. */ + static char syscom[1024]; + + /* List the file(s) named in arg. */ + com_list (arg) + char *arg; + { + if (!arg) + arg = ""; + + sprintf (syscom, "ls -FClg %s", arg); + return (system (syscom)); + } + + com_view (arg) + char *arg; + { + if (!valid_argument ("view", arg)) + return 1; + + #if defined (__MSDOS__) + /* more.com doesn't grok slashes in pathnames */ + sprintf (syscom, "less %s", arg); + #else + sprintf (syscom, "more %s", arg); + #endif + return (system (syscom)); + } + + com_rename (arg) + char *arg; + { + too_dangerous ("rename"); + return (1); + } + + com_stat (arg) + char *arg; + { + struct stat finfo; + + if (!valid_argument ("stat", arg)) + return (1); + + if (stat (arg, &finfo) == -1) + { + perror (arg); + return (1); + } + + printf ("Statistics for `%s':\n", arg); + + printf ("%s has %d link%s, and is %d byte%s in length.\n", + arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + finfo.st_size, + (finfo.st_size == 1) ? "" : "s"); + printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); + printf (" Last access at: %s", ctime (&finfo.st_atime)); + printf (" Last modified at: %s", ctime (&finfo.st_mtime)); + return (0); + } + + com_delete (arg) + char *arg; + { + too_dangerous ("delete"); + return (1); + } + + /* Print out help for ARG, or for all of the commands if ARG is + not present. */ + com_help (arg) + char *arg; + { + register int i; + int printed = 0; + + for (i = 0; commands[i].name; i++) + { + if (!*arg || (strcmp (arg, commands[i].name) == 0)) + { + printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); + printed++; + } + } + + if (!printed) + { + printf ("No commands match `%s'. Possibilities 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); + } + + +File: readline.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: Programming with GNU Readline, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + . + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: readline.info, Node: Concept Index, Next: Function and Variable Index, Prev: GNU Free Documentation License, Up: Top + +Concept Index +************* + +[index] +* Menu: + +* application-specific completion functions: Custom Completers. + (line 6) +* command editing: Readline Bare Essentials. + (line 6) +* editing command lines: Readline Bare Essentials. + (line 6) +* initialization file, readline: Readline Init File. (line 6) +* interaction, readline: Readline Interaction. (line 6) +* kill ring: Readline Killing Commands. + (line 18) +* killing text: Readline Killing Commands. + (line 6) +* notation, readline: Readline Bare Essentials. + (line 6) +* readline, function: Basic Behavior. (line 12) +* variables, readline: Readline Init File Syntax. + (line 34) +* yanking text: Readline Killing Commands. + (line 6) + + +File: readline.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top + +Function and Variable Index +*************************** + +[index] +* Menu: + +* _rl_digit_p: Utility Functions. (line 64) +* _rl_digit_value: Utility Functions. (line 75) +* _rl_lowercase_p: Utility Functions. (line 61) +* _rl_to_lower: Utility Functions. (line 71) +* _rl_to_upper: Utility Functions. (line 67) +* _rl_uppercase_p: Utility Functions. (line 58) +* abort (C-g): Miscellaneous Commands. + (line 10) +* accept-line (Newline or Return): Commands For History. + (line 6) +* active-region-end-color: Readline Init File Syntax. + (line 48) +* active-region-start-color: Readline Init File Syntax. + (line 35) +* backward-char (C-b): Commands For Moving. (line 15) +* backward-delete-char (Rubout): Commands For Text. (line 17) +* backward-kill-line (C-x Rubout): Commands For Killing. + (line 11) +* backward-kill-word (M-): Commands For Killing. + (line 28) +* backward-word (M-b): Commands For Moving. (line 22) +* beginning-of-history (M-<): Commands For History. + (line 19) +* beginning-of-line (C-a): Commands For Moving. (line 6) +* bell-style: Readline Init File Syntax. + (line 61) +* bind-tty-special-chars: Readline Init File Syntax. + (line 68) +* blink-matching-paren: Readline Init File Syntax. + (line 73) +* bracketed-paste-begin (): Commands For Text. (line 36) +* call-last-kbd-macro (C-x e): Keyboard Macros. (line 13) +* capitalize-word (M-c): Commands For Text. (line 69) +* character-search (C-]): Miscellaneous Commands. + (line 42) +* character-search-backward (M-C-]): Miscellaneous Commands. + (line 47) +* clear-display (M-C-l): Commands For Moving. (line 40) +* clear-screen (C-l): Commands For Moving. (line 45) +* colored-completion-prefix: Readline Init File Syntax. + (line 78) +* colored-stats: Readline Init File Syntax. + (line 88) +* comment-begin: Readline Init File Syntax. + (line 94) +* complete (): Commands For Completion. + (line 6) +* completion-display-width: Readline Init File Syntax. + (line 99) +* completion-ignore-case: Readline Init File Syntax. + (line 106) +* completion-map-case: Readline Init File Syntax. + (line 111) +* completion-prefix-display-length: Readline Init File Syntax. + (line 117) +* completion-query-items: Readline Init File Syntax. + (line 124) +* convert-meta: Readline Init File Syntax. + (line 135) +* copy-backward-word (): Commands For Killing. + (line 60) +* copy-forward-word (): Commands For Killing. + (line 65) +* copy-region-as-kill (): Commands For Killing. + (line 56) +* delete-char (C-d): Commands For Text. (line 12) +* delete-char-or-list (): Commands For Completion. + (line 39) +* delete-horizontal-space (): Commands For Killing. + (line 48) +* digit-argument (M-0, M-1, ... M--): Numeric Arguments. (line 6) +* disable-completion: Readline Init File Syntax. + (line 145) +* do-lowercase-version (M-A, M-B, M-X, ...): Miscellaneous Commands. + (line 14) +* downcase-word (M-l): Commands For Text. (line 65) +* dump-functions (): Miscellaneous Commands. + (line 70) +* dump-macros (): Miscellaneous Commands. + (line 82) +* dump-variables (): Miscellaneous Commands. + (line 76) +* echo-control-characters: Readline Init File Syntax. + (line 150) +* editing-mode: Readline Init File Syntax. + (line 155) +* emacs-editing-mode (C-e): Miscellaneous Commands. + (line 88) +* emacs-mode-string: Readline Init File Syntax. + (line 161) +* enable-active-region: Readline Init File Syntax. + (line 171) +* enable-bracketed-paste: Readline Init File Syntax. + (line 184) +* enable-keypad: Readline Init File Syntax. + (line 193) +* end-kbd-macro (C-x )): Keyboard Macros. (line 9) +* end-of-file (usually C-d): Commands For Text. (line 6) +* end-of-history (M->): Commands For History. + (line 22) +* end-of-line (C-e): Commands For Moving. (line 9) +* exchange-point-and-mark (C-x C-x): Miscellaneous Commands. + (line 37) +* expand-tilde: Readline Init File Syntax. + (line 204) +* fetch-history (): Commands For History. + (line 102) +* forward-backward-delete-char (): Commands For Text. (line 21) +* forward-char (C-f): Commands For Moving. (line 12) +* forward-search-history (C-s): Commands For History. + (line 32) +* forward-word (M-f): Commands For Moving. (line 18) +* history-preserve-point: Readline Init File Syntax. + (line 208) +* history-search-backward (): Commands For History. + (line 56) +* history-search-forward (): Commands For History. + (line 50) +* history-size: Readline Init File Syntax. + (line 214) +* history-substring-search-backward (): Commands For History. + (line 68) +* history-substring-search-forward (): Commands For History. + (line 62) +* horizontal-scroll-mode: Readline Init File Syntax. + (line 223) +* input-meta: Readline Init File Syntax. + (line 232) +* insert-comment (M-#): Miscellaneous Commands. + (line 61) +* insert-completions (M-*): Commands For Completion. + (line 18) +* isearch-terminators: Readline Init File Syntax. + (line 242) +* keymap: Readline Init File Syntax. + (line 249) +* kill-line (C-k): Commands For Killing. + (line 6) +* kill-region (): Commands For Killing. + (line 52) +* kill-whole-line (): Commands For Killing. + (line 19) +* kill-word (M-d): Commands For Killing. + (line 23) +* mark-modified-lines: Readline Init File Syntax. + (line 279) +* mark-symlinked-directories: Readline Init File Syntax. + (line 284) +* match-hidden-files: Readline Init File Syntax. + (line 289) +* menu-complete (): Commands For Completion. + (line 22) +* menu-complete-backward (): Commands For Completion. + (line 34) +* menu-complete-display-prefix: Readline Init File Syntax. + (line 296) +* meta-flag: Readline Init File Syntax. + (line 232) +* next-history (C-n): Commands For History. + (line 16) +* next-screen-line (): Commands For Moving. (line 33) +* non-incremental-forward-search-history (M-n): Commands For History. + (line 44) +* non-incremental-reverse-search-history (M-p): Commands For History. + (line 38) +* operate-and-get-next (C-o): Commands For History. + (line 95) +* output-meta: Readline Init File Syntax. + (line 301) +* overwrite-mode (): Commands For Text. (line 73) +* page-completions: Readline Init File Syntax. + (line 309) +* possible-completions (M-?): Commands For Completion. + (line 11) +* prefix-meta (): Miscellaneous Commands. + (line 19) +* previous-history (C-p): Commands For History. + (line 12) +* previous-screen-line (): Commands For Moving. (line 26) +* print-last-kbd-macro (): Keyboard Macros. (line 17) +* quoted-insert (C-q or C-v): Commands For Text. (line 26) +* re-read-init-file (C-x C-r): Miscellaneous Commands. + (line 6) +* readline: Basic Behavior. (line 12) +* redraw-current-line (): Commands For Moving. (line 49) +* reverse-search-history (C-r): Commands For History. + (line 26) +* revert-all-at-newline: Readline Init File Syntax. + (line 319) +* revert-line (M-r): Miscellaneous Commands. + (line 26) +* rl_activate_mark: Miscellaneous Functions. + (line 55) +* rl_add_defun: Function Naming. (line 18) +* rl_add_funmap_entry: Associating Function Names and Bindings. + (line 62) +* rl_add_undo: Allowing Undoing. (line 39) +* rl_alphabetic: Utility Functions. (line 38) +* rl_already_prompted: Readline Variables. (line 70) +* rl_attempted_completion_function: Completion Variables. + (line 11) +* rl_attempted_completion_over: Completion Variables. + (line 256) +* rl_basic_quote_characters: Completion Variables. + (line 143) +* rl_basic_word_break_characters: Completion Variables. + (line 137) +* rl_begin_undo_group: Allowing Undoing. (line 28) +* rl_binding_keymap: Readline Variables. (line 195) +* rl_bind_key: Binding Keys. (line 21) +* rl_bind_keyseq: Binding Keys. (line 57) +* rl_bind_keyseq_if_unbound: Binding Keys. (line 75) +* rl_bind_keyseq_if_unbound_in_map: Binding Keys. (line 81) +* rl_bind_keyseq_in_map: Binding Keys. (line 64) +* rl_bind_key_if_unbound: Binding Keys. (line 30) +* rl_bind_key_if_unbound_in_map: Binding Keys. (line 36) +* rl_bind_key_in_map: Binding Keys. (line 25) +* rl_callback_handler_install: Alternate Interface. (line 13) +* rl_callback_handler_remove: Alternate Interface. (line 42) +* rl_callback_read_char: Alternate Interface. (line 22) +* rl_callback_sigcleanup: Alternate Interface. (line 35) +* rl_catch_signals: Readline Signal Handling. + (line 69) +* rl_catch_sigwinch: Readline Signal Handling. + (line 76) +* rl_change_environment: Readline Signal Handling. + (line 90) +* rl_char_is_quoted_p: Completion Variables. + (line 45) +* rl_check_signals: Readline Signal Handling. + (line 133) +* rl_cleanup_after_signal: Readline Signal Handling. + (line 107) +* rl_clear_history: Miscellaneous Functions. + (line 49) +* rl_clear_message: Redisplay. (line 51) +* rl_clear_pending_input: Character Input. (line 29) +* rl_clear_signals: Readline Signal Handling. + (line 182) +* rl_clear_visible_line: Redisplay. (line 25) +* rl_complete: How Completing Works. + (line 46) +* rl_complete <1>: Completion Functions. + (line 19) +* rl_completer_quote_characters: Completion Variables. + (line 160) +* rl_completer_word_break_characters: Completion Variables. + (line 146) +* rl_complete_internal: Completion Functions. + (line 9) +* rl_completion_append_character: Completion Variables. + (line 185) +* rl_completion_display_matches_hook: Completion Variables. + (line 124) +* rl_completion_entry_function: How Completing Works. + (line 52) +* rl_completion_entry_function <1>: Completion Variables. + (line 6) +* rl_completion_found_quote: Completion Variables. + (line 215) +* rl_completion_invoking_key: Completion Variables. + (line 279) +* rl_completion_mark_symlink_dirs: Completion Variables. + (line 221) +* rl_completion_matches: Completion Functions. + (line 43) +* rl_completion_mode: Completion Functions. + (line 36) +* rl_completion_query_items: Completion Variables. + (line 178) +* rl_completion_quote_character: Completion Variables. + (line 203) +* rl_completion_suppress_append: Completion Variables. + (line 197) +* rl_completion_suppress_quote: Completion Variables. + (line 209) +* rl_completion_type: Completion Variables. + (line 271) +* rl_completion_word_break_hook: Completion Variables. + (line 151) +* rl_copy_keymap: Keymaps. (line 16) +* rl_copy_text: Modifying Text. (line 14) +* rl_crlf: Redisplay. (line 33) +* rl_deactivate_mark: Miscellaneous Functions. + (line 62) +* rl_delete_text: Modifying Text. (line 10) +* rl_deprep_terminal: Terminal Management. (line 12) +* rl_deprep_term_function: Readline Variables. (line 185) +* rl_ding: Utility Functions. (line 35) +* rl_directory_completion_hook: Completion Variables. + (line 63) +* rl_directory_rewrite_hook;: Completion Variables. + (line 81) +* rl_discard_keymap: Keymaps. (line 25) +* rl_dispatching: Readline Variables. (line 47) +* rl_display_match_list: Utility Functions. (line 41) +* rl_display_prompt: Readline Variables. (line 65) +* rl_done: Readline Variables. (line 27) +* rl_do_undo: Allowing Undoing. (line 47) +* rl_echo_signal_char: Readline Signal Handling. + (line 143) +* rl_editing_mode: Readline Variables. (line 301) +* rl_empty_keymap: Keymaps. (line 33) +* rl_end: Readline Variables. (line 18) +* rl_end_undo_group: Allowing Undoing. (line 34) +* rl_eof_found: Readline Variables. (line 33) +* rl_erase_empty_line: Readline Variables. (line 53) +* rl_event_hook: Readline Variables. (line 130) +* rl_execute_next: Character Input. (line 25) +* rl_executing_key: Readline Variables. (line 202) +* rl_executing_keymap: Readline Variables. (line 191) +* rl_executing_keyseq: Readline Variables. (line 206) +* rl_executing_macro: Readline Variables. (line 199) +* rl_expand_prompt: Redisplay. (line 66) +* rl_explicit_arg: Readline Variables. (line 292) +* rl_extend_line_buffer: Utility Functions. (line 26) +* rl_filename_completion_desired: Completion Variables. + (line 236) +* rl_filename_completion_function: Completion Functions. + (line 57) +* rl_filename_dequoting_function: Completion Variables. + (line 36) +* rl_filename_quote_characters: Completion Variables. + (line 166) +* rl_filename_quoting_desired: Completion Variables. + (line 246) +* rl_filename_quoting_function: Completion Variables. + (line 23) +* rl_filename_rewrite_hook: Completion Variables. + (line 109) +* rl_filename_stat_hook: Completion Variables. + (line 97) +* rl_forced_update_display: Redisplay. (line 10) +* rl_free: Utility Functions. (line 17) +* rl_free_keymap: Keymaps. (line 29) +* rl_free_line_state: Readline Signal Handling. + (line 113) +* rl_free_undo_list: Allowing Undoing. (line 44) +* rl_function_dumper: Associating Function Names and Bindings. + (line 46) +* rl_function_of_keyseq: Associating Function Names and Bindings. + (line 13) +* rl_function_of_keyseq_len: Associating Function Names and Bindings. + (line 22) +* rl_funmap_names: Associating Function Names and Bindings. + (line 56) +* rl_generic_bind: Binding Keys. (line 87) +* rl_getc: Character Input. (line 14) +* rl_getc_function: Readline Variables. (line 135) +* rl_get_keymap: Keymaps. (line 40) +* rl_get_keymap_by_name: Keymaps. (line 46) +* rl_get_keymap_name: Keymaps. (line 51) +* rl_get_screen_size: Readline Signal Handling. + (line 165) +* rl_get_termcap: Miscellaneous Functions. + (line 41) +* rl_gnu_readline_p: Readline Variables. (line 89) +* rl_ignore_completion_duplicates: Completion Variables. + (line 232) +* rl_ignore_some_completions_function: Completion Variables. + (line 55) +* rl_inhibit_completion: Completion Variables. + (line 285) +* rl_initialize: Utility Functions. (line 30) +* rl_input_available_hook: Readline Variables. (line 151) +* rl_insert_completions: Completion Functions. + (line 31) +* rl_insert_text: Modifying Text. (line 6) +* rl_instream: Readline Variables. (line 103) +* rl_invoking_keyseqs: Associating Function Names and Bindings. + (line 37) +* rl_invoking_keyseqs_in_map: Associating Function Names and Bindings. + (line 41) +* rl_keep_mark_active: Miscellaneous Functions. + (line 65) +* rl_key_sequence_length: Readline Variables. (line 210) +* rl_kill_text: Modifying Text. (line 18) +* rl_last_func: Readline Variables. (line 116) +* rl_library_version: Readline Variables. (line 79) +* rl_line_buffer: Readline Variables. (line 8) +* rl_list_funmap_names: Associating Function Names and Bindings. + (line 52) +* rl_macro_bind: Miscellaneous Functions. + (line 6) +* rl_macro_dumper: Miscellaneous Functions. + (line 13) +* rl_make_bare_keymap: Keymaps. (line 11) +* rl_make_keymap: Keymaps. (line 19) +* rl_mark: Readline Variables. (line 23) +* rl_mark_active_p: Miscellaneous Functions. + (line 71) +* rl_message: Redisplay. (line 42) +* rl_modifying: Allowing Undoing. (line 56) +* rl_named_function: Associating Function Names and Bindings. + (line 10) +* rl_numeric_arg: Readline Variables. (line 296) +* rl_num_chars_to_read: Readline Variables. (line 38) +* rl_on_new_line: Redisplay. (line 14) +* rl_on_new_line_with_prompt: Redisplay. (line 18) +* rl_outstream: Readline Variables. (line 107) +* rl_parse_and_bind: Binding Keys. (line 95) +* rl_pending_input: Readline Variables. (line 43) +* rl_pending_signal: Readline Signal Handling. + (line 102) +* rl_persistent_signal_handlers: Readline Signal Handling. + (line 82) +* rl_point: Readline Variables. (line 14) +* rl_possible_completions: Completion Functions. + (line 27) +* rl_prefer_env_winsize: Readline Variables. (line 111) +* rl_prep_terminal: Terminal Management. (line 6) +* rl_prep_term_function: Readline Variables. (line 178) +* rl_pre_input_hook: Readline Variables. (line 125) +* rl_prompt: Readline Variables. (line 59) +* rl_push_macro_input: Modifying Text. (line 25) +* rl_readline_name: Readline Variables. (line 98) +* rl_readline_state: Readline Variables. (line 213) +* rl_readline_version: Readline Variables. (line 82) +* rl_read_init_file: Binding Keys. (line 100) +* rl_read_key: Character Input. (line 6) +* rl_redisplay: Redisplay. (line 6) +* rl_redisplay_function: Readline Variables. (line 172) +* rl_replace_line: Utility Functions. (line 21) +* rl_reset_after_signal: Readline Signal Handling. + (line 121) +* rl_reset_line_state: Redisplay. (line 29) +* rl_reset_screen_size: Readline Signal Handling. + (line 169) +* rl_reset_terminal: Terminal Management. (line 34) +* rl_resize_terminal: Readline Signal Handling. + (line 149) +* rl_restore_prompt: Redisplay. (line 60) +* rl_restore_state: Utility Functions. (line 11) +* rl_save_prompt: Redisplay. (line 56) +* rl_save_state: Utility Functions. (line 6) +* rl_set_key: Binding Keys. (line 71) +* rl_set_keyboard_input_timeout: Character Input. (line 34) +* rl_set_keymap: Keymaps. (line 43) +* rl_set_keymap_name: Keymaps. (line 56) +* rl_set_paren_blink_timeout: Miscellaneous Functions. + (line 36) +* rl_set_prompt: Redisplay. (line 80) +* rl_set_screen_size: Readline Signal Handling. + (line 153) +* rl_set_signals: Readline Signal Handling. + (line 176) +* rl_set_timeout: Character Input. (line 42) +* rl_show_char: Redisplay. (line 36) +* rl_signal_event_hook: Readline Variables. (line 143) +* rl_sort_completion_matches: Completion Variables. + (line 263) +* rl_special_prefixes: Completion Variables. + (line 171) +* rl_startup_hook: Readline Variables. (line 121) +* rl_stuff_char: Character Input. (line 18) +* rl_terminal_name: Readline Variables. (line 93) +* rl_timeout_event_hook: Readline Variables. (line 147) +* rl_timeout_remaining: Character Input. (line 52) +* rl_trim_arg_from_keyseq: Associating Function Names and Bindings. + (line 29) +* rl_tty_set_default_bindings: Terminal Management. (line 17) +* rl_tty_set_echoing: Terminal Management. (line 27) +* rl_tty_unset_default_bindings: Terminal Management. (line 22) +* rl_unbind_command_in_map: Binding Keys. (line 53) +* rl_unbind_function_in_map: Binding Keys. (line 49) +* rl_unbind_key: Binding Keys. (line 41) +* rl_unbind_key_in_map: Binding Keys. (line 45) +* rl_username_completion_function: Completion Functions. + (line 64) +* rl_variable_bind: Miscellaneous Functions. + (line 19) +* rl_variable_dumper: Miscellaneous Functions. + (line 30) +* rl_variable_value: Miscellaneous Functions. + (line 25) +* self-insert (a, b, A, 1, !, ...): Commands For Text. (line 33) +* set-mark (C-@): Miscellaneous Commands. + (line 33) +* shell-transpose-words (M-C-t): Commands For Killing. + (line 32) +* show-all-if-ambiguous: Readline Init File Syntax. + (line 326) +* show-all-if-unmodified: Readline Init File Syntax. + (line 332) +* show-mode-in-prompt: Readline Init File Syntax. + (line 341) +* skip-completed-text: Readline Init File Syntax. + (line 347) +* skip-csi-sequence (): Miscellaneous Commands. + (line 52) +* start-kbd-macro (C-x (): Keyboard Macros. (line 6) +* tab-insert (M-): Commands For Text. (line 30) +* tilde-expand (M-~): Miscellaneous Commands. + (line 30) +* transpose-chars (C-t): Commands For Text. (line 50) +* transpose-words (M-t): Commands For Text. (line 56) +* undo (C-_ or C-x C-u): Miscellaneous Commands. + (line 23) +* universal-argument (): Numeric Arguments. (line 10) +* unix-filename-rubout (): Commands For Killing. + (line 43) +* unix-line-discard (C-u): Commands For Killing. + (line 16) +* unix-word-rubout (C-w): Commands For Killing. + (line 39) +* upcase-word (M-u): Commands For Text. (line 61) +* vi-cmd-mode-string: Readline Init File Syntax. + (line 360) +* vi-editing-mode (M-C-j): Miscellaneous Commands. + (line 92) +* vi-ins-mode-string: Readline Init File Syntax. + (line 371) +* visible-stats: Readline Init File Syntax. + (line 382) +* yank (C-y): Commands For Killing. + (line 70) +* yank-last-arg (M-. or M-_): Commands For History. + (line 83) +* yank-nth-arg (M-C-y): Commands For History. + (line 74) +* yank-pop (M-y): Commands For Killing. + (line 73) + + + +Tag Table: +Node: Top866 +Node: Command Line Editing1591 +Node: Introduction and Notation2243 +Node: Readline Interaction3867 +Node: Readline Bare Essentials5059 +Node: Readline Movement Commands6849 +Node: Readline Killing Commands7810 +Node: Readline Arguments9732 +Node: Searching10777 +Node: Readline Init File12930 +Node: Readline Init File Syntax14086 +Node: Conditional Init Constructs37389 +Node: Sample Init File41586 +Node: Bindable Readline Commands44711 +Node: Commands For Moving45766 +Node: Commands For History47525 +Node: Commands For Text52489 +Node: Commands For Killing56192 +Node: Numeric Arguments58906 +Node: Commands For Completion60046 +Node: Keyboard Macros62015 +Node: Miscellaneous Commands62704 +Node: Readline vi Mode66632 +Node: Programming with GNU Readline68449 +Node: Basic Behavior69435 +Node: Custom Functions73118 +Node: Readline Typedefs74601 +Node: Function Writing76235 +Node: Readline Variables77549 +Node: Readline Convenience Functions91224 +Node: Function Naming92296 +Node: Keymaps93558 +Node: Binding Keys96637 +Node: Associating Function Names and Bindings101185 +Node: Allowing Undoing104415 +Node: Redisplay106965 +Node: Modifying Text111024 +Node: Character Input112271 +Node: Terminal Management115352 +Node: Utility Functions117175 +Node: Miscellaneous Functions120503 +Node: Alternate Interface123922 +Node: A Readline Example126664 +Node: Alternate Interface Example128603 +Node: Readline Signal Handling132135 +Node: Custom Completers141388 +Node: How Completing Works142108 +Node: Completion Functions145415 +Node: Completion Variables148989 +Node: A Short Completion Example164795 +Node: GNU Free Documentation License177632 +Node: Concept Index202806 +Node: Function and Variable Index204327 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/doc/readline.pdf b/doc/readline.pdf new file mode 100644 index 0000000..b0925cd Binary files /dev/null and b/doc/readline.pdf differ diff --git a/doc/readline.ps b/doc/readline.ps new file mode 100644 index 0000000..011e8cb --- /dev/null +++ b/doc/readline.ps @@ -0,0 +1,12656 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 2022.1 (TeX Live 2022) Copyright 2022 Radical Eye Software +%%Title: readline.dvi +%%CreationDate: Tue Sep 20 14:17:05 2022 +%%Pages: 86 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMMI12 CMMI10 CMCSC10 +%%+ CMSLTT10 CMTI10 CMSL10 CMSS10 CMTT9 CMR9 CMMI9 +%%DocumentPaperSizes: Letter +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -D 600 -t letter -o readline.ps readline.dvi +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2022.09.20:1017 +%%BeginProcSet: tex.pro 0 0 +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/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]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 +def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 +rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 +N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop +false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A +length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} +forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ +BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat +{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch +round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 +rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B +/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} +B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p +-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ +0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginFont: CMMI9 +%!PS-AdobeFont-1.0: CMMI9 003.002 +%%Title: CMMI9 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI9. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI9 known{/CMMI9 findfont dup/UniqueID known{dup +/UniqueID get 5087384 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMMI9 def +/FontBBox {-29 -250 1075 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI9.) readonly def +/FullName (CMMI9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBD07FC5A8862A8DB +7E2B90C16137614CDAFB584A32E50C0935109679E31306B8BDD29F1756946A67 +7A7C2D9BA6FAB9B20A424AA0E6F4BA64C2801C2FB5A1156CBEED0ACB95F697B8 +BC2A6E6AA7EB1F9FD8E3C9B1A16697EE1F0E7400421A7765AB218FC837A49365 +82DC6B2C877A7DA84A81E6126EE96DB25C17A207D3020A045DCDAA064360DFFC +E3CD50E21ED239D2A6450D04F879A26443ADEB6A20ACC504989876476C7D1A74 +91564FEA1F4CC2C8C8FDF666DB537F315AE1886C73CB5B00E67E7B398A6C018E +540EAEE98BB8136C4F044EDD63C33431D2CF9740F051DF365A4045D9D8782112 +7BB5D494D9235BA98CF2F30CB119F5A904C32AD04C960C43FC1F5FD8DA7D90D8 +93AFB59F3FF4F796481AE2A7548F948FECFC6C127C4D3F159B08F206AE8C296D +EE470DB2F879EA79475E029D22D7A8535C09A18689DB0609CC233E5199C02756 +972CC9C94D9FCE264DEE5D75C8D651E4E2D1189AD9588CB815722BB5EE3C379A +6F31C2E6AE1AE4CCEB29766190AFA20EA937114978752189F1A9F42B39483149 +796FCFA123BA9CCD1D9BE28289660BCAE16C40B5B504058D55CFCBFB4F4E3D94 +DDBF39F157E63946534DA81C018B1C01B9F10DDB55E0A5C2B3985ED1977C039B +D6755EA42CD09E27751E159C30B93F376DBE61CD3AED34BA36A768F232EB3B80 +E3E6B77C4A48D408217818E398B83D995AB6BC871F20991DF57313D6EB0C793D +0F28088EBDB7F38DAF7E01AAB3476EC24D7BB38A9889A7D3038D930FF4289B83 +F54A7BE1E2D98A3822098D2E4D067A0D400C20C0B2B4BBD74C13ED1B827490F9 +ECF48F8C3994C1C5AAC9CF783BFA4F307528F51EAB55F961808A42ED53F00C97 +72A432EAEDCFCFB622389BDA707B6ACC9433B065CF29EBFE93AD14B8ECD5F47F +F073F11822C49B8BE924CDFA6348C3A75E9BB9BF3F31C41716B34794B28CDAC9 +4DB8B087E180A9B3B17680F73D9C12C8D86A922C948093629F5D7F542ED882A1 +692F4F6696865E53E3E2DD43B2D5E8C989CFAA5CA5C4C5999045E170BDE9921C +BACD6F2863F5553EAB2BA2D4A9034729EC0C4201DE90DA89B0A27C5A5C974109 +4E37BFB3F46B3A506169FB0C68E1CAFC844419A8D261A1FD86A3BB78E33D5FB1 +CFC687A5975987CE45155E5FDFAF0CC5FD5568CB1C26212F92E88255F0549F59 +41B33125946DE43436BEC00804063FBF03EC796E3361B1C852EC3038D107F80A +9198968265D5488B26D7670B22C2D75EDFFD1B7B4AAFA36DFD94640C9D0E2D20 +5BCA18683EFB91834A3939AB8EB60E2F09655BE003582634C52770DA9668C292 +2E02929D812EE2B0CC65F020064AD5BDAC5F5693B30508F40ED8E20E87149BD5 +8DD41AFF83FD1944804017DC5A04512E593549FFFAE501131CE2FDB65EFD0B8B +33809CBAEE411B3941C241550B9C30DD28088708F1C0CC3125CBEDCD985EAD28 +03313741F67DB5744A87B381147D5BA70AE1145C27F794854628D87D6C1ECCA1 +749E3465B950175D3C3F40E344297BD92D3190041A4392033A79BEAEAABB8DBE +CC14E39612F43721CFAE6F79074429221CA588AA2501DE520A464DE157A03AFE +3C082FAE7628FC0C57FFC61D0330AE6332D20FDBB09BF36848FE05E782D6379F +64F9C82C45402481B0A35989027F9756BF5A79DA2D96E10F39167ADB4305578F +90B509B6891338FA1D67DCFD61804AA6621526B2EE4769589A2646581712AC05 +DA6E98D16494F07D612743058F54FEE516BD89A8EC3E03F9D7F905175D3412C8 +F7329077FD6EB25213F3CAC94BA0C3363B759401B6EF7548C7D709F3241D030D +4EB46A1AE81863C412BDDAEA6084C37143A4C5E41BC646315B1CD09F934186CF +49D1D8239E363A435307030BD79536B50B723A39DD763DB539F24A10DDA12BD4 +E467339D2D6DB177D6FC539FA77D2DE4118EBAC161E928749F7C753ADEF86117 +58619F1155C563DF2E11ACA8347908B98113AED58FCD0394150EEC94B7F986EE +88BF7171D208D8F1774B1DD478F0C2958AE372D257E7EDF0F6B5D6059CC4D5D3 +B00FCBD2E9CBE79235B9A5A3E943CC27AABB58728C95C7DBD4F4A1F8A4DA99AE +7377B0CC0BFBD454794398AE0D5F7281771FFE87B25A819F36E692286A42D776 +01794A43CA9BB30FB8FFDAAF014F909A369E34C2F6C75B7D4EB9DB0580E33F46 +19654443AFF8384B95600B86FF8E41FEFD032355626D60C7507C058EF832DF41 +194B48A36F11082D1DCF4723E21401E0C7447AABFAB4639B26E3D2730E348F55 +53EBFF39CDD03E06E2FA5FB379603C879EDB7E1A10F89695C9C47DEEE52BE0A3 +F446F187AB9D7E93E6F9387F21129034F36DF40605D28FD526AF82CA9D232BE4 +412567F06B38ECCD496EF40A7B243E46C9FEBA4F1BF4B1ECA029C5EC239353D6 +C0B100BF7E7DB33BD1277DE104F15AA19F37340A777741AD1AD693BC76DA48CC +C6F83CD84591ECFEE375979972B0FAC4C10B625E4BFB261B9FFFA83C31DA0108 +4FFB6377466E9739E0EB64424BD9FC7239C7DD834EC6788A0F97FE714AF92831 +E1BA36A8A9E24739F1DC82DC26CC3CE28C210AA7C569B19E1784D663A0CA4E81 +AFF43E86D6F5F63778847700072CEB77A4EB946DC1F23DBC00BCE773203F76DF +00F0B085F31420672974DDC642D885E95BA6BBE43E1CA8ABF464D9881CDECC7A +E98E31B9754C9B72A8BD5CF6D4D214DBC3BA7A0CDF6635953F5AC1E7639C4A91 +C7AECE4C75CA3389C348F656FC2CC96C84C85A926237B6504DB51937C9CFCDAC +B75C31ED570D180757884E27757783DB2D5F35ECC48C496CDA342D49AA947BF8 +2FDAD2F19DFE8CD1C76A8FA08F33681F3E12E229D7DAB45BE3A3F258B5ED4980 +F15340CF20D965252843E026803E8AEE736EC41CCA82167401977AB719AA2F50 +0B791EEAA82027B3C712D2EB9D14BF8F94FBDE2227609BCAC41EC08DE2BAC023 +28352F913F7DF08D4E1C66E83F764578B22B4EB7191E852B91ADCCB1BCFDB1F4 +E63DFD152E86FA9DE9BC8908130EFDE29CC4401339C05B5B9764CF8EFF14951A +C6C13AF979546996BF22F2B96D3D585B90CD27DADEC78914DA48432C6ACBDD42 +20EF583FD41F2F6D6D10C3DF7DD077304B5940BB0462656E306CBD91EB9B756B +7014B1884A36201EC582FC9345C386043DD2818FC301EF78791C1D7854F8FACE +5DE9801DE9F59D5B4271E003AB897B2EF49501589D681D59CFFD9B03F722EEF4 +74ABD29997515DA3591496B62666744EA76DCA45504F8075C0652D6779DBEAE4 +90430C2945FBD60AD53B51DDBEFC7ED703C418B4B244C8FFA5A3C1B7600C5A55 +3EBDB93C16AC191C3A28EB2279BD3F0D67C826BC6A73D3C0AD02262368AB4621 +98A1605F2887BC5880E1AF2780330E0FD01D7CAACBB0F008A42C427F38236066 +54799594E515B289044BAC4DADF8B3686B4372C5110201221FDA923F131E07E7 +93C44BAD406838BA4D1C277EF74098B8C0EDC41EEDD58C195D7DFF5FEDBF96FC +19CEBC6C3006DD2CBF76916B4298BB915663C2F61AFD7747E03A03BD7280197A +9DA590E3D081C6F53DBF94E8D6FDDDD910A70AB18A0F6D48A590FFAB314D6CFD +E3FB20C1F3C91063F00726A2C13A3D48323F9854839405E5A29D66A43E6E2B84 +A8B3765F1D817071D4D6FF42BC785C2D11AB2B9452F141696CE19C6AFB9777DB +107D6E22D8CC6C26440BC48248AD8805C4329D46BF433741CB519B21663392DA +5DC7FC9BF37E5BC396BFADD7263D09F6B4D69594AB386B7BDFCF3BACB97A0E08 +22013E716E642592A20136CF9CFD61D4E515D80E06A4CB4FC9D9B916C93CEA95 +B83B98C48CF36C1D02291D4F5C0419338D64E33C90C90EDD2BA3B96D70FAFE0D +403A060CFF448D3E28A9B1E3916018465E86095BAAB4706CF7ED350D7C554789 +D7F4FE5F180767DE8739259E68CF142040BE1E2E8C6152DE3417C1FAEA7584B6 +20781DC4A9796431EE713DAC4E713C839D7A4FDC8AB6BFEFFE767AFD8B67FDA6 +943AD387E5D3BCB09039ADB64ECC2BE2620C6EC269E708DD06C311F450099E33 +AF46AEC644222E7DC4DBB9371EE12CFBC4F9B27AB46AD1DA96CE006E1DF8291F +A550A93026CBFFC1087B134EC6EA76F5E109CDA58FF47338A0039A786A575F70 +B8A03A4F9C8D07A4C856C77D9BCC8E3EAA740172D0C2D0A15BA35C9E5717D7FA +2691774DDE730BB9D7C70D7AE103DB8D35F3728470C76EBA0E670634E1A0BA84 +2FA102BAD7271DF2680D86A4CA6FC353869987700E5E3FD778165456033D624F +E9B3E80EBF431ACC934AA0357E824B8AD73E222B510DE8445C55C07C8E5DE46D +E478F832BDDECAF2EBB11941DCF84CCD887043FAED9AA90D12BC8CA9A0C8D94F +8D3BF1F80B14B6CAE6BB1C6AA405AA64BB94D5A82CFEA548BA070796A02F9642 +87326D066101435AB9EB40BA9EA9E61B363F5F5E3B924369796E8B78DE3414A4 +2B79C6A13ECB2F34E6299658D07D2B3DEF3D4383CE009A927F0EF5C196652842 +D96B857AB5E905201E7E8BA21A5EBED1FC6863BA9A1A6E5390407F75055E2EEC +512FBDB3E82CEA13663F1A1944DA072C765D8CED06AB461470C5723BDC1271D4 +4D1D049D3EB131743F1EC9A6ADDAA038ACA2C41D139DC6A84EC3C61AC7F1E559 +6155CC2F49171F6E07CF56D721D9728E87FC7DCBCAC46455A3694C765FE807E9 +9CBC2D304AF37E0F28CCB22F239541B53A4D24D09C662559267467EA487BD33A +0BEFD4899B581D20582930703A868655C31BE935364CA6A95FBCB22CB714C040 +9718824DFE97929D0482430726CCB5A5307957DD2432A9B6271E849148DEB76B +FAA290FF6D0B18DC5B76407852E81C105EC6CFAB0F620C6DC9DA555A33C167B1 +430A8BC338BFC7D75B7099CC906AD923FA107C74D3FBB719D77A4E5A685FF9D8 +56424EE4AA074434B809D894ED50F6A60A035C5223EA25DD8983B9B34210DABE +718D7B2BEB293FF1B63CFB1CBDAFC69552963D90F5E3FF533A3FDBB626E9FAA3 +F3C119E5E01C7BFF832A033C3515BF049E29558B1DAD652F2888E339E67D15AE +95F9BD14E3253DFE9072B24C0E7E85025B71096AF51C86AECB2921126A43156B +EC812B32B1164BD9B2B947D503C015616DBF2024F5C8CB3236C1DCA653D661FE +6B1C19A22D272A176B7F1B7F9E67AF40DB0EFD4940E58B2A050249CA4E55CAF7 +6ACFD84FB46FEF952D18552B3972D79D808B4C263B8C7E1BB647A2D03E102867 +630D5C3F2C917F765A4F6FB8106BA6A9D0093E27A4CB6049C2371287D94B5111 +6E7020776EBD744C6C920464BBBC0AC206033E8240017F8CCB112596ECD7CAFA +89950CF43FD87ACA750C03A778A37FBCE9C82C2F5ABB135BB02DA8E8C0D24475 +3BEA9D79372D0022FF1ABD378C151417DBC69FE5C9CA38D23A3900E34BF924A2 +90777ACDC37930B67DD44A2E76DDBD9B89598D5F626BFD325A978D277265DA47 +38CFAF16E7FF1946E15F41CA73F7B4B02E5AE8FC4C37B115BC567E4EEEFEFC34 +EC8974B1465AE57759EDDA28DD38A9210871D35D331AE1BE6097C3EC21C770C9 +B25D040B2ECCC3AEB1EA1BF99E0C2C0F192C13BB9152CFCF75332E03F9CEC376 +9B8C285A35F53655BE38713E09AE34BA2DA9C06FA42A6FD2D00CBF2AFD2BADB9 +1571629C65DA38A431710CF5B01FCA68E8B8569922FBC3F9B64A5509B6F677AF +1B97E91FFFEB6308AB68AC58F9BA43DB5E764021E75B56170EB44C2C0A7DB86C +62B8982256D3621EBE3DB3994DBF5C5A14CF34B4AF3BD5697F8E3203085DE9D5 +84B0598169760B925463E93DC87CE70AF4C2DF0F4287D2F2069847BCCF7A37A2 +AD451D5ACE4DBCCB2E14D5DF38B226952E7446BF87BEC736EF3D5AE793304618 +D66D3299AB9F9CA1D13F134FAEDF36750046E27706C7CBD8E0877BB6276E5196 +BC2A355D109C0253644918E1CC11B717DE6FBDA201E769812752888CD66268F6 +4ACF4A9449378F9F9923D584BA1B51F33663BE7A306887BC14A37E3C5A4654E6 +531D6EB63DE3946BD8BA95CFB037991174F36D61D842071E6625605CAA350A24 +FE551025D10871FE0E2599A63900C8520EF4911C53A03897C8BEE152451708E2 +43FCF4E700C583A5E8DBCC03BF9CAB864DBD19E1760945DEA0EC0BA38BEA8256 +D3A8D4F70F6685A99C6BD2BA8B412A26C002D76138CFCC7DF6802931E5D97BA6 +0151F6A4C572235B4196B22B7B2D14B32886DF0D2CA8A277ABAAC53B63F64CE4 +E4C088192AAB674497E8AF81961359C389B51F4A257373D907C615030BFBEF53 +DBD99058FD06E352450B658478C10454AC8FC0232B70D5CB916981978053E358 +99D322A07294748BA427FFD1E45C909171017B52B7C742FD77A8560852D819DD +8DD53211A14D7B2FD11E42941722FD3985D627FDAF87EB57326A0D290B5077D1 +8A4230BEB40523A8565F95E0D44F036A571DB698EDD9D94FEC9512369E5E5E73 +A3CA5C142617944F4F99C0697ED088ACAC007FCE06E5A6EDE7D0E03A3399DCE5 +362271BC31533866BA79FD1FB3F608B22CCD4111FFB1BA35D920A23AD157C6B3 +C3DAE11069D5E46DEDA7158C6478D8B8C0D9DC237CDF0CC6633911673C43FB79 +E4F9B7F27495201E5ADE66255BC2CBE9D9F237DECB62A19D62CB41A1C92432D2 +07F0629E913A71B3F1AAF8B8C5AC66D3C8605A48F8913E39C859E163DB1DBC8F +0ACFEE80A40B6172032E95A76B752B873FB4DF23CF3A655AF1A1B88C8DC156C6 +190DE72973950565454C0A188A33395FD3D529A88F2B578356DE8EBBC12F04C4 +5B899F667D9E6F3A4EC6DD8DE71FD4C2E2B6D56823EE4E0526679D71FF1B868D +F261489F06F97B010CCBE640E2F57BA3DC3332B329F7958394BA9777D833AB50 +005E8E9232547104065ACE33396772B0E0BD66D2C6CC54DEDD071E444D8C95F8 +6F88B31E20FDB80F77C83151B7E25BD3736B4F9BDC52EE78C41E9475E5A6D94C +D348AB42F5E36B4F167D29EBDFBD43B03F77EB296B06A36880FF17D412E77EA9 +F2E7C25FD05E16BEC6732681EA21AC3FF6893B93FC09316A370CDDB86D9E6087 +F6042C3F9ECD742778389170F5F041329782FB9F9702F7533E51F355F71825AE +2BF4F8FE50D413AC9A20C41B42537FDBE8DDC5A5C793D3760C1EE13716068752 +F0AF10812250BEDFB4D7133FD58F4587BACD572505C84A7D3802D27443175FE0 +0D89C3398B55176D8642AFBAB5CBCDFD6220C8488564B4306D74A58CD2921AAD +73CF803C754DAC2F30A5324886E273064FA51781D5BC596BFEDDCE3982EA1AA2 +62CA7BAA1B16C6EBB99B2AAC4E6C9CEFB3D10F19987045C4918DB239E6E63D79 +5F44B9D097118D081153AFF96E5EB39CBFBB99A3BE30909F614869031358EB98 +F07A97EA78AE50375941B2474DB46AF3305F2B208D45921F93743A6CB8AC584F +6BEBE25ECAADD5A789EF60C9F54446687E7B030DA3E5243189F02BA46BFD28B7 +DC14822E136AC7E40CE20458DDBF356488045C95907363864CD6943643BF0109 +EE027A3091C11EA392EA91320EBFEA3B857370AD8EB86D73F035A476F7058222 +E8CDE78CA1AA9EA69A8AA6EBFF3E67324C567B914134DE042D6F8F18A9373107 +536E8D90189917D343F5299024239E2EC1D2D177D82DC8E344A7CF2AC71AEC18 +36F139E7A4EB59A67192BCA9ED0EB25DE13032F6FEAFC3B1F4FC81BB0EDC41DF +B9EB92618667C59EA499B788CD26C2137D70F1B0AF793AF5AD0D0941F2E746E3 +F5A7F0288BC1EE11E982EAAE763CA422D72FBBC0D754AD58FBF92629DC8866A0 +431213513744DB48E52EFC89C83FEB082588E4F30D7DA77BB598E51CAE7E4900 +5CD570C914EFBA426BAFF7A56FC775ECF5BE13F2C42E51EF96784E5201C0B64C +074AC229FF0BFDF71E6D5E08D8755D2C12B770B6466A9C9C61C15582DCD2FF78 +E9E74DC2B1CAA344EC0339EBFF92CD2CC1D62E2FA8FF15E7459A83C6CFA58A77 +2F1A40BD276E76B675FD6834052B33BF9190F04DF6AA5FA3BB7D77A88DD5B600 +324C5E28216F47682EC29EABF35BA842BA2294A3D72B126EBB852AB741186C9F +FC84B12DC4A6CEC08F2D03EE61B65C845841EE17F1B765649A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMR9 +%!PS-AdobeFont-1.0: CMR9 003.002 +%%Title: CMR9 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMR9. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMR9 known{/CMR9 findfont dup/UniqueID known{dup +/UniqueID get 5000792 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMR9 def +/FontBBox {-39 -250 1036 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR9.) readonly def +/FullName (CMR9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 13 /fl put +dup 44 /comma put +dup 45 /hyphen put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9AF72336CC4AD340 +15A449513D5F74BFB9A68ABC471020464E3E6E33008238B123DEDE18557D712E +ED5223722892A4DAC477120B8C9F3FE3FD334EACD3E8AABDC3C967C61FF003B4 +B10C56D6A490CE9594D57A2D431B9E5E10FE3D8832E227A7087611431ABCD029 +85F4865E17E17F8CFBD2CADC97E0A8820E3ACEC873F31464466A9545E967E53C +DBDDB8478E69063FBB891566BAF88B7660A4405B16834761F041CCF7650AF955 +F9E853AA9F5F4382E1FE7D0C5BB4023818A2383F91249D48CE021250EC9EEB1D +2835E18FB73026250B32A8849067D5E2258797C917F998F2D4121D96560C5FB5 +B5D3471216639A8671B6DFAC5E3554EC36D9A72518525A795590C74DD70DA3A7 +78BFC43E51D6F2BA52F17D4DD00D389D3983EC54912AFF73684A8A7E345537B7 +E62361C04A47859DA084BC72EA53512DC54132EB2EE671793603015652EAFDE3 +41C4B6B679BD60AEC5153EA0D2200CB1D097DAD770F5F31E6FC475A225995277 +B867B731D5401E2D02B85BA85158C80FF7E2BBCC42B98AC867E67D25DB656072 +55A0D32AB7AA483A5A9686CEA4E2B3031D90D84DB3E2DEE7706C91BA81CB8DAA +700E5F61E07D6998C9552C81B66FD10A10033D49EF3BCB0FF22ED0A3737523C9 +8F851C61C4BF8A213BF6EC70C956AE48B5BD276CC0437C72BF6515B10739919A +F00F6ADD2798CB211668842349171A5AEB0664D2C44397E55A4A9EBDF54A3EF4 +FBBCDAD9DAEF4B0CAEF7112FA828F2F8D9F633D37E5516AB5ECEA87342EF8DC4 +3A50548490F5BC9A8A1F98AC7AEAD9D913BFA10CA86D73AEB5BACC1FEEFDCC15 +B3655522CCA2C772E902FAB2A6FC153597D52763EB44AB7489FF061F7F58E8F2 +AEAAF4D17F36CBFC00D3C653F335D14240C87DB4339DA9D30A5BD1F502BC9013 +461B9DB2FBEEC01BB18990439A0E9CA6576BC9CF6B1A3DB9386C4A5D4AA6A5DC +CFA45FB75F22E10ECB72565DB441A194902C91427B4F676E531C661F7A2C3C85 +CD534D1C89B6779B2EDC8E44667B992C20C70B663BFBF680A6CF4383EB7CA26C +4D1F06B5EF4025BBE65795F1EDB5CCB97050872D6C07BC2974F905ACDB7A765F +291365D6C8152153E7F017A25FB4476C60FD9EAF9A121633DBEAC32F62850223 +D6418566AB350F90F4B35F19598478F76B63E347D4C61E203D4DB8ECB9889181 +C387F4B663A502C638761D2782BB96EAC81A0108D7BD6938F67FEBB69218D115 +D8E89CFABCE15C6ACC7FEB983332A51A6A73CF4E341574F366713D7FB29956D9 +9BF238A87483D37E526A2EA2F101EDD34E34CB92730DCA7235AA0027189BE405 +2DAB4AA021A30C28B26C50808E1E965C02F6212EC7C72F5683339425A7739380 +A422E6191ED8453AF0CAAA424AE44DFA7CC5C2F6EAA8D73A5101D8E9517DBCFB +2858D0E8ECB7DC430EF23A9E4428CB7DED8D035D6050251AC101A2D0E884721E +2F21E573F948048BB8FF888911C508CC198BD750083B339500C426AFCD5634A6 +AAAC1C7E91249667B231BBFC64B4317192FE07FE9DA0DDB5E517D097AAE46577 +9555F29D45C67CDE9812CAD03F220B20519F2FF32DCA56A554D4296FE2D1F3FB +B209B5270E0E695EA5A0EF1144957CE045881AEB8D05D72CE57F4D34617AED67 +0D3AF0472CD8D60933651626550366E300E72A9C89ACD475C2E2ED9BD44B472D +9DAFE943F8E02A6DC38E447EED964624C37C3130E48211CA279BB6A0BD59466B +42F3D89B5746F29E084E22CF58395AF0F29E55113F3A3F2F52CB3A6DF3D026D0 +C81754B8E2E4A15F6943BE9D0087D5166060734FD07C4C57D7C7D90E8C9C1F35 +623CEEE3ABAE75E1A18A1E3B50B7266BD2D8E812CFEB4A46B856885B185640D6 +B9C22179551002B94282F57FB433B7FF157D2F0D240836B72AF4A331668AE5D4 +E6B85415F4E8B9D2F9AF90FAFAA0A3866DF417CA5A31348CF9B41B8F5F4D2F97 +CCF7ADE851B5E2E2F6E319AAF5792EBB9DA2C6AA8B73D889F3CDAA42932CDA7D +07A7E59183CD89520DDFC36E5D513BFD8AD0886046585F29B4D7F42CC0C27AA7 +53915AB1167D292FE91957E94A57FEE2D49C20C9070ECD736BDEE0F046E60350 +EA539DC298156A4E0D019E7D481FDDA6861E20678516AB80ABEC1F09B126BCB9 +52E8272A06BB6DD87ACFC423B4A4FC9A3DC8DCAEBB807C5F748F1FF8B17B8B88 +F426206BF1B7B7D239D26BC3CF0776C467A98CFBBCA5FB6145D5900137ED19DC +D002F10704AA680EC753C22E29AAB15712EF22AF73D80820A1EEE953463D4EA3 +81FAF99518D4FD0F862A324FC44C4B9542A92C5B60CC983CC8F647CE5BDB4D6D +B92B380E0E5F7208A9CD91FA9A469548162C761C1BA05AC9D60B766764D821B6 +B4E17F56CE455F06EA1EE2D38FE47581746C4C5FBA63AEE2B58E877D1A8FA83A +31C972D53B64E92EEEA147426A92CFBF76FC614119C6E9C6476FD6A069C803BF +E949FBE50B5AB1F1463F9747E8D353F7BBD991C4F90F920BC9407D8E24720293 +846D052214E60390C3CB926D38C83AF697425D80C2B4FC4706615B905516B733 +46ACA325CEA68FB21B2D17CF0B68BA4DF249368625CF83441EDBF2B86C957C1E +44CD722BD2537CE84FBA07EC7AE15C840041B9F7F3040072E6084CD55B301C08 +A64A53BD4D3DC30DCAC6C152F316ABC59B8EE978793EBD568849DCC2A75A495A +BC83470D503F8E389F54B4A4A31624E83C601B43AC1E52CB811FAA7CA6B644A5 +1AE0BFD4FC774C9C9DFC2769ABFA9C83F900BE2DD4010416053A1D4874E6ECF4 +D86E44B4CAB15D53E5630C144B0C15B58DAAD785BA298B1893D1B09BA5D40344 +6678FD2D17FF6674433C976D6DAC659175CED26139967C9B2B9CFFD78FC2570A +E5142141C2888DBF2DC8503F9137CE7CB21A1EBC2D65BF33FCEFBC85C9CB736E +24E8595CE934AB032CC70BD6A3B0F3BDBFBBE185512FDB7BE3D4A6620478453E +75D044BF770B44C9741E31985E6DAF5A318D7BED12B02A4BCFE60D25EF12843D +EFC9BAE2A3F2EFAD66D7858E83EB46BB09D2FF8AE9C43844A7001C86ED97AF51 +C511E3A89A1BE349FF5215D1A57843EF51456B9838133846F19BE79AAA5C1AB0 +5F400E5E8E7B0BF96EFCA3B8F0894BE589F2C9FB6C97BD16D38F0A237CD4F034 +099C41F85C7E2C7BEC8E02C4F327306A53B4B48B26A8926670CEEF96F6DF2281 +7C2DAD99EF8B81BBB777227C2475AE7400DC393D9C0445E925DB1E955950F7AE +53E9AC4306794239346A419F7B5DF4168382EF5956B81F83BD4BB7635B3BCC84 +7D84D05AEDC02D14675D777CD19B08124001A4F4EA96990D96000C082A12F00F +7FEF793A7FA69D56D3A38D012168C5458B667190AFE80E02C816CAFF0A71953C +D80B085CD286027E2FDBB05452AA762FD7C813B2E19A79C74190E04E746C4933 +CE1E300CAF5DD53B08110509BDA404EF07FA1BC5224BF1205DE8E0C3276A13DD +866675103B960C5F36644F96B4FAC16F5D6E91F74629B318FCCC8E8CB13EB76B +B0B7B90718D913A52A04732EA3667674994A325A7973C601A7DDD50F658E0826 +ACB8E53D4914B0274AED98D7BC3B2B7F9D48A7ECC2F8ABEE05CF2C4F2B90360B +B7DF779EAF3E103D1D83EDBE32DDA873768D8C37DC10A5354A94B4153049AD64 +FF3E0BB51AB91D7C0B4134D8731CD0270DAAF19BED9EAD800A14B65B68EEE89B +40DD624111670DDC7C030DEFE0D1B96420E249332445C155BA96231C88E70643 +D526BDF3CA1E05FEE72CE2B881CFC01ED780C10E89F0828AD55FE29043BC56E8 +2750A6DD15AADD54492F6092618F4CC6A31766B17FC60766D18C307EFC9BB787 +39047DAD6B38419EFBA46B4E2C932F97451FE78AD75FA90DE409FC6DD46585D2 +1941F5ED47A8FBAEF5A917A240959E8D9F9917DEA3247D9CAE6BF7A88DB4C4A4 +F9F5A6DCE542420A032FF3392FE0F3357B51F884D6181583A554F75B1DF192E9 +253CC828FF06B0D992D5316435980B044BB191508C7C45CD90F797F88856424B +14A5707459C50EDCF3E3D8D1667AAA83015405354CE744C66D9A5728F29E0085 +6DBF740717FA0799E3BCC4ED7841588B496A5E549B953A7FD288B4A045DB611E +E3B2F35963FF18ACCB1C968BEEA2CBF52B3999AAF89A05320BB2E97F52CFE06B +9F10E3A79865A3059A957F97972D80ADF678A36E2B586C101FC6AFA4D137C13E +EE7102C9B8EF78CB057F8B7476F146E8FF5C897FD5503DD198128CFF7B5FB339 +FAD0AF0EA967F77B07B367A4AC9F668F8BED99B98E87FAC750EE045602D76C3F +289FC9D97694C96AAC0AD1BD3FA94DF2CBCEA24B40F47B9B59E54EECEE7AC4C3 +A3F5D19160E4C1EA830D57FBE10D8D46AC5CA0260F22FAA45236F0F542BEA9C5 +5A88F878F68B36114E0573900C65E305462B22A3429A17C7A567694414DDDA46 +5F30542B8FD4F00F6C295B2E8D3A986B953D96822DB2ECD48E8BB1763434E652 +152EF3717F5E7FA10FF0B01D9F64E22C5DBD7254629658887BACEC0ABDE972EE +67299FB84A05B3EFE22B6976DB4CCA384232DDAE38C31623A4E39EA2E82C1EA3 +BBB68F1A7DBF405DEC37CB7203A895C36A44BD2D63F45B3888AF91D37B510A59 +3C921BB44DA620892AD87B665F69F6FA510B071ECC403CB2BE2F54B3969C9E88 +713244BC97C1466DA8216DA7600C221E7E7EF5C789D2E12B36422023A03E11BF +2790FD6062FE6BF62F5010A92F0A104B76E255A0975E04F6F20F760881BDA7F5 +D834D1D328B6EC19AA7D5E5678A84C74C82553DBE8BB5765E84F5A8789032143 +6020940B4B8D45FC3433D356E28C25F42D0C19F911213D85951B2B00D01B77BB +A4C72E964F9D95422BEDE582A05CD52E03D28A996E6CC8FCD910CBAB728073F9 +F9FAEED5470FFA55930447C5BA816F826F983D53EC9941EC8364B3060FD74C95 +26D4F5CA753B574FD2FA4D1D333785241D8741B79E628BC852FDC35478C5ED9A +C1BE88C5EE7302816E65C12B58EA16FEDD4672EB3E24B6EDAD5DCE263BA8A970 +350B651E5A9F3C281D85BC3F44EADD0D93402E36489BA5185E7D388974B0B700 +70575188BB610CCA20F081E2CBDA13DCC6F72567962ADB342E02C1E763B673C5 +F7384E24C6E1730A3A790D690A2103AEF88E0C1D4480DC9B25E5C8C9E1919C95 +F83320179B4C7C4A26D559BFB24D7D596FB73758C9990C451E77FCDDD17763B8 +9C30A9534E3CB6680D3D419D4B70B0B0A0D160FCCDE169714E373F65B7144CC2 +DB9A44E041211E1517D3148E65A2486CBE5E74E625261CCF65392FB4F3091473 +F9E8DF327D59A58558E5C9F7190DB577D5DC658F5E36258291C708B3D224653D +064BB6079F91293FC733710893AD1C96169B30CBFE4E9D52E7EFAE4AFEE68FEF +1AFD5E7E9DFCE8DE332B0FDC0514F9B3090AC85BBFB527FD8034DD33E9576325 +A8769AE09AF1BA792447DDD932B98FC9486B39E0B04DDB3EFB7A30DA0940B33E +E27490E0E841E87B1C90E5248A91742ABEDC10F43A8AF0F9C5B4A4930B1AADAF +01874B9AC3B8D0DBECCDA6CD7E96471FAA15CB7F8A599C5746327CE392224C3C +40BD60AF97BCA6FF6FCAB2FEA114D7300B89E91C3BC92D5B3E2C83BB37992D8C +72F661EFD0AA034C738C019DFB79BF40651A1A34BC1EB9F5AAF58F8B3DA32645 +24AFF8636486F08BC21533B5FF7391B0679A78DFDCB03DAF6BB7475A1D51DAC1 +EE4BE9B986655D1FDB6936445EF99B58B303FE79F11275EEA96A9F6808EA8775 +D873D1052FAC93769789C700F20EB2ED6D15676F6E563A769CA9298E463FC311 +83281483B1C953370D196727A6A0E66D32D9480AB1B6DCA77868C1A2D5DB6483 +5F31EB6B18EEFEF1CDC31533E69B0AFC6B30FC9912DC89BAAEEADC30BE14F448 +1A6B70D36A5D9B01799BEEA686066114910842D022EB464A9A1E8F0A5628BA69 +AA9A1925CCADD44703BC67A89F3B48E4680726DC4360274185CF3C8AB747A8FC +4B928AD62B092EFE48B01E33ED756DB696171FDB775396BBA138E056F71EDAE3 +7A1E4CC272B8418114B0E81DE0BC43DB3C133167344488820A92DF10FFA26FB9 +65FCA2C87D302E956DE6B4FE145145440C83DB43A68F8B29A592B127BDF49063 +B7F11E155CD4CAE305525BEA56B7C412A6260426407BD892A3F2B444AC3421E6 +FB6E6425EB5C3053C5644666B80405530FA0012B54557327C98E0F4F064099A6 +4ACAAFC1870359C1B6FBE7606BB8A26026AE20C212210449905E628AF1B20490 +8CE908B7EF3E3DB551C85AEB0F7FEB6A8D215B97998E5DD9C7CCFB2A9402B8B6 +1770D4023777D4B45A73F471355353412C51D4CE71FAD1E0AFBD87B5F86307F3 +10D0B94F1194EFFB64AD5DA54A4200490F609CA8B912E149F8217ABB1E9EBB3B +C4470E7365CF5E1E761AA1945044B225BD53D142F6588C50E0644740F7DD55E4 +8F73201E5354A8BC78339211AFC4935F44701FBA043AAC4BA4698E9D7700029A +C79F992F62627C91EB855F64C4B251718FDA71EDAF082A0C7B00550949D617A0 +7071FB14F05620CCF2180941341D8E60FC88823438FD728A4042AFA8B853107F +852F631518B61B234565291B5D5B89DA818DEE3AE3B68A2869DFA63255CC882C +3B16BBA08FCE3632E57FF7A07F857A1F0FDCADAB39D77960BD827CCC8661A997 +648BF5BEBC0FD2286C2A112A8DEB9CCB6330A049170D5D68EEEEA011D3EF3EBD +855236B9380087CBBB6BE24191F728B7EAC5B50F7A547AA0989B7C7D3437DBCE +1669341264E290646F2C8C5A3ACAAC7CB63DC692FAAE13E9B40E8BD39FE16A0C +1660CE66872D061056C04DDDC265C024BEF8B7E3C3AEE76FE5C9702002C28BE0 +B180295EE00E567FA2E5CD1638226D24A7C732E1BD8103B476EF5702768689C7 +D4FCD47F2AB94A2B1FBAE6ABF87B09E7713C773FB65CA83F7318035B332B9F99 +24A2C8897527021321D003AAD7C273E4BFA2710B9BB26C2CFD3D9A5D7ED1096C +552D50028AE2476FCD6D12A5D0A897521313ED1A3A8456A70C16EAA50A3E6733 +6DC89FEC56AB54A579EF264377A103939D5EE00A90B4F2206D0023AF9491FBE0 +800C6540FC945199E20E945F46CEEA2E885F6800B9DF042BCEF4291A4B1A62C8 +6A7ACFF872B25FA3AE69E0093F3D0FF13A3313430C06F1AF94D500431566F659 +E8C859A5F80F5BD2E85C8E32603D3745628E8FE6FBC50FA68F9C3811A2BEFEA4 +5852CAE2AE5AAD3230ED050593BAD0A9581EB7B327C6916B8FC348F4C23E6FA2 +00FA28AAACCB3091C1D83F7BB88672A53A2EA3B8C7C24374E400C57F0F01019F +E52D5C47F389D4C9AF126F4080F9AB8D1C8F470932BBECCEC72A9796F6E965A4 +82057DDB43D68298A00880D4C2E2496F26F015FD83C5549215753459310339B7 +6B2961EEEE74DA31FEC8E2BDDA42D4080A32372AC372524BDDA580EF6634ACE3 +128C69D04D890DCA337212B109585C665AA83EFE47D5BABC2627A86EAD11BF7D +744176652C7F9497785A7A06A994ED8414BBE8B26E74D48CB83FA24AAFBDD507 +84A90195EA3D77BCE8C2BEDDD1DC52E8164DF15D65B916EBDF3A8A76849653DF +AE3CAF9561AF3B705F75B9E5DFD6758DB65A2FD54683759912E0D0035CFBCD86 +5D2579DAAEE12528C23ED8A1A2F34CAD1CE8BA67D0B660E9281F247EC10F816B +FBD6B9E8AAAA1DFCC4C9FF1C6AD05C0D776DBF675838C2629826D5337EED815F +4268604A4EED01A2C7842FCAED2E37F7F39F980866DC5BCACA8616749FFE946C +A0AB0475DA734C00D99912C544BD31F8A69367D068F0A18EE79FBD4D5385B8C1 +DEB92502ACB3B657A54C9BF786D7DC1ACABDF29591D77ACE1D4FE00E935D2858 +3733656C79DD1C174C26DD97D462B4323F33B410DEB64244095927C572FA90C6 +4C8B709C5B7E4386AEB936C2656B59AAFB74F9E40E680D890903458CB1B2AB8E +6E629F88B51546877F7799B99DECDC13638E2765343988DE2ED33279DEC3FF0E +2255A734F5925608991F068274CB1E5301C5B8623C5878851857B3E665490A7F +FCE5A8DC0FFCF3D56BF55E4AB2ACC6743F52B59C1343A1C25BD46A6A3722957E +24A6F4B970A594F67A09BADB6A7B4BEAD3FF97D0734470750FCE29807D315EFE +F93BE16F39C0B59D107D1834FDDFD520D8A429FCDCA408C79DEB580081191B43 +20650B5375AECFC2DC500E3CA934AFA3D241FE7988892CEA42C8677DE18C43FA +C3094F8DCB1D070DE0D32B69E2E1ECB4A82AD9E38D889D05418DF4E3C398FEA7 +BFE9B364A389B13BE713F5B2553ACD16C14AAE521B63E8A7DD0258EFFB95646C +18226B01D916D41DDB322F6E83C3E3717FC113BF7D7AFDA2CC03B8175BD7DCD2 +AEC82FB156E051F2D87B9F12F81E1F43E822EE27219758B3E237AD772E7B1DB0 +19ABCE7BE6A2FC3C7DA0766FB82CEDBAFC19F7EB19C7448C1719C88FE99BCB73 +F7DEA427FBFCDF4F00E0FDACD080AF068F7A1CDE18315BD694C60B1DC71DAF1D +1009AFC847156F96D9CD38A764D0EA70E5E9B6E19A2A0B80ECBB84CA44C137F1 +4925EF5766F00C22F967F9F68D7637DF0982785DABB8684A5525C6D23DB05B31 +026B49433392C8930BD9661B23C2EC0E0BC4F00FFB2587943DFDB4C6864CF1FC +7152CC20860754204B7D4536F3C11460CD2626DEE88BBFE1CAFB5E62C9BA0C8D +514629E5A25C4FDEDF56FA2CFEE1A648E78803062DAA41E3D2CA4400C74C3C33 +B77692A278BCC9B4E4512CFE8D71D53750ED0F7BBBC811EDDDAE0E7049BD916F +8D1819A0AEF50E284BCE7CD48517DACB587D2C48AA89062A791DBA7549C22C0D +2B14B2FFB48A05CEFA73D1F81BECD4BE921AEF860B30CC1FEFA6199BB39A8156 +1AC9CE55140BD9EFB3B2BCF6FB6645816F11C172C525D9E623FE2041BE9D41C1 +A3338195A24873E110DE875B1E4FFD5CA3CC44FF36163C867855620EA60319B2 +27A40368957F81B38F6346C45EEF35636B01923E356F2F4279001DF3FF52BA26 +B0C523895515658EE61DCD016A839A71ACB5645B4CEF3035843545920F7F6624 +B414350819CFBED577BEC9CAF1465EA75DFD39318F02ABF8697621325964DD46 +E8206C04B7C5285DDC91EDBB7F76DF9C9448A778F4D62307B2F042B169053544 +B3B19D36FF290B4BD1B807749BBF6077BA682539E07B846C9BEE668BC5DC5DEF +CFAC349ECCA59B1A46CF89F2C410C648AB50B63BC616BA3D448B1A08A2C10BB2 +CA96A7BB2A498E7F00CFFFAC03C1BFFBA166D4948593ACEFB6E1E6D586D24F58 +43A02C59ADDAAC725D06E4C4EC1E1F5B2203289908605D950551C23A71E12403 +A443576CA8BF7C365ED9ED2AC7FA6B17A786DFD3731967B43B8715028241DA09 +934CD93AFE81013D9642DFBA66EA1C024FC804ED884088FA398F065F2AF53163 +6ABC66A18AB971A7B494B6EE78A12FEF18EAB42529A1296D054ACA5BF2C386B3 +5DC802B67E362B2FC35633487F2C0FC90333508BA50DCA2EBEE2FB939910E7EC +128B7A7AA0F7A7CA91AF854AD2505F5DA70889940C4945BE229F6C2ECD1A8D5A +B35F475DA0D33125009C6C3E7730DACFCF279EDC74DFC88630342D1D81315AEF +884EABB7E785653BA2463C48708ECE70A49503575048CC768BB8F13FAECE7FCF +29FAE1045C5C6E475E634DA1A2128A0D16487BF3D62BBAAFF6ABE72FF971C361 +E5B530D6C6977137319321BFDB6A526B7AEA07EB6548F6FACAD54C426D3E5207 +0443CA8ED660D368BF42FA1107A9503F5FCC4EB8D4C7D2CE580597E4A84EEA31 +135D139540C7D5B0AAE65FFE3475C1F2DA4318DB4204677B4C30652DA10155F9 +C1CEE50DA12BF2F08521A17641A2F5541EC84195149392FB34E900EE8C130A72 +A06E8D5C1C3012486BCBE6F82A8570054C243ADAB55F1BD0A2AC1D73029F6E0A +91230FC5BD62E7C8179271886FE2A3D0A4D55D26A953064E16B99189D714CE51 +6C1ED25B47BBBF5494E1C788038B82BFD0D6CE9DB60E49EAF500DF9ED431BE3B +5C5E93A14078C7962DCCF2A34966BC16EC17989C10D2C74FE0DC9306CEB61DF8 +A42FB761999A3EB75E31431F568CDEB0A3CC8C5FB6B76B8768086F20D284D302 +A144E5CDDB303676D612FE7D749FAF7E0EEBA5D5FF48E3CBBE5046131A8A00DB +21F4A2C8788781CC2D3ED96148B7C77CAA7278CC32284B2BC83BBF542172F186 +677F635F73216E1D41D2CA802498C469234B79AF35BE521DF9E633293B1BAFDD +3A0B043626E3CB0EE9072FE09F90B8ABAB28F60C42CD3F2323B7BA4E4F9FF6C9 +BEB3D0E12B74799E2321A65B88840470446AFB66E7B9FD92638947923F8942B8 +B9182715510969377DE1362216F2EF6B96D4622ABE65EBBC5F7FC397B50DF682 +07EEB73A649383B86EB255B9145916EE2E8C326052ECDE0EB367DCB62F7F88B3 +6F9F23853CF377EDF5F4B1F0A6DF99EF29F21452D2628A40F589BBA831118DA9 +DDF19BB85E5AF7D79F5DB4015D90F3AF189E7D5E9E3585B9D444218B889366E5 +7B4B8EB34F4106ED4E54EF08F08581EB40A5B49E214A86251FEB131BCB071406 +B322E962F9B14AEBD38747B44F976B30B184AD7667EB5AE3EBA6744D6C8422D8 +F4CB40C3216799F46067651DD21F6F763A59E93B9A67484E6CF9EEE3913B6687 +BFE8E68087D287651AA7666BA83B0D271A422E3F0FE0C2942AFA64F71B8237F5 +31C7F7D6E5D4903D3CA32C77781BD8C959FD6DD1BE80C113B59B39F1941E8770 +BF7F8B7139ADF77E2CCADFD99E2A87A5C10802D2D6CE3D9A3830378BE37D8903 +B87B38EF25C49FE93C797FEF7114D4BE3A58555F701CE4D8BC2605CEA9725E08 +B2460459E5A4CE44793FDF3C212A6B5909B49A4ECA55F53AA3B9AF63A2DDD339 +9023D61FF6C29721EF2B49C89320372059FA33F25CF6BC7F64E3B4EC7D7527F9 +62A8FE056259BFC788F24506F8F6E9777B693AA26F646A22F3ABA85A6FEE1B41 +373D90C3CB55A474A2E5EF80A129F5628CD064B590DEEE7935DE9AF5D68C622C +814452DB304B52DEF5C9490B1366BA1834AC5B27DFF17CAA5722CF783AC8283D +B84A3DD19587B204EF584499E78DB2222DCCD50847959B4820CCDC092F88693E +50B9DA33FFEE72C235520F58332A3725BF62BEB005D36FD3CD1B2310B2982A34 +A095ACF013BB5C340A21B4537A7BDCD5161377A4818CC44D8A15BE7CACC03D33 +11CDF7811E0CF02F6F3213D3B598713F2EDE54E6857A526879C920D085A01997 +8DA06915850E5402A4444AABCB08881EDCA2DD068E1455BF9A155C54EF315FAA +279D726F57FC86300BC4D9DFCD4D44EDFDDD4B00DE34948028C7A9255B931CC2 +77A0FF40F7ABEC709B67C6EADAD9D24B014DEB4C342E5F37E1CA26A1999CFDAF +50D8E76F1715FA8EF095B88D9A8DF4325572B26753F763F264DA8887E4E5845E +2A01F86149EBDD9CFC21CF2852CE95386DBB1E4DAA2113AA1E0C53746A3AA5F5 +78570500FB89E376549E282E2AE990E72C0E77F701FCC977868ED3FBB7C9CCCF +CD28795A80AE8787EF1D0C374297819A324504623E12688B08E4782B18F05C75 +2E2CD594D0E6C10B002AD61CE491D4B95244E83DB861E36D293C0F556B295FBB +8F045711CD606D024F0F03603629F3BD495183E821D0A1ACD83F3376B62D278A +FFD084EF020A119836EB60D0F8A059BAD8D8CCE26A37182E7C89CFC2AB80C724 +275E921332ACC5A6991B36A2C7828B632DDDAF04780086F84E1A122461719992 +061E3F597C8E6DD8ECE708251DE0DED5DAF913AD4130ED89DD271B17C556F466 +A2587876F7954A9888751460B468313DDD88F267BE6C5FEA492A6CF1365AB8B0 +D8E872A625799B9BE1859AEFAD98B6F41AE33D0CC069BD36333819995FD9B510 +715BC8AC70443A107EB2E34809771DF24D3AC09D47768D3202D809B023FABA7D +C6B8CACBEEC4B47082177995C3C00D08446DA56D527D8857E5D3342EC3C42DFA +7E35C992B8C2A50E7374FE57092086613D5A3B4567A9DA3758F48E6817CA3C2D +BC552BF4A17E92DFB106E74A2C53DBEA13481DFB9EB64422F5CE073512B67018 +46E902A52D5AC8A943C93B1921ACBA76D6DD2DE9077C280E1E6E43ABB9DD11AF +E065D8EB102BB53A37F6B491EE341CC8D4D3AE311F122A28F7FC5481CC80E119 +EC3E67AEAC772AB31D41151AD51B88122325456163D1E84EFBC5CB9A55BC4C15 +7A2D56ABC55E61A49311ECB2C3267F7EAA3C284A0135985EB5E2D4113BDB8433 +123A4A4109F6926D9C38D502B5659AF97969C3160BA5E6E32B95AD5D6855D307 +89BDDE727683B2F05D6D9E74813CAF8038C03C574183CA79025D33FEBD68811E +1A3B42236EE1CF60614237538CB2C9567612DE1DAB1C864828B9604A5D4A52DF +D5012F80352DB0AF93758E8DD4ACEC077160D74FC723F6878B2556690E9ACC91 +5B552329E06B87A06E733270BE98C16A30CAE3A798CA80E7A9C3B8733A9428DE +0F4DAFA656E6D01470FA746BB58E686846C29933F9A48932E6AD3A20C7A0FA91 +AA45745AF05ABC50D77498AF81E72D0DBF7D6FAF97E5538673C57A6EE39776EE +06BFD30F67A57AC796036A5394DC9A8C75556144497637C28F3C56DBFB21595A +D2A46D6C4A0B63508A238B97ACB24499AB5540851B86E273B7B2DED24B458DB1 +5280B3F9040C08672F7DFDC4B69C54B92EE3555902BF55D64CFC95A9DD143C18 +FEEDB1BEA96762AECDA9DEE705AF2DD54C619328B9A26D019984DEC1EE34F30E +CA4EBD5A4AB2C8547C0EB264D47943AF93E281A9E346B6346B809363CD7D67D9 +9A8D6A2B1C109C8F226BE11C405F18E0197A47E44B57C1CBC8CAB957A2F60771 +CF8DAD0E361FF6891CACF5672997B0357F9A5D16D424F2B32A0256210106B3B8 +160B3CF0FB7D28A84FA861B0210F383466B6E69DA79B59D95AA05D608DAE9D56 +7A05E3CBBDFA558C8F3A5D5AD9F70AD60FF059AD26041DE8819EDB2746DAB76A +6600D7C708F08D266FE22609BA7462A9378E691E175230E4D4CF6F1FB40BBCE0 +31E34EE09023FB7BEB557267986637DD5D9C70E38C14E485BB6CDFE0826F9DFF +F5094AABB6719C11474BD877358C603FE16B3A26B8C3CA026E6B29B1868F2AD6 +2960CF99DE7E16B18D3480F52585F39D0B45574D4A0008BCD49C3F2B27930B25 +3117251BB7116A23C586F7B0706F7F2BB00611C4FA705CC11783E6A1D868E1E4 +5685B46356200BACD8C9851AC613169CDF40BBF1B400E21137D00EBA1E782E97 +BD6972E405ECD84202049433393B3C283D44AF4C3BDB3D1B700F43AB576B4C7A +195500FEE676D1DE97C32859987267428884E4E58C2D8FB367810741B0FB7D37 +4F185ECAE1AF834069503E8014FA13225152CBEDD5A1CB8895DE03E1B1704892 +23D2C13F5EE53AD95EBE5C0AE07FE2DD36209897001FF645DB1276FDA49951B2 +D319D63FB045B477BE528C3667F0CCB6853E0D31C77ACFBED46251BFD60C1321 +D0FD450193208958E91C05E9518F3E2FB9D4B6AFD5084ED2C13DC3E59F85C853 +10AB3B7706863D6056954E6E89A23D22FF9D3A868C7A47FAA92C95A5BCAAD7DA +0D145FDAEC7EF719C077D8FFB191CFE21E87736A98965A4A4AB2447B607D02AE +8995550F0BCEFA8BAB7A197C053F69BBA12CB7C01976219DFC6D2A49D415EFFA +66F17762549A09F43FFEC19B4A6CEE65A6903702F1750B263C342E5CD8D26F9B +363D9AF452BBB2B0D5551D412872AC8F781630B293FA0B96FF49893200BDC53E +32CAEA43D4AC2D01FB9212277ADB59C864CED023A8C30665A2BFD059A1031D86 +6410CF5A2716F0927A8F9213C73681278B8EC121E0AC73D46A704D6B28D7B003 +FD075F4455CABF65FE19A91768983B2B3FCD40AA0194EDEF3C94C06D2787F469 +BB045AF387183D001E980E05859D316821023CBC205C505B11DA011D784B7F3A +C47E20AD8F87E499D7D77EF84C75093BC67969E7CA8714F55D7945F799D6A640 +E6F00FCFE28DE659F36F947324DFF4E79AEFB61EF14ACB3FC078873A17FCB5E1 +D3C40C11B5A4327CF96E07F5CA9D62127553EE94BF3C148D9EB83353E9DBFDFD +FF9FACBDC8AED20340D2FCA6F3866DF72EE9CC880E4069DAAA2BA5A845DE7FB6 +CF7E686BC5CE9A4B6D37890D902CB7641033A7C1B7F974828F4FC8AF251F7985 +E576958972852E144094C10EDA802DEE259F7437CD26A1C9094F87ED0697D713 +94BF9E15347EF558B9D40243DDD348C7FDC96A1FB6D362BD9D955BAE3F6A2353 +84D89A27BB4DABE3CB58A9334971E39215DE41B4DA77FFD32B088EDE2E23A26B +59273A7DC587D70CCDF43BC64BC3CB11B6EF90042B8193C0C4E66D9C7BC7F459 +F8FFA1D733503659A2C2BA42C0A1E262D15E97A55E97D746455266507B4B2913 +EAB47632D372206F3F1CA23939A281F2CDF5E2DFF06B94560879BE2080E2CBE7 +DC93A7869391B1F44A4466B38B2A4A8A8F8774D76B8F2449435B525F2651791D +890D1078533B845F34713FC87A34153D1175B40B7A46F2C228C6405E4652E635 +D9DC320111AB934184B34B30A946D74D30894AA99769BCD213FA3494F8C998D9 +BE4501663B8CA4441C8A7A0314BE23D451D19E1ED15831DBB29180E023A989ED +4A4C4C92C65637A9DEB914179A4D3735CABEC726E9F431367994E32CA1C83541 +ECCB0D463DB8A0316213A3356D7C654F9F5A4C57260485D0FE8ACFB6FA759A74 +BC1C53F32A147A9F0B2264AA8CAC642D6D932E462D76F113ED2BE639DC67F8E9 +7CEDAC5FC2ED44E4AF3ABB083F3D103378B784E9B0D88DDC98160629B0731AFD +1502AA443FFF69071A8C6E6EA0A309893DF57E550C270B7BA271234BC69DB3DE +7D7A87D9A8450596960F05942E390BD546A9C10501057B96009548EAA8FA3DD9 +DE5BACF5AEDAEABC2998F34BB48497E022CF71C4260537F19A7D38679558E405 +EEB015B7BDB6092553644D28857CF4FA28E18040C3E6B8DB88289CFB10FD86E1 +99D4DAF86714EFA28E61FBB3010CCFB8EFD7C9B6E2B759F276616DDA9F90335A +388DDAC61C577A057434F28CCFB339902BE256D21F4D52DCD450AA5B747D7471 +8098E4B634907BE1DAAA43FFAB7E4AA8705E76E9ED086CAF7D73375E7EC6626C +FCAE8CE2AB754C256B795BE48428076BF67D614F3FB28AF32DFCD73F17B13E2B +B127E86C5726769BA5A5D2045B839E4FB5D382E93851E839D2C0FF5824B72C84 +D1C96EE48AFC44DBE54E1844BF709BD50C0E1D456EF920662D905C823C912A13 +018EC340C0F4B508F7D8AEAF895AC0CEE8B15A2620DEAF8B4CDCCDCBF40D626E +43CB4C280366C106F7951D505973018D307D9858D32E7360183E68C226060B32 +A342BF4CFFDE1AD9B5111CB80734C1E625343148FF2870D1D87DC70E9264E9E9 +BA20D962DA30CB7A2755B510F86899FE1430E46E76672E30A1CED0AAAD9E983D +4E3911BB537D48A168F7B3BD46592FD4B07B9CE043BE9DE2148BE10BF8C30C68 +76B76138AB34805C6D8B6454E3D5A830407A51B9E1A71DB17668E7A94BB150E7 +BEAC13AE7363DEE94E696FEC3627958DC530490FEE0DBDA1ADA7F00848D3C3EA +683757DCB8AFEEA2C95B7B27D8EEC5956AF8E26BC8CFF14DD8A2E6A638C5D6CF +E128C7F8BB3A3F27EC922041E857CB68CA824DE6DBC56F68CBD131AAEBD6B0BF +4189A1AFA1108BC42C2697B3C24AD8587EFF5C8B46A995CD881ED98523FC98CA +6A123D37FC9D79F0E9A6E6D9E783D8826A0A07A9EFCD563286710FA3CA4EF170 +1B42B440BEF8ABA94FCCF86F0BA118F36F80F6BFFEA5D13CE0FF328CF428D437 +EA9076A01A151C0D6CA5A7B8410815A88DD92BBD2A27EF160F39CAA7E0A27549 +EE8E1B301374028A8C30504461A0CE8CF9D1AF3BC27182E4FCADBE153FC3BDCE +04B9EF6B6C383FCEEA6DD9D51CFC360A9DDA8F18F28175B3AC453E4387D9CF90 +28B44827AEB043F2971C0E6C852882734C9B790DF14ADD37A55E807068431ACE +0BC67F4D03FBB3C611004D0C1E1B9D5CA572191A13820DE990F029E1EC07866B +9307D5B77304C9AA9D987D8E2CB1C302F4EBE5AE1A18EBE36901C6D94A3B4D48 +F31301459C87955B6C24F48A98BE883BFBF526DB1DBFAD1D6B23F29E6C32B3C0 +CC56550FB658455B8E3F2A76BCF1EBC9F6AAA1200C428465A22FC1C748CA45D2 +7427F87D506B90D3C676AD753DDAE196464C9672614D1FC43F0DB91DD9A00B4E +9D8E31DFADEF3AB6518EA1C7BD9BE20AC8C66D0B1CE9737C338E02794640F7F4 +F1F2E04CA39971AEBC9FB699ECA8F07569C8AD9833E69DD9EBAF42376BEA1961 +9D3312A8620A66BC68607C0B7D723DEF61764B7CA43EBA27ABA5B0F518F40B01 +E713AED7BA6E23BA5D866E10638DA78B9BFA68757921C9E766603F884C18E76F +848CE800A1A1E6FADA9E1BC717AF098446AF80924915D0AB86F4A3615D4FD49A +A5A844530155E047DF9A6F878677C12391DC8FEE91C90709E3D06F31D10952A6 +5B0D30556D0AA5F59DA5637BB280842DF8720816D67F465B48A063BD606B536D +760A402075ABBD70940DFB7EDA04B55B5E36D2B512A6D01E7E97FC90D708EAB6 +0F9A77ADCAD63063C5837DDDF800A4D407601B15895E83B58359821426E93994 +019B73A5FD9661550718CC3B2F79E9A6A0E7C4984EC1426C0B8EB86DDEAB3FCD +D1B467FF32005EDABE59166D2E0564CCD1AF482301D2BFAF138F88E2FEC6AC7F +060555D402304EDECAD793EF9F779F6AC52B1AF86D714F5CDF3C574592E8C742 +23204EC2C4C226968B8633554349A2C0A987E2812B8CA402A0A1BC7A16D452A5 +76083FA380D36F227828DF913C468AC69C435B2341A590AEE61A44B1A00D5409 +B836D6BD6670D5C02A614241941EFF04BB09366E4CCE644F8A3D2CAD5BF9E445 +BA296EF46392ECA30976FC566CCD4354D124DA25D9708578214DA5582122D8F6 +8EACCEA4CA8F63F15CAB59FDF29AEA5B4480023D6A61878B43B0F9CF1F4C6792 +C9B0726B1D5162E665CE4F89BD724CA7B957DDF865F6833BDA3736310595F2A8 +58182EFCF9911455FC934CEBD36C3D6E258D948AB4E28D225BAE6C73D7F96E9B +EE7BB7FB24CFE23558DB7050113CF8FAAF62E6DF1B05064FA99C2016537F4A60 +0C80147EBBB95DBFD8A03B125C464E5917AE0F11D293CB75C8FF18322D788FF9 +61593E2CF4FFBDD2A1169A37CD3483C3125A9669231592B85D80FFC5FAABBB79 +3E7F46EA5B3F67B0B5802642CC139D752C8A9FC6687CD6380192BBE2864AD792 +F84A826F9052A4970DE4725B125874C162F00453A685A329867D237E3FF253B4 +0B05384E0452602C3F021E47F5B2D680A5D120B7A7F4E261B1598DA4B55B3AA3 +BE47D2C7FB46780153B3A7E124BEEBF25BA598021BF943DDDC3CAC5CC661FCD7 +F78EAB069BDD1531684BADB59CB3DAA544A7F38429104399FFD147B2973E02BA +5D7C964A69650D9C5B1C3806A9B0F33478B9B2D8CB730D4E28BDF9C35A0E015E +AEE3110714E6E09D51A47EBE4DD5C1A4A7E608B0C5233B85426B1696C88E4A1C +56210C41D7B778DFDAC0708EEEA185E37CEFDE917728E9E2BC9ACE85CEBFF12F +702AE7B7D0288FD933ADDC3AC849D7352613C41BA4A7988A08D24DDF178E3C48 +1C7D348E7F5D67A764FDFBF5FB9A20195F4C806ACB59A47F334CE16B5CE3B8AC +FC951D49170D29B662A7A6EBEC46EBA01C96E85F8A4559CBC60D675EB6E1D7B3 +84C917104B318B9AD8CBAF12CFA478590690265DDB43198C7B7C1C6D5A23DB30 +11C1D6AE610ABB2985CB9D00B91860963C316BC83B9F2747AA99CF8EC08CF47C +D599CCA471FBD4C2059F8EF134050CC6247E9E56FD480E9B93DC083B0F16D673 +7E0A1096C30E9B8B0501BB25516B18471413428F50217BC2EDFD22EC1135D121 +DA739DCD4AB3AFDE2AB9407887D1F23CC5778C90D5C32BAA41A094968BB78F81 +FE42DB18820C03641895AF1D998B2A0C5C1543FDF91D6562A7D63C136C47AD42 +C1B04F7A70393CE6D13D313B63967BBA42F356AFDC81851BA94ACEA54ECAF0AD +8B6D4BC392CD8B4C71CBCD1B31A4FFC431970C88ED7D003EA9964F8829FA69C8 +D7BB49B7AE6571ACC901BAECF22D72CF86CE1AC1D831FC5FB5E6FBAF959CDC2D +900A773752D320C730E4A8D8612CDABAB22B6FE49DCA590A05861E2421541766 +3230671D0722C743024A8D143E3CA1DC3658F10B9779F4BB5859BBA03E03EA43 +68F9B65C04CD618BF61F0110EFF9DAC63DD889230010AFB6EADC13371A34D3A7 +CF3879D64242EB295ACFE2A2A7AA7D5919EBA50C38462BD9AC72160A24CAAA4D +F467AF4A4102D2C291E4B80543BC7D72AAF725BE15A1CD8499ECF99B73105E15 +53F2E4FCBFE1200A418A2207BF2F9D9BCDDDB62500F8394AA90E615D06A805EF +BA1006E2C3638FF8AF1D67D3A02F3E5185394D4D83A8E0502759A14F38DB9523 +1059BF230DFA29CF3020F2380406A8DBCABC40B50833E5E5253B524E2A4DE292 +49117835FBA70CC6B1A7E662B1FF2A5C96AA9CBCBBA454A623CBD4FB0FE35578 +3DC8B468AB579AA8D154035EB6F30F961412B5AFE7074F18AB9019AD2E600DCE +5C8376340B88DDFADCB4B1C46D4F63BBFA3631E11BA5DF550A4381B3DD1F1D11 +F47DF28562E706A080E38B2E61E03603694816D50D9AE19079228882B70AB605 +D5D4836F29B382A61683318A3442770BB18BC376EBC07BBDE01ECA8677702913 +2688777C8CB4E87B6692E5E86A54A220F927C3CBF885A78960D307B572F57650 +8D817DFB1124BDF3803A828D64EEE5EDC69D3568EF04D2D8C0285568817FA562 +08FDB68E1C0B822668CB706C3700BF0C30D72D048B943D50B00889A33003B446 +DD7F3E4B35F257B0537E91ED175FB3A32895457989C018A71A1023E096B539FF +1B09C66F77EF13F874F16E6F7D5BFD6EFF37202730AE5231A29B4F91B868C93B +CB3D9F38159EB9CCA2E1B3CBF296E27005DF9884F71C733BD4EE3F144D37E20A +65262030DA75AF8151F141693F97E380C5733B92A5615351E506925301308872 +09EAC5535D6185652AED2621F4E0D3224128620FB6D9D0B99C3D31B3E20F980A +A43A22BDCF8A2779BE4744B76E908354589E1D69A7691884319FDF889A288E89 +696E5FEFA1350410F0411CC4B1FA2E4A767A662606978716754FD44FD7161DD6 +7CAEA2734F499316BAF6E665DD6C85980CEC818542DC7460B336097E25C47AAB +F26FC408465B034EC7173FC10CC7FCE36A9D74786BF2007D0EA403D3F8E90FB9 +852B4D1400ED16A4B945C3426617EF47A8118551D0CF6B5E95C525FB8A896FF7 +FD7FABA141B597D27499B7D7D97712248CF0DF7976BED02A5D564D59B23F4B18 +9F13FB0DC17334A496FE3C2C84F4CFEEC9F89B14A7482AB324DFB201B6B72295 +98EFBE2C8A5A58FB4EEF33F4888773533A9D5D73732662192B72A1D5102E2F5E +247C9282EAF1705B5E96C9EDC36111AD5FC2E1FCC606DB766775AF00834B2631 +AB76888E6FF3CD6BA444C804770463EF3F5014DB69D860EE563CBA238F8DC2ED +3B5948A27A0D02033850B4B49E15EFD202B0B3ECE75C407F0843FD84D070344E +01D1462A8F7CD73954D75D7CFE22A8F4B69185A3B3081C1D113D9B2FDA91AB0A +5D3FADD335B480F61C6A5C25496F3FAD35449A156A23CCC9C3D5BFF5F1C1D243 +607E05B2F81999337A57A673026E7716ABD0395134BE23DC11484F898D9DC7E9 +68CBA68E60DD836462767ADBCAB8F3353778FA7B976E01458064B51B5D2F2B53 +4E26AA1EB608D072089F858B1C7A7E1C217C8872E44CC5AABC5DE83E10C3986F +E5A484B2EF6D8B05F70C499BAF6054C05C10C1D45C8FEF8D493968F065EC4161 +B8B04F8588F208C4902D37520724B2CB0299D8120D11B836F8B301229BC57CE8 +3DE15D7DD8D829BA7A7F3E39885771A4469E5E4390A60C295926AB828CD91058 +93832AC0A6BDC8A6B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSLTT10 +%!PS-AdobeFont-1.0: CMSLTT10 003.002 +%%Title: CMSLTT10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSLTT10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup +/UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSLTT10 def +/FontBBox {-20 -233 617 696 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSLTT10.) readonly def +/FullName (CMSLTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 39 /quoteright put +dup 45 /hyphen put +dup 48 /zero put +dup 49 /one put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 72 /H put +dup 74 /J put +dup 76 /L put +dup 77 /M put +dup 92 /backslash put +dup 95 /underscore put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3 +2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777 +6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18 +979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E +ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF +B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59 +A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA +3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F +D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC +6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F +3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C +4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90 +DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2 +753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131 +54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D +107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3 +7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231 +328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9 +85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C +2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7 +308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450 +CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195 +739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93 +FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6 +F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312 +3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A +A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F +55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC +A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB +69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50 +82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0 +8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8 +0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6 +0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8 +1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1 +D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F +B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737 +170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863 +767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D +EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F +AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3 +826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235 +8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048 +345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE +67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD +802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E +20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127 +5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07 +0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36 +22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC +4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF +CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B +4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880 +0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5 +220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403 +7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005 +27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE +B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300 +7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07 +A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D +45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10 +F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7 +C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65 +AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012 +DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781 +FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA +997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4 +3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A +2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605 +31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22 +A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891 +43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D +4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5 +94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E +425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616 +FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5 +51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9 +859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852 +E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F +2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910 +82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA +22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D +200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5 +892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32 +0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140 +437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3 +BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9 +E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402 +DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1 +CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551 +80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F +FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA +9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41 +031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90 +9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3 +9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891 +4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB +57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B +2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39 +0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9 +03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067 +22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79 +06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC +39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD +E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163 +A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6 +9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6 +B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F +79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553 +2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5 +8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA +1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA +0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2 +BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3 +312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3 +B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F +9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16 +A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6 +91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F +7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D +78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC +7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09 +766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11 +016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D +C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3 +8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278 +E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC +6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8 +B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959 +44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB +C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE +5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB +42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A +F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57 +CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009 +9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2 +82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72 +0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5 +F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9 +EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA +E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD +D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD +F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F +14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8 +BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2 +9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5 +6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A +6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116 +4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE +C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B +A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C +9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780 +42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE +7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024 +1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D +4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540 +CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4 +D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81 +CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1 +0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9 +92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0 +57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4 +5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4 +57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158 +8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0 +C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3 +7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7 +B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674 +EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521 +D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9 +DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074 +F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D +D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0 +56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8 +46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40 +52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA +19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D +465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02 +0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE +078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B +DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339 +F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6525 +EE62456392E5DCAD0A0157A4A033E440AA014D5682606312F72248E13C43EC3F +BBC9B4A2CF19A4AC6ED7F561EB13C3AB22FB3F3EF644B5B47DACE807262DE5C9 +50578464845B950140ADD91D72D28470A5A5FB134EC52F4DBBB9C50A7523592B +C5BAA056E46F8C004062298BEA010C1CF9F49DEAB58C4D2012E04E630F54C985 +328DB2B6FEAC584308D71A9F5FD945A37EA13F3DEB1748320870057A362E70CD +50C269D32993CE9CD1E8CB35BC6F69E7574F37032219C6E1C960F3693CB8D1F4 +7E3376495E6CDA3BD280DEA744D382D720935D605E1E2464A31B86E831A1DB1B +BA9185DC43D32993D3B5900F9D5B45EE9D2C607172A670530780EEA08AECBBF7 +5F59F645CF7A86ED8CFFAAAE50BEC460C07B11BEAB82765FD18D152AD476B7B6 +2D08A8C7B5D8F7B6400C8435E6F08CCDE4234D981D056E7F1B361F478759FFEA +468FDA9D4EE5B8BF0B83506B39C1FD36B16D14D5005202EEA3D9BF656BA60548 +A94BAE6159A75BAA549ECB9D5272C475CFF6BC373C60723049295392D4BCA477 +3FF6270B7658362D0014743F1686ECB611912E6B82670BCBA93832C4EC9CDD22 +BB2FD9FF321840A882A1E2BE9B354E69C9F4C6210564C02DBD96D4BC181B4876 +49818380D9DD9424E30DA3E8E3BE7682CE0CDF6CB3F7554ACDAE1812AD3B8AAF +F0990BA00B058A1C5CC83A60491B7875821799B231BD9BF1D568ACFAE9E5FE2A +7558D3820A67A6158EA037FDBE8A6EADD8C934380101327B8F1736D996F9699D +D64AF938C999C6C93C9DDC7A8F4497FE81DBB787F24EA08ACF82B3C7620088E1 +8002FC529C8FAF40A519878DCB79EB5C7C34DD5D6F911D9DA790DAB33E7A8968 +A266E95AA808AEC8FD854D1326778821DAAD03ADC0863C83E5D0FE70ABB35619 +AB31554DED6142E2E1E26481377AE95C9F32D0EA3DE07F78C6A30FEB98B15F69 +296FC94E6DAB5829F1B59672C6A87EE4E2CD3F0D9894D6DC8D7A514B6BABF018 +B199CC3A4478821649A7389ED46DBB9AFB7D4FF7696F8DB586830D7F74F0FABD +4BB32F787DFF04CE1E7349704FB5D3154D1BE3CEA0B476C2B787C6E534061EA3 +E28F7D8F65EB1FBD8177AA013A6FFC03BAE514112214F67C7957583FA78FA805 +29C0AD1C6FF9750CA24D3505C889502833CB71EEAC21B8F2F4D3415372E0FD82 +33A937D50F4BC55D381E2E2C831D2CBE4F960978BF7041FBB69C6C9C9246F8DF +FA2D5C5875200AE8F9BE1C44F839F446C23E630B74B823FFFC88DC30B931769A +3D5D444376B7138972BE07E5D8215B79288401B0E9E76831250304635714B64B +2BAFC31E2583F26B15B38400125BE793931E7887175D98A1CE1505AD21BD08BA +16BFACB350DB1BB37E647D7A00A48130CA4F7B6FC5CA17FBA73F7737366E906B +AA3335A2E51D65DFC79B1D87F109E9CF3F420408BFFC2C399CA6844A3C5D50C2 +2B3673FD3A796F654D2624FE5B1E02C1720B91A00B4998F825D9C1EB29885A11 +D100A98620A7C186BFAEEC214F0E63A21A28E076D0CFC7DF62A016A21AF198C7 +28E5C374A93D0683E91F06858358E1AEFCCAAAF2CDBC382B1C999D489D06AB82 +60D4C548B9AA7B011F0382324737A74EF18AE7D5402DB1B8FB15AC162E6E1D2D +371BB20E1F78C962F032B7647A301F771D496B14B11DD63965897BEA60DF1B75 +EAED63791A62BA912A8ED5EFD66340D07FD2DD8A9EAA1A98957F8D4B9F0C7142 +024FF2918E971B73F5BECDC098C7D011335077F059697C9429CA2E13B03886CA +5D07C7178C2368B4DBA1BE17A074A1565A9DFDEB90F96163829C4F2BE8D537D4 +606E7CF1BB667190AEE95B4D68422B7EB84B054D41F6677D840ADA7BED269A8E +8ECEFA88484CDFD6F999D9F51F4431057929706105172AE2635764B326446A07 +1BCB5A2277441E0C0C8A6CEDD2D886D794D3495F7CE828E1E9F65C3CB47C2634 +1E3BA769EA7DD098296E5CC981916608DC33279BDF53510C8BBA06A0A0E9203C +EA569B24DB5EC1DA6254156276944ECB2338CC5679558DFF053863B3E6FDCC2C +FAA0D336E9ECA4236917455D8DFA46EAE6ABE8C942E087ADD33E3CE49C2A8C5E +9E4BF0A357D1B9DAD6B2C01D64D65A99EC728DADC5DA83FC279CD60A08971941 +638CE3A7E1A298FB9832804EB4752758EE1ED81FA96B60A6AA1004D79AEE456F +C3AF0687AD5AA5062DF7F0C8FE7AB78DC6122BD2894DBC59B4126A0D85F34C8D +A748048087E7D9E12CF55AA2786E595EF5BEEABD86563204CFD5B1FCE181B2D0 +5410E3836E394D0843984362F65D4A55D26C805E15EBF488AEACA766DB081C3E +51267E8BC8B7E4373183CC054B68A4839F842DB22341130D4A1D312DB573060A +7E73FCF514617C3D486651D2C8075E02331EFF65A2CE8B9AB7E35CD969550C2A +89DCE554802F08D5C6163A09E669B7F5C6754138D778CBC5458F40B4B51C9A93 +5DD23BEDF12182BD5F1E42B2BFE76F421FD8128DA78F195038907F9EB52268A8 +324B1A134148226CD0B235B8A6DBAA8508A7209720E892B910056D55AD5797D4 +26ADBC7FC9E6A41F2EFA145DE8707D8AB76970B46D2F2CA4CE11DFB46B9D156A +E75210C6F9A2B31DFFB3670CA8E52F322AAD31EB71D3E0C99CA791797650E5F5 +FE5EDC86B5B19433B9363A388FBD4C8ECDBDD8281A81AC935371FEAA2B841C98 +3E54FCA6C6445C89374981ADF8A974F5D5CACE8E158AAE572AFB2D282E73B1F6 +C7150271CDE9FA5E5BB94244F04B0CB671EB2391BB35EC2FFBFC522237F54168 +2A4AD8B48C84C4FEAA2602AF9483A1A07570F8E84434F1FD3942A13D3A30C1CA +BD7901D49659C85ABFC78124215386C475AA0E229E98A9A2A47E32B46F09AAAD +6C8F0D5FE2E4D4D4BB3B3C3B23EDDAED65004BD410BA829EFFC414DE349F8852 +75D4C9567FC887F173EA3E5AB863903C728D65DEAF592F400C803317FF9859E3 +1BCB658A0458AA355CE3671C35047760ECFE8AC3A01C3B975F01A02CA21E4CF6 +697A9B828DF3FD28BDD625D8502133E85586A0F66386AD428C1E65AF78A65106 +188721680B04E7EB756C564859E4F8E16B9DE6B7231F8F8AEC8064CDD8C923AF +7B0888ACFC86AD6E03D83A37C52DFD5BAC714A09727B53ABA05461DA406D894B +81B4B43D3F737939EBB7CEF3C4CA965705411B1EFA1FB6385A6556913A6D32F0 +3CDFDC04F88F214763B7E989D288C6B8861504CF5E8A6C67D16FAEE5E6962F6E +0935372016194115F205519805A8FE8EE76676EA3CC75CEF7C7326810BD3BE34 +2EC114C3BD2508ABA9206401315D75C4AB6401E9AF3AABA580E47776C6A7D7AA +B576D209AF4EF84F37608B2CE84D98008988331C5DEA082E8523E06A7BB59004 +CB8C7F4F39B4E83C926CC519163C17FE4CF47F1B66CB444842F494B5C8C1A386 +2DD05BED6BF59227A5757410F63CD8BB77AD0AB848E4B8FC85186E222208740C +09B0E47BCCBAC26EDCB9029727EB96521F17A7B32E719001E59C483237D8B9BD +6695799A0C3B80ED9C7D64DC153CBBCEFC22B4B25524BF5B301431F192BC6933 +A6DA377691670958B04AA1F7491379CB60C87F3110CF2BEDE95D6611C2A9604E +083B721D51F513E47499871C0E3E504E8EE620CD2E0F450E3035CBCA94242BCB +E42CB0E8408A3CCC5575C261F2325EAA2B06D91A65AEC162268D751CBBE9D5DB +469592065418BAFB50E658E286933DC0EDFB9E9F7D82AF9851E71AE9DC4A9DD0 +8E01F2533F5C8F83DE9C0D0A49DFC375BA4F32C2BCA5774B702066CAE2647B9F +AB7541FEC25269D28A7AB4F1F60F3EEEB5D2EE23408BCC84AE471EB6540A5438 +DA807B936F6C27FDC536D2D8471EBE9967B9133A1A5641BE80E64632E61E5E8A +7700465D087E89BFD1C6197B8BA8A41CF2159A0817B5F95351E02E654CAA7978 +1FA6571CE47EDE08B7E66A2D0C8EB88AD6E4F287B9809EE5485A94EFFE85A73C +454BF8BAB70BA2000F2B56BB3E0255892C3E4480C147CA11D4C3AB71744BC536 +CD21B6DC302B5895BCA9E72285744E93E85D33A86688758A060304E3EF024281 +590A765C943980884EAC5298497E7D2460C55EE1BD234C407FC63B9B3029C018 +6C86BBBCA5BDCD4300359A40D1281A0211B09B2DF2941EA893F5DB95BDFDD018 +6D674A37A25F63722AD62597314CABEC1F3A2460F51E00451D3095DAE1071ABB +17A8DB8BA0E224D420D4A0EFF9EA17FFC7801D36BABADACC27A0AF1879C56628 +573059FD22294243357928DB4A835F02B3807067DC963CDE81CF4F69669421B4 +88A159B3502CA9619F5B30CD992F3F94EF3868CC695F52C5E0619E88A750D6F4 +90DF0CD32D6642A3D19549C733B89391041D0FC126AADC04D882188D9769CAB5 +21BCEB131BC5283CE6E9E6F650246B1D59A7A559EB45AADD9A669FC39EDE6CAD +FCA20CFE0922C8730D56962F4AD00DDDEE28B1A7C2FA02CC7C59932AC31BD59F +E0C837740EA82EE6C804114DE18CA35D8EBDE3F0C16565C2F51A14083F5CDDED +C5B7796F9E6717A6A3E963F3DCF7E76DD7F896716193C975F4EA5CC73F6E8C95 +C987260A3653AA099EAE36068B7FD793154050D9868D9D30F4E4603AEF7B591E +DFD9F478EB30D16AD0496965F5702DCA4BF33541778EA2FAB83C25313F8E694B +43FAD86D47D5E84B51309B3E7991B29E9922E80A34AA1A5B895765ACE2329F92 +8A04E9A68A0D9C008EA9E52A114B3F09144C30A00A6E010BEDECB7B955AD1B06 +467F156EF79E4AEE257AC357EE49724730D9DE4942E84ECBBFEC6CC7C85CA2B4 +3BAE1CBA5ECFEACAA7ADFA4508F1DB7E6C37405439138ED4BF236C1589A319CD +3A5DD32D848C22F07732BCE84FD15F86AF8373AAC85252A8F8EB7F3915B52558 +EF02270FFE20521F0347386B3A253A69D9510900F7052A95DE26B29D48D662A9 +20A437B9944E0AB22AB623E7C766A752D89A57AE7BA6A64FD96FA05A5FDE6C8E +C6084C44FF6732B5B95A844FFBE2BBB234A3A247D4D89B0FECCA87C986912A90 +4791231605EE8EFAA7BC7F2FA5551991706DD4A677639A69EC231CEE3B0B05DE +AD7C4A221B7B74349DEF428680366F1947D0103D5E4D72AF8579FF824DF89949 +6904BD33856ED29B9AB43113DB038902A9DFB2DF3036B99E5508156522E76539 +440A83884F8C08F8D8449DE3EBF2E6A775090536040BCB299FDCB7E9AB6AE453 +3AD36E109C46221C82265DFA576029157FB1EB3236F1A84FCA1B9B68EA2AE583 +6BCFC2D127B1A169A7392AC1AC251A14C32D643D21C5756BB6E39AD478160069 +A11B985D9F69B800D339BB0242A9A7199E996B02467F6A1F220A8FC245BF2F45 +5AED4D104C5513D3206D57C6DCD93B9428F82CD9938EF6468A165B5A53CF556A +68E702C0A9796DDFC79DFAEB0ED0267BD57D099D407AF32F8F84EECC9C84C57E +C34339DD87991056EA0246914D3E2096517B7C0CD1F674CEE593B92129F0BEBC +2ED3DBAF4AA2EC0217DDA3A7265148B433CDBFF63A68C4A33BA2780E99BF8744 +D3ECA386BA3872EDA1B99A6191EAA8FE477301A84DDFF5BCA00551286CF62477 +10EDF4D58FB980707E202C9C337663C9B16F9283D36D540C75DDCFBD525473BB +027BBA7FD75E952C2ED012B5455FFE95DA7E04C20F8A7D5C11813646516968E4 +36259B6A91966E87664978BEA76C2B2E093B2A65591D0EF3D501D91FE135C2BE +E97A446B0586BE37201363A10C2F73026DDF0F0B6FCB331272BE349027410D4D +958EC50B66EB7A45A1E818B67ED9A5DCC638D66164772ECEE06A80765C0B259D +1B01A13FA9208182644F5853A8B8C3EBFF7F25C575761E9A49C5275E66B16FC6 +625D7E73A657F9B23EF1CECED93FEE2DC83EEF7D695D76D19BA87F83642F6676 +C460692CD64AA6FB768DA6008FC1C79E22055261A9A62DD1950F4899A7F6A2E9 +21D800038C30183019E084C951394B9F6AA87646410623B996B310E86858BE3E +8C6DA85FEA3D6BCF62D2C3B154104E7CB5FDD42B54F52F8DBBC12087570F4C6E +8173A04835CEA36D2280C5C42B880A498E30C7A77940F28397DD279907693979 +077CA5D28515A04B4EFAC1F0C948D69FF108320BF3B5C3C7D642AA0122A49ABA +735B8D950535460E0B2C17475404D8E85DDA4BB68E888250500363648828A193 +AEBA46DF8C644FF81A998C5A7E4F9F9435C4F202C3DAF498484A012D4088C4D3 +AA9E813A9161BE6F9844167AEB52F29013BFFF51928E5DB7B48BD20D86F317AD +63EDEC755F5A85B2B07C5B0E0A1B7A006D547744462AB0DDDFA9BC20C95DC57A +61D44CB4A45558C68E36DD3F680605C9987B6B6959DE24DD65C874E46D5AE7B0 +C54608ACA7D5C7A88FFA06D9F6366E623F036EAF7A9914B0B549747AD58CC031 +97036EA1D54D01A736BD6CD796600E5884E90DB6BC5E2CECD68B995D06B26FC5 +2B6EBCE4279DA0E33317071FA1801279FB48563890C888BF6F2C1057F9728A95 +59D07684FD8997DC446EB635E9A5171C14E2A357C00C30886EF1DFFD229A82B6 +42912D02E3AF236F5C773456BDE13F60E8C674B21BD59D4E6444371E28956C23 +FCB55999382C3347777CA0CE8BC002CB3DAABC58D52FE542A115FDD96D19061E +1A1DDD098498C9A8E713AFCAF355D2765DAE775FE6F9EA4DE42A066DEE306432 +065E7DC31F144697EBD270671A77E6096C0E191C96449F7E94419C752B920EC3 +034686DABF9FE674DB5E0744D44A82DE6B3933193F2E91D7A74BD17CA9FCA7AE +CF9E5650355DA885806A24A9993F3041038DBB0DA23D74F12B86A329DFAB87CE +C06B3F1C7A0D84DEBB870E64E15E251253E82ACEE05186D3ACC88E838F276B99 +0729AC02CE325EDFA5BC3F5DA079E55CA302824AD2DA70964AEE86504BBADCAC +44B9244CC456CBEA44517185285515DF5AE0BDD7D98AC8928EAACE6AAE7D93AC +E256992BD972DD6E33EF98DE9D9EB30B6D0569DB0B0BB23A1D0F9A6AC788F6AF +AF81260D25B767AF16D5F060960E11146384A241CC05185408FE265CFA941DA6 +86AC510021788D2767FF5B384A17E60EF2A664207D6344302CA491D7D292D7C5 +A6DF93AF2ACDAC6970A16A5D3C78991931163509561A0CF10E7375F7E91F331F +B84E8405E9A1881DD4103B575E80F36F7203522282CB5E899DDC42C781963830 +BA1051F49DAF440F28847188237492149C74E4A99C3323635BC051B8000986D4 +1629B1B7038C98D182481E182D4CA4F1554902D6D88ADEE755E9155861C0D772 +CB414808198E4686B722786911914585F81D84501B40684E279C5E6B0B0C2FCA +F3538806C4A410EA894CEC8218DE6D2489C6239BA36233871B0F449B4AE9DDC7 +F00502EC6E7247BA3A829795C9351B50D312455F1486DECC64D2F159B0003FED +E201B29443F8127878BDD436CF7873F22B3FD597EB81F1D630811BE93A51D340 +FAB3D607EFF2A65A74E78C792896CCEA1C2F1C36D43F1950453C79A9F0767B08 +DA6247B44B703157FDDE2F431089FAA9AF23C786737E921D76BAA2D68C3BC8DB +DED8E756624970C823E97C598DEC658E28AE00CB901213CBA0110E625AF40618 +D9EA9369F124D089C2CAC832A145474AE476AD16BA5BA3FD9C28122229C3380F +AFA46693D5E9A6254C055DAF47FE051751FE7F9284EF39A36C5D25FE6FACB838 +17F86520B8F143F8A7DE0615FFE77078603F5CD60DD0DDA9B84F44CA3BDBF2EA +10F6CF79CA3E66EEF95C8E8DF98951933358360BE4A9CA23EDB5F5CD794974F7 +1A6708F418D34E6BE5BE645C266229A960C947877EA14415CEA2B238C8191387 +100FC1D6A879B129AD2CF7D50EA7FB9E8BF2C80E6609809A0E8CE2A70F2DC54F +3F958E45E63AAF577AC7023F097A77C8412A48A3E608B36F96C39AD6067C60D1 +CC7A2E00BEAA799FD75F1F694928003FEB29A8E6EE075C57C789781D3E983115 +68AC3B16695D5FF9E2416277288367B040DC47D40D5EE565ED73DC18D23B8EC4 +DEC6790571546F0ABCD004B3A6C2360D7BECAD494888E737FD41C0FF1D277891 +7DAC83316800F786A16959022C9729ABA334E45E077A69D02EA82FA23086DDC5 +BD96F41FE176A7F491EB87181FE64F647980DBA6F210F3260CEAB4E076918F99 +D8246512F1BAD74D3C15EC69ED19346B60E59D8A9DC26D00B47741F103DCAE31 +A2CB69D1BF659C091044AE0E2796F13C9FB5CEDC3527F90D035EF785A0655296 +0C979C70AF9637D7C6E3DDAB3A9E17594FAC3DEA75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.0: CMR10 003.002 +%%Title: CMR10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMR10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup +/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMR10 def +/FontBBox {-40 -250 1009 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 13 /fl put +dup 14 /ffi put +dup 34 /quotedblright put +dup 36 /dollar put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 59 /semicolon put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 91 /bracketleft put +dup 92 /quotedblleft put +dup 93 /bracketright put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /endash put +dup 124 /emdash put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 +569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 +24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A +2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 +8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E +3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 +D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 +D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B +03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 +767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A +8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B +DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E +94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 +22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 +72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C +8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 +344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A +64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B +07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC +1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 +78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 +CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 +7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 +BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 +4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A +5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D +EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE +EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 +4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE +0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 +C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 +314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E +DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 +EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 +DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E +DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 +7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 +1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 +69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE +EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 +7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 +CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D +38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 +22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C +0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 +BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D +4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F +3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD +B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE +15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 +849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 +FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 +4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 +1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 +84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF +7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 +CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA +4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B +3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 +F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D +F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 +DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 +D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 +56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 +8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 +59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED +49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 +87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B +8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 +C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 +D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 +D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 +F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 +0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B +5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 +229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC +17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 +01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 +F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 +3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 +689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 +4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F +A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 +DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D +364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F +7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F +26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 +43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD +8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 +C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 +94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 +C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 +B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 +4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 +7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 +204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE +B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 +7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 +279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB +E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 +CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A +65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 +BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 +6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 +B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 +63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 +4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A +A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 +67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C +DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A +5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 +C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C +9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D +B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 +963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 +D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB +B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B +72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE +B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 +8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB +3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 +668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 +ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 +69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 +C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 +3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 +407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 +11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF +2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 +4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 +2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF +9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 +CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 +DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 +0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 +5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 +9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A +EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 +09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A +2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 +AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 +324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 +486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A +EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 +52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 +9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 +4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D +B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 +BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 +6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 +B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 +16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED +E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 +546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED +6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 +559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B +C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A +ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 +04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B +7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A +8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B +A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 +94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB +C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC +41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 +7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 +18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 +9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD +E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947 +5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F +4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F +E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF +9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9 +89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87 +7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3 +AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3 +3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E +61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B +F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F +D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6 +652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA +07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11 +6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB +EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2 +BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77 +2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDB693AFE84 +246AB18279A2B24E5B50A2FF6337B7B1039FFDD4B00ED3667B5F2F7BC2786D2F +525A0E82234B30711AA835EAEAC2E404915FC7EC0081B194765032708B5E11CE +EF68682FBA16ECD75C6A6CAF0F577583B72C77BF328E68308B929229A0930D9C +61CEFDC57E376B63ACB4F3DB9B5C602C248B4CA233E2C25E16314CC878BC1B88 +6C0706423F71514CC2DBF0D259D87DF704CB718A866DBAAE005180435034AF3D +5EFA02237755986AC73CDEB3B4766710B762312D5F48C59537B158DCEC084C96 +19F1F37CD1CFB61C63F6D05F59B2E47137A433DEAA34823395727B67CBC15B6A +857627BBD49BE34F5C7B2EA6C0ADEC83FD5E10907355E926ADFAA74C6CBBFB41 +1E37968BC3BD7F665AFE2CF6740125D751CA66148781310C76FD92731C0513A2 +0ED792B34207ACE82F3E84425756F6205E70E1BDE989DA786C6234FB98DB8195 +737FFB8086D05B4D5C88D80B7DCE555AB3882DA305ED26351BD26ADDA377EAB5 +0618D08F7EDFE61938ED5CF78A4BE43408C7C2889C8E81CE04A4C20BDDF31A5D +31BA15A2BE1CFE0AB51E539CE09DFE33808277D947D083C066478F23A4D524A0 +D89553E24ADE78EAEB4ACFD51EA3D2E1D5C84024D893F050DAE5314C91EFD93C +91D81F3591168B4EE3B01ED80CDDDAE0FBAB3936EEF02462A6A2895E22D24FDC +F93DA61C36998E2297B512FAB1FD39409175426A8A7A56EEA4FA8B0D525E849E +27AB6622A3BE999A30A415B7C8A317D3802BC0B8FA6F89712D9F38D9366BC724 +8060287F1B859F13CF627ADBC25002D1610DBCEB93C866520FD018715FCA7ECC +853869B7F55FD5649526F9355BBEFB83E9DA1E05406F8E32C1E112BB9207637E +8B976EC8B51F0D45F717C6BF4BD2B352FD491822DDC1FD074A4DAEC4AD128A62 +475A39455847C265210B5B4CC476930162CEE809E3E4DC76250CDBE461FEC4C0 +0C40D656D905D6AFB4390B62DD21887206733520E4C95FD857BF38350B03F2AA +BD0AD9A87F485E0DB510F8216107EB7B31F81CF5DE76386D475A4CA18133BD84 +74E1CC1A9F2BB4013E570EF03C0F93AFF4095EED8F861BA5DB1D28EBEFBBBA0A +AD9FA3BCA136A0EACE7D66B63728374A3A5A198D2348E8FB33DCF83C12C77A43 +01C57D222B4FD5C3A9B8BBBFAB1A04BE0C1DB269D7C7DFDDF849C849F5592390 +32023ADE6B8F65BC17C850FFE3F7154D6ABD89B1EED4ADF354A071B0DF8B22E6 +CC94F1660E4C0F9E6E22EB77ED0EE9E3E10459B9AA355E912CE927A429B02152 +56CFF25F22E753393188F7B79B49C0F44512626F2BE1339F28FEABCA02052072 +2A4B1FDF77C3C092EA151A6F3762571629775247A6AC65DEFBCBC464A5EB0BB4 +F2C8AE029BD1172B430088B5786E7CA468E96E826FAB1D8A48A3700F8EF65B63 +C6F0EDE8519C256C46808B033DC9FAB61B1D49C8AE59C69176AF3AC875F86A64 +6F149241EF5610992222B79B859135D0DA31C438D26A3C8CF43B1D23ED27C852 +E8668043F8279A423942A5070D136425ACABEE43E4A45B846F4E7F7DB374E0E3 +D066CBF83AC321D26021738105BCED4081EE6AA264737F6862385FF9F3691197 +1D924EC2D0DC8019350CD7ECBE9814BD19184BACC9DA9A3A433F950E8B3400C9 +84EA3D3DCF2CF050DC3435E1294136E6998104B897A5ED4709B6DC996527A8E1 +AAB1B3DA5285EB8AEE64A2D47D29F09004DC142553CE14262D2AE3774A65EB9D +4782B048008979779F56C8D8BAB280B043B49F5AC33462CC5A1157DE60AB3347 +831ACEE9CBC3B88AF70F6AFA0C191867F2DF1CA821C6596552C7066932979570 +ECDC82CC1A565E4DDC16373B2B976B99BA5F0B92E0FDFD5C0D7DE2197E5C91C7 +9EBD346C4643295F769C4B2C15D2429FADBAE9F8DF0B80063F9A3B214535951F +A61DDC0F82F21CD0C6E779EBDDF5F660E8262CD10AA422586EED7BA629AA87DE +796AF15A95E1E579AF686729C69646AFA2DF78BC053A65AE1FF65945FBA879B4 +A21449B2F252C9601A3E54D1247C5B102D138C0D2CF15616A3E3ED3802608BE5 +4BD40194D3526B2F54E7F73D3C0DD86A64D1EAA8A23EA4719AE3E9694C8ECCAE +5CA73829CEE0B8F18CC386797D2A696F3666950E1E9804B899AFDB003C38EDB7 +AA93BB2FA9F447DC37AAABB9140A382AD6E69933724EDC6375C6305BCCFD126A +1E962DD9769EFAEA41D4F64FF7818DFFE7ED253836BA51AF3554AF92E3AC3145 +990C8FB0867DE7CA55C54D3CE900AD4492B2D3B50907E6B3DE62FC41CBE8C737 +760EE51E5C6D9F1CC15CFF852770A3991F86CDD3C188F08FF2AA1CF66D3ED8A4 +96C04CD3BC8E97C820FF51DBAC94109C9ACA1C8DEE7E6D43B55A3F3ACADBA997 +39FDD65E250335E05CDD9563F70AF53CE842BD51BF75777F269D3895E82A5F20 +CFCD667AB094E7DDE057203E2634DCB355054F9DD8A2DD1EF927B0154E7603E1 +76D2167B8CF3794CC8977E665AAE5D703AFB18A9C1B94B2EAC6162C36681AF82 +E3D62B671C8C274AA208813E57FC625E63296E325E2C31ED632C3136F0919FB6 +A34D452892690811A376BF8342F01CACB948360AD003609F3509EE55639B904E +CF801A157CA626EC056A683D84AC9D95E327411C7646269A27E297D0C1616947 +BCA4D4E4C32BF7A49FBB7ADE2766785B6939FB94029B2880BAC407F736E15B3D +6C2416C48002740A4E6663380089C45FEBC743CD82E6891224A561C003D1F65B +B01AECDE888B9DA271C80796B4693072DD1BF68182687CF10C1B4F0FE15EBC6A +695647F5B0C1D1B57FAD61FB1E348C8BBD3B7031A0DC7F7DB374E0E3D066C91A +C339E16323C7E4428D2EE11C1079BA8DDD66CC775FE43E1C7D9A454DA6434341 +2AD0E5836244D8F9B99F349B12BB4EC608FD760951981D9D7D67FBA77BA1637A +2C1D282B90601F9493B789F09B70B52F2EF2825DED6AFC88E7BF74241D7DEDFD +CE064578CE287B1AFB246DA586223BB4D80AB9A542D62A2CC807FFFFC7383921 +09C105D198B7D05743D1779154CFF12DC90FC2DDAE7318A9065A81A757C2255E +5832AE7DC10658AE2B5647CB5CD00E4C86AC8DE6E61B7C251F1F52A905F45745 +03F255C15ADF31815753145F3F9F1A71382A2996AD2955DD8B1A35CFB2ED77A4 +04F9DF20CA177A8A0C4863CA54B6B646828364824C7D41C3B93E473AEE9243F0 +A89C4DF01C4322AF90578A9A290C1AB64B77EAA019B739C465BDA098161F8256 +9CB8746FDA4FBD95600E6C1AA356F3A2E5DF49312C7AC27D9204EEBDF1A271A3 +AACED2042AFB7CBEA4BBBBDB159784008721738BDC79B89E7F5226092A0FEF60 +DC87CE9EFC97DA5698D5B4BFEB8F379BD02D7F1A024EF4D10D85AA4E8A0E38EA +1974B3FF78F01CAE5274C223DF459A776B4B31492C4D6F555DAC9A6DE72D42F7 +7C28B735E62DA5413F00525CD590107C9D39B41E36C19D316C38A8F29E2D6E5C +BA9F47D561E741B96947C368084A78375398EDD47BCA95DA3913705D4DE85882 +61BD9681B2FC75CAD1888311CA11322DFCDDC15804BD0C789D1D29562CBA2001 +A7B127F68F2914EEB96FBA5169B7ED30FCFA1023FACAA27B9AA8DC42C2C8BBC0 +B9AE6327E705B50995BA6ED0B538A693C74CCB6C250F2E2080660A2634D67D1C +2D928502D4D5D5C9C68C0A289DF434CC3B75118690B10738560610DD15BFC537 +55B548B55DFE2D08B3682AEA2E22CF0CC35C26E8322378374BA80FF2185C146C +3B2548A38A09796D087F33932C5ED4D513A1C8AB31058AC27B6BF81522692A15 +12DEA25281CE4DDC009ECA8ECC714D2066C9BAD6DD7D4244A3C3B1586B501DC0 +4A43DF7A21C7DE55DC385B2EA52E96A8182486574857DBA1C7DD7BE38C7F6605 +8EB798D6FE20324315A736793F0C6BEE522AD3E582E965ACC07C1F78C784982D +BC451B029ED37E2F8492A9770813DF2B1B539C5AECCF93BCCF128F3455C30B45 +D7FBEDCC43893291BD3270368500D3BE66EFE9702411375EFE3E10F0AD8E5906 +3A70BB8298517DE21FCEF75496E0782BDC1E924E1C6F28D619F5047592830AC5 +E06EFC6525E06B7607D65B2927946E73FE9C8CAE65FF1D9E321779E94CDE9085 +4C7BAA86BBA2C4A53F0DC10ED188DE1574088A2141DE6FF48450144607B4C1DA +C8EDC64EF6246E40CC20CDE7A22F892629475D4DA16DC62C42462393779609F1 +B479EFC7EA8C20CDE04DD0F6B6175E997D2ADF32CCC0D351B3D4A5F8E0274D1A +3EEE83F04EB815896C3C727D60E3B85E655186F7A7BB423D1A7CD19296DAA015 +204FCF401E9A56F64C697497C61662AA7F4097C0721822BEDD824426324A70BC +EE6757B6DD103C370796839A4E76C039B9B5B316FA8F6565B7CDDE544D0991E0 +302D896C0885A3542B3B7216F6156BF5554DA7E0129935C31A2154C7110E6061 +26B6C1102DFA3512AD1ADB0720992481EA7EFCF4DFC6FFC2605FCC550AE5ADDC +E021A7C84541C48A0856E1F2BDB47560AEF2ED181B2F9E9D1B466FD9EABA1D02 +8F0D2989D62E03727346FBB96694AA60DB90075A1E4671888FAAC0F5CFCA3FA2 +55E024E0A3565639CBD91D4798A4735506E6A03C7A805C5AA651DFD7BFC5FC1E +D85DBF025D98281323C7EB5A6AD56C22C139B13F4BB5346A5BFE8DA3DA8F9B40 +7ACEF81F3B6D2915E16B56BAD8F23C2B4685B19BE4DE5E0DCA120EB161E620DE +FC3691FA087DED6F4ECDBA980E7B3E30BB3383E0FBB3BBB70194162DAB70D516 +659E682FEF8B291493F99D78494432E4D68A7212A4F363441C51E317A1C2F60D +2A8CA4321599EBF483D155D14C173AE29B7DFBAB79E26B963EE984CA5D467FE1 +AAF9D1AAC02D00DE91D177DDDB891B6C515C8199F29C473CF4618655F70C53E4 +CA3A87DADFAB36E523AE2D91B7B8A768679DB1C90077BE6E3D7A2C72B6449348 +29F5FC9F6D2799DCB69845958006A46F7EF86830D372AEB56ADD69E33A096411 +80D9271F61CA7A28B8073D6E194F6C9BE8E93479E8E64223CE98C31A011E4BD1 +9A5746408154A365470CA46C5413C4D55B69328F13C9DA2D22EAD288E2993073 +00F51CDE2C443A4ED60821065D493C5D0F2BA5816DD57E86CEB90046E66EED20 +CF52F00A23FCC18279248872C297FBE6727A45B4EFF0199C9CE54A8FC5DC2EDC +75CF68CE217318DFDBA3896AA6805CA4F9BE4E7E3A3A2772CFD39365F192F884 +13DF92FC39FCE3A1F9D9513BA7161088AEDDD4F8BDD9D414963BF54725802983 +64B5306599724F40C2D146F9F9EB50B9C65A211F0E9992C4E2DC925C44BCF9DE +A619A551090A28275303FF0D0ACA6B4D00354DD874E53B167BD81B58BA6AA4DF +3DD703EB95199BD02DA951336995D273A6B8A1345A76F043007017B077CA5127 +2CFA3215CAB06F857B22C1E1DBD335629B037482372E6CA2EF5E176F66255509 +80D0ECD3E933D029C567C4628D8938F576B16835EC112C3F3DC4AA74E8AC43FA +6FA6F42F618B958CC83980D86567FA17E7B821FEBA4888DA6C964F2A7F9E6CE5 +04531D53DCD037FBA89A7F840DCE36E251D3896D4735394497035E96D3DA12A7 +6AC5A61146701BDA722955BB8EE66E838CB128284158E9CCCB5DF51DA6036CD0 +D4029141D01EBC90E0DDD8FB1C884D7243782F62FF196C942212E4D2F7C65788 +E8B5C79962FA1941C3F0731D16403412C3FF79C08ACF03034169E676AA39F9ED +4BCE98694FB1A9EEFF44E40267921733AEF80C73743C20C99F49A7323EA27E15 +6D5F2C3EC4F7896EC28E3630F66741B723A7860EA5FB584185D77ACF418B79DD +8C8E9B6DE87D17BBEDD558E350F4CE69488A995189CD56AF75677C31897C62CB +07BFA36265AE30FD06D55F59ADF2CDB21E7E13BC9E88EFEEF3F9ABFADFF2B6C8 +5275F80D7D4BE9976DF0476D070B9625E7AFB99E6CA526FBCB61554B87F8B1BF +320F79BE2695E7DB5E6E2BA3276275C82A53BC3DDFF0F2979F8C4E5752D130C7 +8C9F7CF16E436B823B1A2FD914700A263D3F3DE48BABC99FA90E0316AAB12D95 +8C59195EF634E8B29F9CCA10677E46730E1AF19F046BC5239B7C1F430955F158 +6E3F0BB2151E5D05C35F4C3E2205440C44B8EB2ABF0612EC6B413FC233126D16 +55AAA85F5DDEC3C008C5B559CB9C37B78512FD9FC93A435B68871DDD1D5FFD3B +C0045588F0CA5442D7984C1F782E109653AFE579756584D216275663B2B9890F +EB3F11B17A58EE8F5A92410DE390807D2E03B522CD0B2DEBD381270710DDC6A7 +9F1B8F8E669E65E1354D5ED7953EDF0AEC9119A162B2D1CF3039AD0EFA9DBBCA +9446EC4819D07FA893A019A38E2189F5DE84DB0E4DA2F0C169D25A636DB7D8DA +33BAB84A4331DDE5E29362F174D5618DAC5E1B830E0F464B7B8007A4283E48D8 +95DD3F13982278B538767816C211AAF263F1D40DA68AEE2FC007CB4093E14DFB +042AF398DC5029B701DD13AB11473ABEE8EC65D76591C485681529863B61B321 +3D9C04C6FC4FAFA0FBAE2252012201C55E0C03F532D68854124B117B2F350654 +E000EC5844A178DE9709C32B751EECD46C0713B7989B1835F7F50F64A6147C9F +F219283A82E3B86F6F6D29DC37B8A0C9FA4D4D41920C25D3DF33AD39ED08C289 +856FEA05AAB6D69577B0D8A5476169ECB15CA63F670F8D1B9C2E820697278597 +6BAC78708D8176B3B1576865D0280DC3588E8293A1CC7EF5FC59D9980BAA08EA +B093970E06743EA33350BCAF0933D2B009740F9495D7B24B88F46271CF23AEF9 +273E1F6F5F1F371508FE264100A16EB6F3F97A66D718166592239AC3009D8812 +65A495A9DC01F527B189190A79DEBCFB7FDE92FF64C77BD545EADCCA35076238 +C3000C2E27445209E8B4965B25D707B51AFB11B6D80B36FAC32657A2CBD51A82 +8A159B3A433760AD4558221A09E94011B682EE29AB16E9234C0AA1834A5AEBDB +957108C46AEE9AE963716EE61BAF4BE54C1A2224A3DB7E3C30DF9D07D652AA43 +1AB19D826F7DB18BCA8DD4806DEF031CF933406E38ECED77C7F1229C0A3CF129 +AB12BAFD207C68737198A64B573B6A11F3F287A48C92FEEA8306D1DEC14A91E6 +4CEB56C3EE69C5C36F68D96A88AF8B1289E41B3410BF2DF7C9A2BD5B9139121F +7AFD6E7DB302E9AC30AE901D4AFB90B05E614BCCAEC67E8F57CA0F4A0B780EBD +55D9239ED6F716F3CB0B3191AE1A4BDC6BCD82AFF7821C120A553E454D00B679 +BDC33B347F2E9B4D15223A4C7AB0D321F277E0623550917980B5BBC0607AF56C +F10C29146DBE2F6BF9FD8E4879F6FCF8199B446C25E4E65B6214FEA3EC34E4F7 +8CBFE934045822A6C961620D2BB3A4B36825E4D8E5BEA28E55868D30B02BF507 +F6FAABE950F17B4C4130D9252701F08014068E33A4F20C83CC54FD940C92318D +CF76AE0F4522A50DE7C14352EB7C94F746A7F73942129D6BD12A8C843DA6CF89 +A6E58575036DC8AED79C892E1AD7AA11EDBF43FA64D625556AEE04D3CD4DDA31 +CCCEEE3E3153FCAB30BA65A3A34AECC7663D745DA62838BEDFEAF4F167B0BBA7 +222BF55A9626B85DCAD9AAD5FC333A85950710749D55F7C12369941E8AB8DD41 +FAD6502A069EA1490B953694860AF8AB930DD5EC009FDBCEFECEAFE298E33727 +70ECC760BB8156DE8FC2F2B5A1E03B0F3FC8F7448AF02EEF97FE5A94BB0801AD +E83DF738A4D5131E16CA198DEEAB023E253227DF06A26950327409A9722101E3 +79D57BC5106B6EC703320192D7DEB89BEFD19000E2E6E43C10FE960551B81D78 +50EFE679BE528666AE7CC2FD9826AA224A009C7387A542AADB9403C24F8AE183 +3A40BA685BBA9F8DFB6717E1C247C52773DDBAD04D2EFC606C55E4EF7B292595 +F03D82D3FFFACB5AB2BDE9406AB2354675CC29FD01D8A625FB22BAF3602A5C08 +663A212E29617C2CFE55AD4E251A2F864AFC683984B4D72843B24D321EB85835 +00719B26365E467D664A654C692476F0FC1BE27302FB3959D722C3613F846923 +FED287F447F5DE22DBB6771FFF56E746DAA399DF493CDCF95B96CC809CEE835C +F8D827B1B1F7EF28AB0D91F6224E5C6DA4CFE20F7ADEE7EB834CD7C54447F49F +9B353F9BCE262CACF2867E6F462CB21044202B554CD8C1EF87FB0A863A8CDDED +59D32030EFB62C81136175EB9874B7C627ED7E63AC77F78FBEF2D2E5C2149360 +0C8C8278529A79E42FCD4B4551F2593E96F36D15CDB56CF8D6D65357CFA98663 +600732BA9F1CE83E0D47647F02FE3EC8443E81B3A7B55E80F3216252AAD626C3 +030A9E420221DA91E57CF1B3ECECB36FFD21EAD729CDB7B3C6F35168BEA82F36 +E52D0CD46B0A3D962E8CC48B3F35C049FF18AF0E271BF7B03429FD90EA4C68BE +41014CE3A859D138B3D51F53790DE3E7F4BBFF2997FFCB2C189056091633A2A1 +03E88A3CF49967B712991DCC769501523EAF0D70895A45DB09A40DB1DB221E79 +A1869BFAEE115B3970D0696EE1EEA3F29AFFD16D6FEF99F6EEA625AAADE8EAF9 +C23187CC5CD5A9CC9D0A3E76AC308694FA802DA1F900A1D324CB0E622F192647 +FE0CDE1A22585CF4FACBBF456AE5AA5F01D255F4B9A4163891DA74E4364625FE +30EB70BFFD698B6B27BF55FACE80B4A55F8370FCD74FD0B29FF8B3EE6F4DE577 +3F842ACD7F112C9AA9597AAAADC5C746AB7AF8B97B906B56B3607C72D988831B +B5202C6F76BFA5DA8101971CABB1E24D305460305FF0C9C0BA75BF2FE7692F3D +DA6971F3F63C81842428B93585E7C2413206969587A556B6E36AC4453394CA18 +777FC5D838D4EBFFDEFA1BCDD4064964421E862699C2E2B4BCB800D22EBEAE14 +A97744D1EBED19B62EA117EF78B59EDB5DF17647C34BFBD9FCAA296D9E3BEBB6 +ED05FFFBE063EF811B18D104AE7B8B4C386164C9B5CF1EB30247AFD937CE04E7 +6A35FF92CB0B8DD9239AD1DC8E8608AA924CAB7361D5F48192D24FB92B6D21EF +9D83CB3E13967E2250B32410B86EC6BF4722D31239891479B0C65DE3A5A43E0D +A0192649B5F44902FB67DD68A9609B8FB578174D970CB01B9F86248DF15A769A +0B0EF0C116A96A4D2D0A9380137270CBED1CA8C19C486E22E13E1BCAAA65F157 +E82A6AFA76530DAA8B27BD83ECAB41121AF2C764CCED122B94FEC74719D22D98 +C6981745F42ABD6C0476776584BE443655ACA39F0BE0AAE445C96325F5A69D08 +41AB9B0ABD19ED358BEEE6DB94724900250B795404243489FB69928CEA6126A8 +2036010760904A7DC8F15D9B05DF3779D1C657FD5162B801996F1F7572BCE8B6 +89DB7020F784D2F750BDCFCAF1E66E5D1CF8206D33D104AE44659298387CD149 +4E2A992E1548A37C0587752D46EF35357BBCD8DDA9BBFB616898AA1BEAE18180 +7AAABCDF3B9D51351EE5CDC490CC365FBCC2325076F696E9C731250A014F635A +E0EE366E3515066E0735430AF23D407FC997EB489BECFDFBD65872788AF7E13A +5A216C115DDD2F8FAE684B0F17EC9B53EE00E5966BED1FD155F32B3744F02FC8 +592F8C5B7044F0CD6C23BD26FA11C128CF92E1EAED0DECAE1B3CA64EB558A6F0 +415DFCBFEC7339822CC12F95F0E151ECDCEDD36CCE14AD2D4F57C9932E2F9FA7 +00FB8D7B2C97EE4BFC16F650D0FCFEB70DAB22318CB400BDBCFDB79529F11403 +026348DEC4AB352296519895E23B3305A44887739E906DEF031B92A0F41A4411 +09BDAECAD78E6A853C0A1973657BAC3A58A4EEDF99C0EBDD974EE2E9D2DE83A4 +181A7E72C8CD49EF58369C674D6B7EFC24120A0F245523E85C6E91083F131CC0 +B91CC5DB16712011C2AD2DDBF6D7AECF5BDC2E09ECBD88797912330CE1FAF21C +D2754C8B16797C577A376B452E96DA49624F063653FDB04098EF11CF1EB5B602 +DD7E66675AA3EC317152ABBD1FABC470A4841B347D80E6021D4E290512F91D53 +6DBE98C25A17631B93544297FF7CA950B903494DA2F686857C118BE4F2D2F5B4 +D63F931457D1507F13FAAF06881670C1F46A11339169B6E859D2F75F9401F5B1 +0F6BBF066B6410C522D3647DF86FEB25C1ACB394F2EE034B6FBA1E1F0C166CAC +23AD89FD97B43C63867C86FD5609496B8B58F9E10CD24141A110530EC24ADE79 +3A9CAF5E07793AC8B0F9E560649F589FB4312CF3B61FCFAF08B8B62C185A442E +5EA71733D96F429DA0E2343910D9FBB4225C1B6710721B89316B3F12E3A2E39B +4B139D9805B64E831BB2D4D1885094552900CB91275C8052B93B59730F1162B8 +76DC1B604C73145C7B9CD5B8B352F3012D8FA03BE0C48998A45C9CE392047BEE +81E8FA2AF78903D4A55CC2F8CE39C3582FFA7C010D879967F28A1FE3D21416C7 +30F381F99B01020FE3F35340A770629C16333805AE2830BECF5C40EECFCFE629 +67FF0A3A9AF794C5FDD669A18FA5EB93244E6C54843B3868C28D66902429854C +E3B70B242CF8652F910465050775B542AF7FE158DE22027F228C48F8D137E1EA +E734DA62FC34B5CC44C9ACD3A078C7D4FCA262EE953EC784B134F40CFF645045 +71B9E302A1B579793BCCD8ADD3FC027EC85A5770A26A1F71C545784E1998E396 +A6E567E1F605A1E89826D328ECF772FB1902F0A05F08F3F7C1DE5A0B1BA02A99 +0348A28AED186D63857976EC0B837EA34AE4D781CCB5B07F39C9E788DD15D549 +BFA3984DD591CA27AD98FD841C57ACF08A0F62287531043EA497D6F48613133F +BD84A9EA1F660F26660147B4C62EC20648FD4D079BCFEDCE8B96A32FAE2B53CE +62557A1C739805245755ABF416A368D238FA86EF6C904EA55516A25F4A8DC805 +C9095D78D07E2F79A6C5FC0D4DE4F5A7B14C9809E1141C78705FD9B25A482E44 +D994E5718640CC735DE0412DDE3DBD6BC724446933E83655AF78F08094D074D8 +6890E72F22E5C1228E8D21444669C7BDF8FBE16454610FABF167A63B62C46673 +6CB69B77FB6F0D144CF7B7968668069C819F7D4DEB00343F0AD05B99E8F40DA8 +A3608556D5F823F4FE26B10C1A135161F7684FA93A64EC896097D65DAACC6830 +EE3ED51E612B7D60C85D0C035BE59D78DAAAB868561015257361686D668FB635 +6A4F1B01317B6A07BA91FA9DE649B378CF0C7A37E4BA8FBE74DF0C907DA0047D +2014ACB6F7DE1698A8E689E23355F9A56E5B36F0A5220D010DB6CC174A78BA9F +FC79C6ADF5E5FE639264BFAAC91F253876AF829D4A6F59EBB89FA5B00EBB3049 +78FAEAD988E030CC48D18FACB55D4683A5F4DCDEBD347C64CFF09E7AF1FAFAB3 +750A2C59C2FE52A678AEF44E4D72836F7EFB4DEE537F3FCB1B5F2F46EF3835AD +A4725EE1695F778527E6BFB0D9C1574822D31DFD5B47219954E006F5CE225B7D +6957FF7C3400031C01DD55BBE7CA2701D3D38E7B0ACE3F14B57876D9A66BD8B5 +42DD5654030E04F002139350208DCA6D83BA9DE34F437E85D5BECDD5E26FCCEC +892C4AE075F7824261A87484135FD125C430448F2FD46C3C3C70B0AF9AC6C683 +E22995E1A8BEA75475A817C1B399D6C5D673ABAC95BE3DD7837397C609303655 +52442881BE93455BAE061A9A4BFD2824076AAE70418A52FCB61BDDE7B9EFB935 +0DFDDB6160FEC9A4409A4A8BBDC5AEECCA8A4978BA93A63270F06D8D08137C8D +87D80FDEE637B74C9F26E0AAF1A42111D751877DF17302D3A09EADDB12B787F6 +15FAB9D634DCF45FF7D84597813143C6AA252DD2585BE200F4C0F25C17EE82CD +564F0044838462C828EA8CDC0B4F7D995527A5425ED593FBADD183A1F488AB67 +1E9AD1A1041E867D2B988F300D87ACA7F675DC85CFA8A478CF2B8C4F1571CB64 +EE2A4F693BA8A7D6F7D0406A4157CA86BA4C64B285186AFAB6387B3D540CC02A +01900D447BDBB936BC0F94EC4EFA96DC2D09FA22440376C718DC6742D24128E4 +581C8143652E5E07736BCC0A6E5A1C31A1B8E137A9914EA8A38EC38515582A2A +5F21B9814F1B95A3A231501353800B112149C71F5CFD2E3A55B6179442A55EF9 +24834308DDB593652CB134C208A7F84A4E9FCF7D580FCE2AC4AADF08DB7A7EE7 +86B8079082EC5A1FF3D45B561B69B9F56C2698EB54888531D945421ADDF26BB4 +E4A5AD30D1DFEA597292757F308971BFDED158EC1A793462CFF812E6A809A388 +24795AA06078601971152F7EDC2973374DCF2C2D3945CB839E8CB7702F6E435A +0E79F28BCDA3D3AA18B9B9C97673B75DF095B22D658C90D163F8DF0CA86214C0 +3D165234B14E373B20F8913638FF228FEFEF111DD0F930968F17EFDD8B87C05E +0A3A895C202389DD7F5EA6855E2841E6DC01323992E8DD4516199CEF2EDD87C9 +5C1C8F4085C9B85ACF85316E22EE715FA188632115F151BCEE512805990FF3AB +D8F4927DE10EACD49B720FD17EB260CB9F2BE96D7B50EF189E5579166A7DF683 +EDB55429F1A54AE9DDE34B4A9AA8DF685F8567967C263E2153458BF1E654E2FE +C19BBBBE7409AF5DDFBF32F26D50EFDD0BB09A1D1106D9B963296034E7D6997F +9BD4C3478CCA3549D3086930C6F9DF60D1DC3ABA1A289982699ACD964112E30E +A1C568A53D701642DB80E2B2C0B6084B29F6FB73B0A9FCCD3ABEBAD6B3D58FD4 +1C5C45606AAF806333B354D19F58467B3C315D65B9A9109708966FB7F498A999 +CB0C7DAAC86F9A0F1488D9235A07D6D524BC88C8C212D80143EFFF603406BE2C +C3108EF1CEE6F6DCF9A3C3CED684800E0E186EE7435A20F54DF2CA4F5539A6C5 +9A5907AEF0DB6AD436FCEF56C198768FAEAEC2D886DD94F7091C44621EED8DC3 +5737DD96B7B2860DC4EF1E0A2B7A963CF707C2C29DF918B7D3066652D6CFE261 +5D381B08F5711C594C03BC72875C384BC01556D907B0641DCE086EA20C621354 +1A2FF32AE1EC09D3F39A11D0FF0A710F4F9E0E7507B6951F96F8FE1E1CA43FDD +34A511B7AE7D87FB7239CD88D1C0E203A6B9AE1AE673AE441352112FC8728874 +D6585EDEED161FE8303725036402609F36A62E1EF8C3014C4B67A986C741B5FA +260A32768B2D1F7B23C4BFAE60AF5353AD6C300928427A5A6E942BA44A9BE95A +E1D5EA5E14F4FE92129D28F01A3B61E49FC01FEC7367DA93FF88DE296A22D62C +B464A027D7F151FCD84811B26FC115932A86F16EBB16EE974B39AAC5643E6EBA +5383F1B29C499B66C09FBE07663CF953FBDFF9AB4F50C2DB63498CB80444A58D +9A91332C23586D1735220BDE76CDE790E86C518C07DC1597ED533CFC62467BE0 +9EC9C70EC2A095F634DB70D5D7DF3D45F66318FBF8FB8316538DDEB13136AFE4 +84B5151453FC9400CF33D0DE81B429FA70449542CDEF957A23643B31ACC5D310 +07BEEA3E2964B17FD1BD27A18D4240C1F445E3B0C177611963A32249F614E521 +1C465B1870EDB7B3EA4B003F113776A8D9EBD060201A0EA68C0D1EAF6B414BAC +D2CF83F811F5921C0BE37730D093F78B1B58F3E566690BAF966F573370B47AF9 +575EB124495710B9DA2F16EB1E33BEF989B63DD525F57B134D15D083326329BC +64CCFC0688BFF7A8D56FC1A6A042A4C5BCA5FBB6CE393B990C33EDED14450F24 +1BBC77354E1B4C88A4E7928890379BB6A3083E3E2D29EBA2125F993A97462F01 +B8C47D06845FAEA3FB523C5CE5761050F4D7BE3C07EF80FC8A2D96FE16DA2F52 +2B50F6518446BF64A0717824F7F8BE9E4734BD4737DB4B613E7E3ED9395672EF +E7F61A887996E5B8B44C94EF7D5800D04353C739043E5BE9F2B93AEB49180390 +BEA7B15653E02A52C70FFA11E3D6ADF017EECA77E97BA1D5DA509A251D585225 +E7FBB89E38482514CCFAE1B3871B36ED6421014B9BC9854247ED67F962F8582B +A4471805054B1A62A064E1CDB4CDE6CEADA8C63E5013C99E5F35611C23F93A17 +5A39EAC64AC8CBB76B19F15C3E71AFE68FA93AD903E7D2C1CC094AEAADA2EA6C +C639BFD4842A2B7C9ACE44433CC181EA2FF9BCDC47FEFFEC9CC0737B7088AF78 +29557E8C1F7A825AB31A7E64522EA9F2F3983C1EB14048B4FA453FC04879FB27 +A38584B80E4923D449D4C9171936934F8605FDA9905A5FD87CA1C44A31920C26 +E1EDEB80B835D8E7A647AE842792BAD46DC5F4E277E534D7641AD2FA14FF177A +0802F81CDE37059B4568A8B06649D7950471FDA7056B675A90FC1FD4B8D380B7 +6BE5958AD92772AEB05010F911CC8FE665F72CF3B8174F7558ED94A3297AE918 +91512710D7F85D5892572B15A933E98E4498882A26EEB6FCFA55D90D48F4D84C +55E3D32F5F8CD1827A5B5A3DD8B8322EC61558D1BC1E0432D9396F508B5E2B21 +4705FA448A68E087CB39A7A3A184A098EA095301A064638156CAF3A2AB163551 +3FBA7DA70C080D6F90A2F0F2EC614ADBFDF2CC0FA7A2FD8359014F3189765B48 +4EBF26C3B384108AF709CACE708076A951E1336FDB85F6D65CF93A5FCB00E81A +AEFD1AC063CF370A5019183C85111E7C94F0B00E84E3B5A1A844FCB9FB350253 +59CC1D705A644E174B3132B017E6CF0690FB041A3598E43C5A7379E74A68AF3C +91030D7E1AC1150B848BA3679B9FD4C389B1A5EED00B807798928A080FB8E2D3 +9E942BA6DC13C68EA2AEB352854A3DE429010E542C59D89FE3B5F3A2FD4A7CC7 +486ADFDC50AA172E0E199B31012D4D6F088082D695410566026F6A3E20F381F0 +03B53A3B6478F821E351F8BD8EF78F793DE6AE2C326308AAD96BCF38D0429D2D +849E05706752C6407CBF8E174648D96EB30E797B7C8B4F95495D9B7D0EF1CA0B +C228CABA268389ACF9581CD0F51DDB8CE99FD508AFC4A38DCF717734CC076A24 +6B28248F8529207CA64F929329B012A25BB61AAC60215C6F1E736F9CA55E80E7 +2E9DAAB650FBB96212005B08D389B6DC61EDF075B734DE09B98DF4129F9EC36E +6596E2AC6418DB0C32138AB85430005710C758D7448DF224734D2E3923259B0D +FC6B7065C867CA4AA8199093264518584E1AA9FAAE36087116086A2E9AC10CF4 +09D3EF67012D1593BB50C9BFC3B59C3600ED250D5C70251E978313933C3C9F59 +891C46B03F7A7091E77C557E7053D3812D7D693CB6C7DA4E0F489B207738D7F3 +3759FFEEC013B1691AF0C60798CAC322685D26060C9CE6EBF066D53F30F11D25 +894358D31207551EB0AFAF3AE1D1B66A6675EBF44C467C6758594A4D01DB0912 +EAC8754AE29E0B3C4D99AE6CF89BF5692934E7A07B0177F919FCCA9EBD323E15 +374291E778B3FE8A8A6CB9A69858F3278D8419AEBADA50B248D2D8C96EB63884 +0C27CB385767F01AD1AEAE9C6406EEBF21B2DFE26C759E2D955A74A28F06F0B9 +45E678A9D7813522CAD3A0A91DA860A6C7EF9AEDF3423FDD5558F1CF976280D9 +E85944B29D1050C2482B9D97A9357C0B3853F98BF7CE394C71A92FC724AD68AF +6A9918F688DD40C917FA4AB39C175B185896FDA430AA88A9ED2516E8EA77BA83 +E45319F24D5E82DC9762FBA0B801B8D0E4F7DE641D4695A9F0A1212F53964508 +5A9C4113B36A9605092435B16E6F765DD95A1DDBD7B8697C94A943623025C291 +04B695920CF1B9C5554F9DAE95F05DF8B61B73A45FA4D65B8450CBD46BEB6AC9 +8CEB6211F698E70F355770ABBEB1951B89FA09CD5E71138F93E2CF3285A28E2A +F075019DB6E974A032F5137B07B6A4C63DCA29E3D60137399A43D7FDA58DBC9B +4EAC070EA82F1BF66D7FA3B06E721048AE9B31B7D5A3327AD85A866358D3AF40 +F062B1372AEBCB11CA70420FD18657C8687EFDFDD545ECEAA2F2BE2F34A05AC7 +7919093131B5849BEDBE80429648434A0302DAA9993A83316718E48CF96BCCFA +F7A1D7E186DCF349C7070F7385E8AA028223DDBFF26F66CF215F61F28A6457DD +1DCE4EA972AF73F231900E0A524ECEBCEB05BC23C5B7407643F8AB7D23423C82 +0A2534D9F582280D0D2445D3EBC42B471C2458E6FBABA52D938A0EC7876A2304 +9D8B04ADCBA20D1101284D4858F97AC95D6DC0111D1573CAFAE8F6F8446C43F1 +D3BC51596AD3C2FB6C69F2A9570795CACB459EDC78C52ADFB76E6784DA1B5FEB +3F305ADDE49ADABEB42C5C01EA61946012C921133742255494D32060EE4A2455 +5BFDDC076F26692597EBDDEF9EC84E253A3B4219F3F13E6C94E3280E8D28BCA4 +E076025C91CC07A384B9962CFE482B734D545E0CFF7B941FA601C10B3E9C2518 +BAE689B889CD18AEB0220CCE3617E63906B7D8CFC26F95B5AE3564B4E9EA384D +3BDF74E8436805ABFAADD9CB40A59095F3FCE96C07DE973CA7958B01D74F5046 +B942EDD853FEE099584E9D2E935C7745B7FF6BEA18DC184ECEF507D14276C680 +E6F07604A1ACA225A52E1C45DC5864068A90B65B98F78357240FB76F991F9364 +F00E4602A8701E1025B16B7F1A97F594B6FBD2A321B042DB35AA44F47D2D049B +BF97DCB804CE4EE2EDA3C5D6BAFD1B214E35D23ED4F216961419152CC037D1B0 +2CA38A5111946C23CFE641DA07FD378590CA88F7743CA51DC77923CA75B681D6 +DC69B139588E6560692E351B2ACDAB8CC26A6341CFAFB2C3486DD98915BE765F +4CD20807C525A85B515C0C16621D90623EC943B55F0771FE3737866867A47060 +CFAA4542902BE0677A53B77544E2CEFA3C04E2008598250F28688CAA37953C71 +6C190F7D4D7C4C63BB198454EBF42AB7EF205BC46C94890A7F694DEB313157D3 +53D9CC57F45C8B4B45205B34E3BC4E6E7ABB1637BF2FE53CBDA4DB86D96883DB +13C3E0DAC10A36BBCD0EB98943C82C3D4EC140BFADACE3CA5837657905013F19 +5D656E299E99857911C105038B940013CF7120AD119DB6387FB82673C7425E41 +3EBD4C898BB6C4CA79327C5C8224755C09F406E7ADC5312F268D28113245C5A4 +1FD5187376C43B631A46606B5E4DD342EC3794ADB2668384C6074CD62C8B3FD3 +0E250A6010DC25AB2D9C2130372A7ABA5D99A55FFD5C2BFB361B6641950273B3 +DAEC41E29B5F4E4BE6C47B6F8B07BA114715715ED44A7EC9E5E02143E9158FEB +D74AEC18677F3289490ED44AE41E5E644A88A2608259FD8289F70382ACF1FB65 +DFFB6068CB49E42D2BD143E716B2552F79AA583492AD1B0101FD8BCEE7408A15 +EC0F74F86AD1E5960B644CB98A0D7EF61BEB88CF986591C7CA593D4C335C2242 +FA9BDEC9EF27F959874CB790433050010B76C5C4E8E52F6081FE12B43B68511A +F8E44C320C77ADF8BE420B49D01A35B2196D311C54746A890E309014B28AAB43 +5494C69A64116E35286FA70DEC52AAF6F01B279BF7C3EEC83C5F83A7E06B86C6 +C87AAC3F48CA4A46497A678D42D7F6E5B75EE084986050C72D2AE7403918FA52 +9448E84F0C13ED2E05C5046A86B785D6B28FC837CA0679AF787FC6B9E0BB6694 +6D9E6D362C0E5D2286AE2C5108059A6F1062FE5BF325ED0AD064CF9ED457D201 +920AD9DDC276D4AAE77F4FFFED8C3CDD938EF957C720CDB03ADC8D5802852EE0 +3889A623D3CBFE97DEA0AFB94E3E8E4D46A3C58327FE6F23958DF08B80D5F764 +08F1EFDF674493B0FDBEB2B19805DED353D9995ADC3DF804E574CAB0E954E3BA +9C76607F322D2155D8473107715EF96A06A85A765F594814198083CF841C120C +E1DDF6EB226382EBEC5547CC40BFCF24DA3383BB8CBB1C4E5C71AA04A49A32DB +B08E650951358951785012DD855EB6F7BE2606215B61715CDFA9E3B7F74AE31E +19814B61AD49AF25C42C298F52D4F4B1F0D72CA53CD511BF16D59F2E3F7FF3A3 +0228445FA2267D52A1049CC43EAC74C474E19CD574DECCDAC37366BA1C533BF2 +3590EB9E6E4E402D6B331BA57C25A9DE9CAA3551C2EA3B3B48D1193C811E94E6 +477C451A23203C0F901D5DF77A2BC15A54D0289D7E1D5F051DCBB6F97A2C0007 +64F1FDE12220479919B1AD7EDE462A28BDF5625FD11BCE29DC73B0F130D7B73E +F1C956F0EB7D355530E80263FF95A3FD86C5BF5A8F9280A302EF55B50246177B +FCBD3C8B4F29887FE682524ADED4B3EDBE4FE9C3174C072E24631D919E297DA9 +785E4CB724A606B8E056E3C12081ABC5E3CA9DF754330539089AF63B85F05938 +D871A58BC53C5ACA3A057302E0E5EC036145465AB04210B257753DFA9D75BE9D +B57AAE25F11331C4E19B210B39ED8AC74C2A45640C7F914B56CA1D85DDD83ED5 +40D1E4370D44FC03C5DE5384AEF8B63BAF7BC7FC32349CB6611FDCC82B91D2C4 +BA111BEA7545081D250895C8E5BABE45DCE4FE11BA87E728E08FEB146281A44D +00012518E56AC86BCA87308C247A99C14559D383B85F045BD99EC6EC40C4D2F0 +65701599595737E17FF4707E938D4163DC5C5DB95E2F4D4AD8E437F66A3C36A4 +C792D1687679DE42FFAB0BC754E5B1E43508C21FBB1A3DC304485C415A686657 +EA1A0E90C7322A364B8AE93425E044661F6556651D3F9873A102E87B0B68D8E5 +D468CE2F02359FF20CCE5CF53A22D19250A7ECB6940A98CBF7C3E2A664D1861F +86EAACD43BCBBB0D888BAF4B5E90E90D32CA53BCD5660FC10866B9CA92E43DB4 +569CEEAE4CFD211763AD75B885B9C65A8AC553E5CBB5F2C4496DFDDEF46C0115 +0AE64EE489283932D13FC4DE2ABCA4795F3668C63416EB357062394DA0A826C1 +7E6B05CEA77CC0CB3322700F3E1ABF1E6CCF7BAB83B6B4026F03F1BBAD0A10C5 +5E8D9828C10AA29C5A2EA82730561D4019A0C6D131B433B9DD9BE471F66C15CA +384266E8C1714EA8585BF507366B7FC0F0F797F40CF4A613FD15F033F88BB3A9 +9D5B2654E591B634D49253B2706A31E2F0B2A1C699D0890BC8FD4B25FCCFFF92 +809336ADA46928D535ECB86D167A081FCF19AE7BC30E56225E040AD75FB5DE61 +52C32A4649F2ECF10D3438E80A50F56FA3A43009C5C845838563EA25421030FA +F79825592A51030E21F9BBC1536F33D2CBCFC1C22499C0F80503FCBE9BAF8BAD +D35DF34D2875D4E6E83EDE725C829D4A53083484351BF341A8DF8004E20DEDAB +607D9328425085A8F3E757917EBB775ABB9EB9969093AA44B58E092975ED4966 +5495E0E7E602F0D3194CD7672495CA11BFB1E80231258EFB746275FFEFCEB535 +A718A12D58827F2EB225400C6881451A4BBFDD4B46114779926BD485EFC8DE44 +D6DB332605AAA5A7FC1DE0B4C222E49A33C821426D8E368B931D0402AA1B839F +1C5FE1C77C329F8DAC88B72EED01779E9C18ECB4369240460980C264FFE5ED13 +5897ABB3A748D0F855EB83796DBBC99917F6FE0C9CDF733AE4CF9A05CB96E88D +B81C17897EA2B714F9B83342CA33D092C148EBFE2F5341CCF2CE1E4E1E5CF89C +5AFBD1B998C0806AA39D7BBF68DB42F013A8E1328F1F32542D5636ED8EEA525F +33F5E1204CAA6E8498CBA5F4B4C970F31F0E9D59ECA534D6B886BDE7B5617B46 +D0B6E8796F51A4CB169C64A2D5A4D04E53B46373A7824E35CD6BFE1017F733E3 +239A0B21E556C96D64CCA81665CEA5A1EFA5B91FEC17BB99DB9B16838A615890 +F6A235A1FD3E7746681EED1A73D9C0BA3F5F229B7C4F8BCE672F8535A6332894 +8C788FC18113BB20EB0C802995E333737D6EAAFDFFBEC04DA500B28E3B1B9CF9 +8A74D155FB6560060F9E8CF4E1EBB3B47043CEC18BF2B764EA71A7F7FABB50FF +DE301187D740865EC7CA01A58A315D9E31D38476FC8F20FBC23F3A6658001088 +B9FD73F5164E3689210E6C88A83C1894AE8CDBB53E10EDA5C88839D7AFDC3910 +66B88A12BABC981BA4099C05EB047042785ECB701932C9CC4F96E8F5A2D20B11 +E908D9C619F1D579ECD5ED7998EEE848EE23066FA80292CCF13B0B33B15EFAF5 +5878F3CA17A08440DA18802A5C6E212BC7E3B8555E9DF231C1F9571D77E2C8F0 +81AF6E1B91E53C1B630BC5A149F863290A8A596F6D4C5205A6149C9E356ECA6A +B827C7417010AB2750F020E0BECF6F40A3D356C708FFED6CCF928911AEA0D6C4 +A96F2C1F794C9F6B208646C25A60C65B00F7E0A3321F21B25D1064FAA29113B4 +8F3D1DD8A9F67AAE5200858A7A4EADAB2326FC8DC5069225F464B34A0E6DBC92 +7E960DBC2BE9E03657BF54552699CA523BAEA23D8B0FF3DB605B6802DBDA6421 +88D4B5950ADB9DCBF1CD9C6BA643463B09C725460A9B5CED29ABDB2813613A3E +9546615A0E247A13FE0843433BB13DA9F53ECFF4661DED22C2E33542DB518D09 +BFDB906B8952BB029BE10DDB9DC059B59E4EC6E7BD2889F2ACC74402D9F96DC7 +7D8125154FA2407151A926147689035FC32C0AD2A606A9FE3107B5EE501280D6 +C75236BCFD6C422C1216ABDA87DD13B045E541F88D566214E579F8D3E6C8B68D +0BFDBD1715628FF84A2F8778384F9E7B796F299AA3CB76B10C82F9D5CD7B0242 +3CF6091D12DE398C69F29F1DD5F11BD467995E35F6E296D48CA8EB7D4671575F +4A53CB37F995A33A39AC6241B7FCAD9C1A8C23E14A9CCC0E233DB1C4888FE4CC +709DDA2563CE6F834131994CEFF5692B0E4945A2CA672913FD17E2A5C58D0EFA +268AFA4A39E948D2084F0AC14F1F59A0AABEED9322A1BEE00959499A657EB681 +A32E13A6BFA469078B6E752C48EEBD614A48B8238105D61EC32FCA6D27C0F914 +E665E9D87C5EA62B53F1E7C4CE2E7CBF07319ED1608C9E9E3F1258C463C1C100 +2554DD5265D35A13B3CD9304BBFF08096EA237C9178F88BAC17EE12E2AA7CD29 +CCD7E976F6A102DF7EF4947846F415DED6E60D180B22EC9E91C81227CD167583 +BADFA76080A434CA059E64BADA0BEB2B0E91AE2013BA5D23D3FC1ED9519027CF +D3E3E2482786E08B3B35D2B6E14BAD2E24C6F437BFE4CCAC08C67F2D61971C9D +D30381D9CC8882FB245FD0BBA73EE79C1C5EA7892239B54198CA4F2DB0D77267 +38CFA22A1D8A53030602FF834C0717B3E372559D9347215675DA86CBCF01DFF9 +C46451FA26844D4B3864D9C6879F3062F8F851B552876BD15CC84504EE8D5B25 +E981F9AD4FDCE79FF59366236C19D41126BE0003908E91DFF2A3CE3A42A9ED9F +FA8272446D31ACF35067CFA838C0D1D023C7F99F45194550851B4A11584F1EB9 +9C0E3967867C92A260D815A28CAA5CC842F313BCF1140C5C2146F2FD25A46243 +320A1C5A27725472E5640211DB0F01EA82640C880EB557298E54B1CC27CBDF6E +C2AF67684B23B6822210207E45E302AEF4F9DC2F2A3B9B7F321243057D881DFF +5DA582555915ADF2297C99CC0561B26C194B764B7FA2B1837B6C5F087FCB9CF7 +D718DD816FDDBC26012531473A1521E63A724D95C73D29987105C38AE741D75F +76B95C4CEAE23A6D1D29B494D089F9B1750243E6C2443C37484721BBAA145979 +0B65E86F97F81D1A44D9AFAF762604FA442B33E0B985F8414AC699284C05FA83 +802D0ABCB947971C2DCB161661D1F38F96081E974504C00DB0D89D8BE113493A +1A248CE00F8A54DD352BBC2728F509853EE05A1C6FF40C6DF5CD7B2968344F1F +2350E9B88FF8415CE0E113D22DCC6E5980E5FCE557A3BC64E141B4458150347B +168E35237A245A1D1532A7C1E8AA487271BB4DC122C0C75E47AD7E7A1C35BAF1 +BB797EA981CC72DC550BFEDAEE0DC722AD62AE9554FE9E822D2BEF7E9EC838C4 +4995143A593CF33BD92E37B12D3A8F29DE6EDD8B98401AD25FE73F3505F18369 +5A5DF007C4ABA613145AF6A8B7B06F1FDEBAE506DFE8585265ABFE2D662F1ACF +BDFADA70EF86FDC577EFAC8B24C7C399CD098E1A0DEB65E8C95C2C773D2B1092 +1A39F5AD71DFB6EF8192FA1DA31156D08205792B948D26FA1FA3BC6F5F3275FC +BADD90204837A228544B30AE0B0F8470DE34B9C928A980958FF01C481BA1480D +998D4A6D648B97C060EE44AF668BC1546F7309E685C1A00D8227B4B7C5F17E78 +A89809823590469C0343177A54DEECC1BCEC612AE333F34981A28F78A0FCAA78 +116FD3C17B19EED4E55C01ADF0F8895EEA12D45B4F3A25AB605A263DE932276D +16B9B72BEDEA2FFA8F493D119B2721F72DD3CE0F1DC7365386B63CAFD774D142 +388527F0A02394F0C5502E3768ABAB2C080FBE5A832EA82D6FF99C5A65AF5D33 +F667F0225B9F319F054C475780DDA9C6F1C8F0FD0505AE8AAEF27D0D1CC330A6 +410825436D6CC0842D91EEE3B5F198AD84CD3423177602D521570365078AE6C8 +8079A4A0D87E599C0876AED67FFB3FD13886CB536EA2F022326A00A121CAB893 +01CD94FFAACCCFEE2B2167FBBC4A62F6B40BEA1AAF1EAC43AFFBD70E53B80039 +6CFA90D932D1E597C040D98BDA0B019D36ADFAE872EC1BD91ED628994D071EBC +F62659CBDF3EF702D0FA67EB9F95E2BA245F1957EC8BF8D5D1F7271CF8CF3837 +A07B3367ACCF0B4C4CFD30A374FA5C9156FEA1F05AD54FEB2C377AAA7911C614 +582AEDC105D97B86408C005F597F861D8FED1F401D3AFB853AADA4E81C57D744 +227F9ED2E1FA8A46C68679A5561CC83BEBCCC2B432EDC0FBEF5BA4B925B6BA76 +965CD982D5CD469FA31C5BB567171AD4D79B62894ADC3BC94749B4FC2D137759 +2892026E16A0F372EA323AB51E23C114F30BE247CB5F2BB4E3656F660A8F0C31 +25C43E7F0DD10669E2B0819D62A402AC1F403B3B3E42181207A8FD19EC9C9EA2 +00CEBB75DB7B7D1969CD18DDEF18B7A20B0D3F702455B4CB9705BDCA36B09397 +B76D7ADBB40E2037288F57C2CA99EABB9870E1D1CD7F3F2DDBA010D641BFDBD4 +321CC05839ADC1D3ADCA67B2FDD3C5A3B4D703ACE6EF665F7293162B39051CEB +4CEAD2CFDE2AD38C1DEF0076325E869CC4279164A66D8922957AFDA10DDE38BA +C8237AFCE135D3EDD082B4E3FCEF82E6402E44F4511F823AECED2B222DB97856 +26E846408D556491567CC4259FFC7BD9C0838652714B3CFC61F44C9BEBA4485E +53718997739101069F14B2A1900FA728515D0BA26FAE48BDE871091AB3B6EA90 +8C2D42858E8DAD44FD2DDEE93C0785EF10A4EB9185C429750820DEFF528796FF +1F668B63762870C23768712FD62382311C8C4737065E8FFDEF70B3DBACDFF083 +49DB6627FA66567048891BA794EDDDC9C5A1C47F60EC1E0B5744C26B4B110900 +04FEDC8143AF0DC2B02F29342CE024D6D5876E5DB59D7323A28B265FE2578FB6 +2BF0EA9F0D85987E3C7B9C4B8E491D9193D40A5E0BCCCB3E9D9428386881A3F0 +CC586A6A6C1B256976F03A0BA5028ACE4E5AFCEC7CA47FAD65FEB559B3F7B0B4 +A24316CDABCD387BE5E241A11BA2D3F48A9951FDCBEB6DDB9227B78CACA27A75 +371A9CBC4F2BE12D139E79ACBBE5760A3A0A044583B334FF524BB1D5F0FA54AA +6ADBCAC4D6F6C01213D0C6B54BA8554B49765ECFCF8456014B7179876B88FD81 +0725C7106266B3B9241E6EE12535771864EFD3C31EA57772239B7DA8B9139C5A +2E3AD47B2A27E560CFD6DA87776E3D66D19A9351B1E352E829A7127BCB0F9713 +83E3E5FF6301535F372C38DFB8310CDE0FF24806A4B97B608C8B249EA1D60E76 +AACBBE28B7C4A3581F977680F67C5C3A5FB412E481AE7A11417DBB7D8B2ED528 +658E92B8B0B1FEDFB8F4DEF05D2CCC42F6B57703A33EDBB4852BE8E975E4C6CF +1085908476EC40C50CA746BD761318481936B71639B24011BF652347BEE3FDA2 +FEC5BEBA0F5A5609F5B834DB04746D4395B08B1AD4CC45B7D24099259DE86DE0 +F5C0638881A9C92C09B14B24AE8230E47E53B4785B52989911C164A58FDCB167 +2B0390701EC7B6287D9C942BD519449A4754C9AC7C0A22BB500B2A32A55208CC +2DE0E516483DE632789471B8D46260290AC32C26FE2E31389A604490A087D0DB +81937C0F9C0B15714F2410133CCCFDB6F0B0FCF95897DA3E0AFD783FD9AD2BE4 +6D21A6BE877592E404475471648F8205483B894BE866799E772533AA33728D4E +F54C1354822020AFBBFA7B4BEC6F3FD9B26D6EF307618DA000C56ABC87D98643 +D543A519FC8D61A2B86C7E18364EAB4D31A48EDC70869DEB8044A17FA8B2CBA5 +224851AFB9FE49CD5219376D6EE66772EE27FF6419557E845C2B0426D793CC2A +3165B3EEA6A1A13F421C8CA3E47C93106B0B6202D86C5A31C1122AA3F17A86BD +065EA5A687EA3B1ED324A9F36246919BA50117492866DD545E42A1186979FC71 +DDFC98C8A6FDD649B17DEE9FF4AFD78920A75FF69ADEF128077DCB3F5FF601C8 +96599F8C9168D7229BE969E5AE9A08166EC40E890D1DD8B62E29AFD2E3B406A8 +73396BABAAFC158C6A92390B33598F8C643DD4FBDB760D2D202815DE41E8A471 +039F8D61F8033532CD100F07D726D0D92E68338C014C88B274357D554EBCC802 +265288D9E554ADA4CB6D1431D0CD94CB3D1A26675EFD6D036BC583D242710A8F +19751007530B1CB76025D04432FBB38D7468FD4203D9A47F7E67C636ACA10E19 +A9FA72D3DF82FB37474966A58AA01C5F7568DC7D4668ADE721BA5219CEAAFD3C +AE372963DF037ED7574AA890AD12463C5109B5CF23E54DE574CCA937D5C49BF1 +F763F6380300887970BB22246FCF5B2B2EB69942748A30BCF9A003BC6FBCA2C7 +325284834812EAB44F42921A116B12D184F9EBCDD8B782933A1BA9ED1F33F97B +548D72EDE27B24A0A8714E6A847254763CA5AF040D304D75E376A43F9CF839ED +1D9E2BEDD3C0BB55E19B8C5FD48CD785AAF3FD381CD301C75B6BCD63CDC52D0E +3DB72DFD034AFCBD61DE9C83AB58A593D727B6EAB8217CC38FD5AB57FF1DBF78 +01B4CB52D6E888339B00FF527F839026787F743EC13446C2B9BC6C73E24C5E75 +29AE3FD77A54E341F0D40DE696FB0C11E12252BE4B039A80618E1B9C824744C6 +E918CA1230C1A1B389AE706AC4E4974A204854CF371E655A80CADBB400DD8F8D +A6C3C168A237B5DD57E69FFFF2D670268242A54A2A30DF8EE3D6802EB60B8568 +F101F3B8081563E133B5589666278217DE793AEDA75F72A50A558EF3C4E2DFB7 +6CAEF16C7FC19C7C2EF3A1288E1B77064CC245CB799CA5DE7D709C1DA186AF22 +1453CB15AED504F92D27201EB935E397D85983135B606265449423D878AD8B0D +C53B9461A91F46AD34F5CB1A3A0264B6305C01273C84CBA9761260A30C36BCA2 +F9CF25CB60710671DC2EA7D9D48444E53DB4F4FC0803BF617632C87EB04D54EC +B729E72DCCE2B88CF6A4FCBE878615FC4A1728D456E911F904965FF49CF1CE7D +69B4EC40857946FD8A761310B2D2AB5B753D6A47C11C789D682A23E7F80416DF +4834804F7E600AD21CC2930429D479319E970CE129AEC7AEEDB3CBCFCB311693 +FA4F4C645405B6C9A6C5DD437F6D8D320C36DB8C34C8883218B913C3B9F3787C +DE794BDCF63BE1BE6AD878880243BB1F5DB700A5FEBEB48E8778827FC428A1D5 + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTT9 +%!PS-AdobeFont-1.0: CMTT9 003.002 +%%Title: CMTT9 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTT9. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup +/UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTT9 def +/FontBBox {-6 -233 542 698 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT9.) readonly def +/FullName (CMTT9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 37 /percent put +dup 38 /ampersand put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 43 /plus put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 54 /six put +dup 58 /colon put +dup 59 /semicolon put +dup 60 /less put +dup 61 /equal put +dup 62 /greater put +dup 63 /question put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 95 /underscore put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /braceleft put +dup 124 /bar put +dup 125 /braceright put +dup 126 /asciitilde put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0 +42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259 +4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457 +689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521 +0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA +610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8 +3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735 +C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933 +995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE +EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723 +2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0 +4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC +B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014 +D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE +510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5 +BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF +93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC +F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385 +45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757 +4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47 +088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8 +9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A +09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988 +E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C +0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A +FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C +94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741 +03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF +409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71 +45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95 +39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971 +58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85 +84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A +0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F +F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD +B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD +D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B +3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B +7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D +8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737 +712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E +C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3 +E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA +A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC +2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467 +757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C +54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981 +DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9 +08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD +6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2 +A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5 +336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D +E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB +3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A +E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627 +1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903 +FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72 +A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6 +465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0 +3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32 +CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF +573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA +9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D +15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D +D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5 +15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1 +64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789 +D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C +D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8 +576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540 +ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135 +EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC +9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099 +3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A +1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD +FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598 +C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA +4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0 +CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7 +3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D +D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9 +BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6 +1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D +4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442 +C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D +80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C +AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6 +59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647 +3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6 +14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59 +B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34 +F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8 +54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588 +34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191 +825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439 +BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54 +4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F +66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E +2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF +F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A +1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416 +37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6 +741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1 +39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC +887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49 +B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD +15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526 +5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1 +80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839 +A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404 +BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048 +2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B +B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598 +F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B +9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483 +CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91 +DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62 +6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B +7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7 +D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B +9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9 +EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12 +0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2 +1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10 +85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0 +EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F +D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518 +E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0 +88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842 +E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8 +01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68 +54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A +97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78 +B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2 +D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9 +18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE +A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13 +1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62 +31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5 +408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF +1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E +29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33 +BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B +AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8 +0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D +99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE +480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC +D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481 +FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB +587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51 +A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C +C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C +AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D +AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4 +48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367 +385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56 +8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38 +4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C +839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C +320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63 +7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E +DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D +DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F +461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A +BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449 +1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A +3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500 +0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77 +EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA +AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8 +F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4 +097C4995B2C3BAB2DD04B1A7097DE16DFDD76465E79ADEEBA90489ADD0914EBA +53E11A43ECB11D072C68D2131BE1C7C43CB9DD5FBA0A67BA43D6851AD4CD3BC7 +39AE2E22CCC183A56CEB71D4F9F578518E376426E42B6390426A8434B5A83E78 +77A5B9963BAECD5FA5521C2A29418764E4EC1A72462B04957F823E2817A7F8D0 +1512919889500024B1C42EC107E8B8533C0B314EE4E23313A4C1BDB009A2073F +9BAB479A3F9DA76CCD65629CCEF78015ADBC2D0D124B3BB2D322FC4D209E417D +84BC3C758B6AB64A01E25C9C7B71D741AF90A19A339F99A0BE9FC39622F04C6F +737474CFEC19C890A657BCE192B9DCD8F273CDC5294875DD4507DC572551C934 +9C362FD595A429FDA2D815959461B0CC2A804C1142BD91C7567082699B8E274C +6A22806D6C51B7DA809BE9F612EC537D4FF3122644AE0718BBDC6ADEFE7EDBCB +8C8A76CBB280E70ADFE563C01CB9EB828ECFCD365825941C8B7E1B1401AF773E +0D3E8A6F2D62624F8F5FD1EC3CC76254E4CCB4D8E4DF0D5E6DE10BC1FD8BC325 +05E773E0925B6838E0D7ACF12AE32E572F6642EA587806FD2805C9147B873194 +788B8162F3C20C915E4909B72D0A62D4A2B63B3825F96C42625DA10FC0E9ADCD +77F50821EC585193A56698ABDF8822AD65F853F06E4171E1A1AC06E5C57691D5 +90523A7F03DC50F41C46D72151717149566C2D356C1A75FE76619AE45B9CD605 +D3A0B33690F9431CE242042149A2E42BC6A9356F786ED9B7674C243C8AED9D77 +636564B36A52EAC1EE25999127F925F8755EA21272E3AFC856EA92F1B1E130A6 +9486E1DBE81C78914A157EEF0414901AC8BF313A9F444FB2844405C263105609 +9E302C68BACCE64BB7945535F2F9C2872DBA3A602BFDDC2C6438B302B8D96DE5 +F537A714B7D2BF4C8B6915011D38800C0922B7089E1F58A5A6DF1D426261FFD3 +8496FC59ABEF5653D244E51DC18D750C61F4AFE49961F461F60F05664DF2395B +7CF8112611AD3C6BE0D64AD95CD956DA57C6E641EA2DFB4F84B441D627E68C6A +ED7CD840D1B199AD4B428C6FCC8E0E4CE294433A4C8A4F1E498B5ADC74B75490 +60C206487C101F03F8704FAD6B22DF1BE74DBB61631B2426EAECE3BC8120EABC +A4B87B7D1C47DC03DC1F132E4A4671129F793002C5163D5A341BF2339A0DE9EA +F6CE84D02DFA57BBB021EF5B165E47F01EFD7441F57D5072F4649F2C6A9271EC +6333129DC28B1DF6641E7BDE87E27B19D474DA41A43A6F985CFBABDA93BD0C9E +4552DDE651D58874023F062CEF99CCB280E75E6ACD9170013E67ABCFB7765B63 +8D5778C5B9294A5F9EB8165B534CCF2345373D744D46DCABB2386EACF24FBFDC +945B43021D51381512993D0CCE214FDF11143F608964E2E4458BC307618FB066 +D0A09A1D3986B9B2BEBEF6CCB56B060D92488CED8F8657B779DCD06FAE5DDEA9 +AF3DEE61771BEB0106B8446FFF798BDA4522241ED5A3C2201B859CF99E487A9D +6D09F1F4E15771BD8B827C0C6FAC0C68CA005767EEA79C653D10B357B2F35AB8 +E27E9A9E1647B8B0695D9B3361D5C4DD1C8502307AB8D589E8E7730CF4E79138 +DC663A160F8B48A09E2463A3884F7110DA86DBAC85BCDF0F2FB642D3A32079BF +3EA12A6EC68F1B16886B92C447C6C671D056C625D983A59AFDEDDB11F5CA4607 +849A561FF10F2D8AC4C7A07FE97CD0D40EF2FA3C70CBA1003A32B6F1E6AF34CB +297A8161614ECF7582E57A0C28073664DACE0B1F5975CA309A313954912428F3 +EB1FD70B512C6BA2807E7DE61C4DEA4AF0F975BD0813D74C3E7DC9B0FC48B19F +8AE1D32B736870819CA75057B963C1AFB107309889506B0905CA55B6F3021515 +B0B6A1C0F298421CD24784B89EA18251ECB9E9F76C0A61CB6B61CE4FC18E84D4 +C7ED481808433D1AD785D0E66ACC21F5DD37CFE2DAB64F3D23E0BED8A8E21058 +94802B93AB33E5B66B126C818CCE25F58852380D0A46A10BAFFA90979FE3C5D6 +C1A41AB044D3A12D258AA40B505A7E167FB20697D5607D83C90F512DFBF4B8FB +F0AEA744390E9D06FBED2D1D5708EDE5C4365CADB27F9126DE2D0D91448776A0 +1CB4091C21D62A253B12FE336DF35BD4B322890B0AAAFE6B917E584156632567 +136AB50A591298F50D9B7756AE5B9DC1CA48C08E564BFD1AB5AACA99027E5950 +E12037FA2BB52BC7F430096C7CCC2E6E49036B2EDC04602B42047659ED14B344 +996D0819CB04E198855E16E34FAB061B23CAB292B6A3A33A692ED38128193D37 +C8CC57648A3E641593A39E464E46D260B38391EC6C54A5866E555F46AB175457 +7EF1CF14F518D86A975E0741C75816DEABB25DCD1BF501F3F7FDBE8940DD1256 +8386A7D8FF00994FD669D6377A279C6833A2D4AFA5BA3B02925B1D4C8547268F +408B524D3F9CEEA491A0A7D81843317C001EBF830C369B61205CF76201FCE5A3 +B2A5A6D96F9F22212CEE6D220337B2F0799EA3BC4AE337CB463AAA21C79C57DA +02A2E0A60931AD78E20D5471DA17C2480346818533D131A62C5630ECA98D24FA +03612960B26BEF1FC3A01B45348CF695D4A2C2B69B15EEEEE49B7DB78B03F39D +A6694E0E1CDCF75945810A6388412487107C38BC9632D637FA26ADE3EA61F5D6 +3D48E4873A03C7DA132CCA34530F27504B51DD425A3E74DFCC5BB227F63B82BB +6C854F5447F3517A794A78753775ACC29A61DD380CBA00EB25730E613C11899D +B5542B8F0F4C80FD9ED2073D9A5EFD3D4126F64CCD5B3626B6B8C0014C31C9AF +E638C4E9381415F903DE7B554B1BC135138F12926805CA71A11D6551078FA370 +08AB0C884EB5EDD95994D4D1C5D8DB1412DF91DDBC521339479DD06F5CDC1A20 +0E35304ABAC27079C48B688B3E138026764E6F579503D13E2A87C11903360655 +2E3EE587F8DF681F6514BC853425BE7178778B0B95A9107FEB58A69CFC9CC845 +D13AA5DA512CCD45886411C0809CCDA5B28F54E5C1EF261C280E0B218F6E28BA +2D97F92962D962F48F753A61FA204411DB939E77120B8069155754B663029E00 +D7397C001E098A45D84FC93AA3407F8BE54CF5052FFBD2780E3A78CC0F6292E5 +17A6DDB977B817CD9EE2FF76EB1ECD06A7E36D256BA05DC8E523B63FF807E1C4 +198E61EF3537B05706F8B58286DB806A9F4380AA85982EF8A053F52E26D28D4E +5EE719E725A624A024AD029984C35E6502FF21CFA2EB865D910F667F810F4A19 +855F8051CBBAB71EED5F57ACDF4718EAC86910C8B38FD1EE596E98A0F95BE413 +885D92B2412DB15C27E8A88C7DC20781CB6D9197F6063554777A3E2AB59A3369 +916C3554B025B6EC0792F09D0396F6AE8CBAAF647CBC58FDA759A4AE2BBA8F01 +C9DD5208A58C25210A8F6B8EE44C2E83FB0C5819ACE93D946A822FC5D1A5B329 +8B7883E0DA2555B6905EB07D3EFE3A5F5354B7A6DA5FE2FAF2A8DD8ED3A095C3 +7D7EE87ED1947EFA55EECB85E9944C9B3D9DB1B2B46A88D2B4F0276188C758DB +A7A9B5F9EC59C67A553831CDB326C1C6D38528911BBE5C9CAA2A845B6D34AA1D +4876501B96E9E4515DA1242E6FCA80EDDEA1E3D2DE9C549844D239A9CFB3905E +984FD2AE71E9D356077A261EC502B8D8BAD6C5CE9C1711D65CCECB52D69BBA9C +B2A5BF994B7405D09AD22C54D1A8D4893FC7DAAE7D9CAB00AB3FB61F7F56A88E +A6146C98CDDA05078DC0387E8B35C5D460D21E19372E6056E5E4B23A2F2FB3EF +1DDB4E5312E0B2A4631C546A7CB1CA2A3EE23795BBFD061A44CA4A2F6F5A5E0C +4560FFCD520E8F235D6B768D119B83163CC1B13547DC447575DFCFFE1E06DDE6 +4A0F0AD5C08BBE48432B15FC9D144E6ED679107C81D1117E7A7ADDD5723F4EF5 +235E44730BA14F7AA0737B933590C453162240A1E712FF1436BF8CC9312ADD0C +2825E46187ABD85D9661B7A84F57BD78A35E7684F6F9E6ED1B1552D2DE55119A +0C1CE4CD1712EC5A318CF4B9A389C8120F332043129F24E341BA41D5C1FDFEDB +B3777549F7ED355DCECBB56EE36622E0F2D22B3F37B0DB808920807577ED7230 +35DA36AB230E3D914E653D94859F257149E617D82F5EA6E6D1B6C17C96008260 +3730E3370F9F979A98CF71F9E38D592992251AD5B1DFB03FC466DBC7485D641C +97E5FA71484745A41CD87B4C1AB959A4B7E1404E30E8133E5707258A0236461F +58C7F5FB1F0CBDADC204311590FCE4C7B0165690CC869F221EE486217770B65A +980677F4B80A045587EF3F0C71E90DF404BA8F1BD7A3DCAE406A9EBDB2CC2E8D +E4D25A8ABF1B4F67D5A1DA34C6F67AD574F71E894A52DA063FBDC6A5F35E2385 +14809CDE8D4C549DA24DBD6B41359F474C0ADAB4B17F5FCA1DB304C685687DA8 +510292B17FDBA634EAC57DCEF505025DD1BB9AC7D186AB560A57871840FCBA7B +7FC606D2643015E570A3917F89A7586D71AF8CA24D56E71284C979F37F59C921 +7E7F33B1F62A556CAD6F0F43B0D31BDC3FC92082C3216A3B4960086D578BB797 +0ADDC78CFAE010530E09A86F950BA7DF855D0CF9EEE48E726D32DDBF97469277 +0856D2C19F819DD0086BB19C9A445F76C4745E3EEAEF48A86FC7F62EAFBD0D3E +E5FE58DA688C278CE3C4806230C33DE2E6927D1A0621910C75FB0F6BBF85FEFE +8F6E8B55E2CC59E2E33F1CE139E08C3195F0BB3653A45434BAF26A3D8D150CEF +52C48C478E651A5F413E89DC60A7A16D7B73F7F90B070AF22F560A7CD2EDE5DF +D3136617AA3CBDA07AD5BAE734E54A99C00EA3B4B46511C93D5ECC962E96A35A +EB39D6DEEFB06D6E2E4C027A47E8EA8EC2FF0F4A9C84E5D3CF4273E50DFA722B +5D60C918C6981B8627F1B4F4BCC31426317D3EBC95C25B53255557AF2DF70199 +1974A9F67FA7E7F545081C54F3103E4A45FE2C439368DA42D72FF4ACBFB14B5A +73597AB5E1EDC92A3A0BF4FFC68E9E74D0244573145959130142D903015C8D82 +F0558015D3FD56C45472D1346AD727639D26DD574C9DE0A4FFF51498B78C9653 +05CFC327139DE48316D7790E8CD1A9D0D5606ABFAB745F17C5E90244A209CE56 +298384344A2A216EDFE7D5E7906BA6E7E03EEC80B10E2F3ADD160ED4A21E5E0B +B64BB6FCC7893D6074E8884BAD38B4DFB61F429CE906062D8C37488433BA7FCF +F305D8C59C900C6F36BD72C2F48344C6C8B69DDD304212B539C950B9C40ECDF8 +01134774881EFFC2E7BBB8465311A852099D9379C7522BF903496DEAAD12D7E8 +C662DA12A6DA3E3A99D7DDC0DC81221BFB27F1CF2FC6CC1679F09B89FBF66130 +4CD106B99AAEA0AAB0FB6C3C43C2405FB979459C27CFA6CAC2A453157AA7712C +E4C4EB0D03E6F4DB648CB2FF46A7BCBCCA740AF8D03F4E032BC1F07B58A28C7F +20C67A9F5DB3036769493076258B474F7F2B11F78E1600A1AD228963B37E86A6 +20440597F89F67A08C07AF0CF3E3628C9698B4103B7E296FD5D78491695958CB +4F61366EEBA51C3A7F22D7DFA81FAC74483D6BD1E17718D8608D728D45FFFF41 +AA925D4FB248EBA78A31BC2E4EDA9B4BDECF75E69C1572B02724AE0E88A47C2C +2606B0D5A952E0705AC500DDFDBD9653D4CA984EF9CCC2DB8F0E70853D172D61 +8510F07D0CEB47AF4BC8EEC06D2AABA4125CE96FD28D9CEFCF6201A70C139900 +1AF6D4CF7DC807FD1A8202AB8B0C005067BCD3AEBB482BA2F8B8FA44D3DC7338 +CAAA8D46A5EA05B8B1A868493F8B503393678AB75C5F7649332BEFC624F1693A +3E34ECDE22A60891F423950A854F3BB1F6B4959AB0EABFA8955D67F42734C8C6 +23F6FC71518A86FF0E1804E7CC09CAA830479D9CC01CD03EDE50DADEDB16FAE7 +9CA4ACEC7AAA5E704290A2F7527DEBA2CDC1444F027EC86C81367F54516C1654 +5E11FEE3F10FFCA2D74206F365D53655BD8FA76BAA8F8C78696D47591BCE88DC +B12AB8176EB03BC115F99B7D88C56F2A3400040637386FB86D093CFC38814F2A +F1616AD54EC908AB3AEB11C61E3AE380D99FEA37B1D594559A904278CF2425A6 +012729A40062BB0AB84A0FCB86A3F5D04561B93A77CF011F4DE3ECFF5E0B004B +933084F930F0AF3437D59447EEA731352339492A0685B45101CBFB5B8259E6A6 +3583582DFF0529E4AA5806AC2F6C9C448B0422C8125CF30259325E05B0A85EFF +C20FFAF525F73604DD2CEC421190B3A47875BAD36104DA1D80283DF395B6B87C +961E613CE164B60DC343D3AA6D7065149B412C3CC3FC1BFF415652F99F698B52 +31FE11816B341B2E2BEA3F7D7732B5C9E0C754027486D56B1D2268B981B81C30 +9FE2AC2F949990068F30403E3243CB7E4A448A4CB05CCC59B9C19CCACD03E428 +E423CEAC7B976B59ACEDB3FF08B094AC3E969C99AAF5EA974F3FF61C5C663B53 +8878F3885945B1A3299C219976D2842AA5DEBB5428E1A0864CF48BE957C7BE41 +66861F3B4BA7CBCEF06B80137F83E351D8CA3D5051BBB3D2E1EFCA8905061D14 +643A240BEA6AEFD788B00A807FBCCD4557E191A51D62D9729C98D1FC4BDB776C +781E824E0FB8B5900C41ACCE7831C4F6AB814BC7CB47ED8031DF80F517AA5E44 +45046B25AC5F3474135E429142E5BC33D924CBA166596FAF5D25E732C79C2AE5 +F3095A5D565B855E15A585FE57EC321B7D904BFB9EA2D724A085F298888EF252 +938DFA23FFCFF6A1A1AB9436CC63DA9B560B074BBFD39E552DBB8D174ECDF5A0 +FD92ECCD75EF488732377DBF97C7069851AC0EBFC3AC4226A534FDE26B47527B +0DA64B77BA16385223580B784D1E74DE433186809AFE97A7B51514E4F665D14C +D1968CDCFBD8E50ACE4D76442D68FF726EB83685DD0FC3B14DAFAAE06A894CB2 +D2CDA2C50FFBA709023472951955D39E7467E978DEA8371A935390407C01FD50 +C8B393DDF202F0BB76B7572FCAEE5FD588C6F01AAAD38C99B277C501DF5C25B8 +56F5BBEB4FD1BB379563093D54247A365CC66E04A09EEB1702FF946B2DA1247E +15D82AD0078AE820CB71AE2481C3B23EB86A5295CA58E00BC638EF541D4644A2 +748E7AD3212B1E297F583AC4EEDB93641F2B7C0817245326322B0AF2C2028EBD +6EEA236F8E774B379AA00D7BF9B9AA8D9978649FD1CC8DFD7C145F36E2CAE63D +157480ADE56A69DCA2BA077F8AFCBA252DF716D99442EE7286DC74CEF7F539E4 +11EBE1B2914351CF6D12FBD2658285129176D0566F2104CF95589AF2CEFB1DF7 +CBA05FDAD557F3279007CF49BB3783470BC974F47408BE287877ADDDC30DB1D1 +1ECF880973C5ABEC997DC089A91EC2781B77D4B1BB436C785B9EFDAD04FD6B17 +22B53DE2A271A527E2A4A98875A041F5E1DA7BBB96BB550DD32ADEB761B561C6 +71266E345FE58024F192ED4D918892CF596AA20791D196AF8034F94F8EC9AB76 +625595C86424B94BA9143E035ABB4405A6CD2240CA82A6F38ECFC0629C877482 +AC4DB88AFB832A4659B60CE2F2781BA482C8CD801D55C165055B404F1DC8D6F9 +7748CAD55829445A5985D4DA6F0B2BAD86A6435CBA6D314712C260C4DA58CD29 +BDE901ADAEA60C3AE82F9D52CEB3E29AFDC1E03B4CB387987BE958F3DC449A5C +ABA0F3E720378B1FDD5D4B6F8F96432380A83E0664AFD7C9D8F85A0034403E2F +8CBE7840B219589C7E7D7E20A12684F0D01239D1D41CEA6B48361C390BAED783 +DC6692FE202F3C7146F8C4B799A4ED5D6558DCF34793CFE86D7AAD1B27CDD541 +293E1DFE875F5F397349FFBA48015435855269CE3E82E320EDBF3DBD81243C85 +E7235E75A98EE2F7A8F5B2C90E2C213B13B9CB1776B8AF2D5F4753A812B2EFEA +E9BEB45F4B3CC3C35DB9526E3B2AE4C1AEA573970E588FFD894EEA7F4F29DF14 +61AC620D18337395F04E2F05D2CA8280BFFEC6F56E1862D19E891D753DE8114C +76CB8C88429A0706B68B2FB53D73D80DA80A88519174D0993427FC39CF7CC668 +F2FB56CFB3F26F9E2F35743AA8BC2530930EE7B330314BE7A4AB21882FC84522 +4AAF8A9B58AB8CA2E316B29EDAEE4A140FBBB591398A86BBB933AC07B0931CA2 +086842ED8B3CBA0EA117C5B0FEF0DC8D4293435CF92998916C53346435048556 +A36B15C19BE595C8055959299645BE7B56E3A3353F443E90E0A9540E8F5433B8 +FCA78FBD369DCFCA049E4EA27E890FE125DAB0AB6DEF649E23F34F2FA46BB1EB +CC1A041CF273F94DBAC2ABAD5E225DD6046B03CEDC518E8A13DA56E4AD6E36A4 +BB319081EC89978E4215940DD715795D07A61221705ADC30DD8D6343BB3427D4 +DB7B910D256F65B9BB9202C482B190C7FEB04EDBF80EF23EB3C17DB117B501BA +3CB89B34300BDB9A0B97ECAC87536EC94FE2D74B48CE2A14C0AB0F50F54E6D7A +88DBC59FF9D3C33D8AD4D3F1CD47F3A4E7E181500A4A96EE73A2954DF83F1D64 +9C1257D65FDCD057BFBFC9A18534B5BEE8902ACCA38D313F992FFAAB300FAE74 +5D7FE062C4C1AF0EA71A1F4C2D34313BE0F6DB1CA515A9F10DB27560D24B6D0A +6090E9099E59F59C0AD9FF714967B00A741B691A5D11B6042402C5584E487295 +F4DCE8FACE662E1FCAF88601F9C076AF879790F742B4B1C00A15642E3ECD4661 +995F0151413F513C28A365634A73596D5DFDC010D53C07AE9052A8F9E3C5C557 +D5434ECA23B77A3DAF392919FD782EAADDC4D121F91EF04666444661D94783BB +240252B7C302AD0D5DA1994246D768424B449A3D1B160210C0F3296D34D63290 +D40FC924B1956C2F21EAEFDBCD302C1DF97ADA7748EF8BE4D9C746706DA02399 +04FEB35B54B61AE0131EAFFF5F410E586948EED156937E836A5DEC3204DD8C8E +E556B8EDA52064864FB9776CC1E05E6181C549C10F09296924E6FD7BA07CA23E +783F7EFC19B869E903640009A37AB5A47A3F394FAD97F7EF0A1DBEF5C74BB515 +70016BE28E8FA12F9A10E15C1EE3B31E4CEFEDEB385FD9B5019A5BD57681F9B1 +C05AFD6B83A1FDEF4E4789245BED5F4CBCFC4838A89491FE93FBC5773A89737D +35588EF3CD0C9ECD89FFD27A7FF414A9B7CB89FAD15E692E509C65F3AF36A346 +6C8AEFF5AC7CC50262B24F75CFD7C44A977D9A34F89ABAB25A957B3657C76D31 +0F02B398202E98A8C65742FF5BB296BA192D3FA12B617A0F3EF5FA1502B4D519 +9D2301D2089CB47A16606CA16BED608743AEF37E9DD4BE4B6E90AAD8D12B27CD +DD26A6B8B67277DFCC46855EB23EE26492311CF9A8DC0C39241284284DEEA02F +4F358E3A47A2D5A7B349A22E46BFF61BADBE1C86E111B50E7297459F0F18FA3D +CE461031BAC0D1DA78AC387DE0EA454005598217978529D5089EACB059D99642 +5DF928E23215B6E5DAA35DAEC505AE112EB1F8E127898FBEE7C8A54EDD0C2ED8 +C75AE6DA5BDC0BB86086AB7E64DE8EF6A1495D81ED8DE1A59796769164CD417B +46C45C9A3686C7A8FCCAD6F7BEBBCE514655FFFA6228A8312A5BC50538DC2CCD +3E59DD99D6E4147DE8F3983B031C03D07125107E20604545A43BD7880D3423C3 +5E0261158F004423D18607C2BF0A39BCB65A685BCF2A391FBA8844C3ACC37067 +64B2803C5FDC03D43668E31489BA7004B06E7C4C874834586ECF7B00035DB428 +E4421E6A6651393FCA5057DD05AF837AC75AFA4106B354F3026710B5E101CE9D +830602A5D6704780155DE76792D9A3F2EAEE4734B3E1E87C85801C50834DFBC1 +DB501193CFA6763795F2387BE9218F33072ACF3DDEB08946119F3C9B71AB2F1F +D1FA74C1AABC8668A8770B120DC488F988F68F08FBF4DD6B44104673D927A39F +27E00683A10FA6322F30244431EC032DE80300F6E55414BAF8BE15C308F95A89 +E3665655592F74B91FD7F71B7638CA14E0E1C273FAD0B9F84BE5FCF3533DEE1C +9E8E5A654EC3ED9693A38BF2617C0367229D6FDA89B2288827B98A8917C65D11 +5F47124E457C20FAFABA69E18044169FEFEAF870ABEBBF08BCE5F3C7E1EF8970 +66B5B5AB84F3AC7EB3E55C9546DD38C096F7221AC728ABA58FE76FF090164587 +45C0C6C83A858307703AF33E31ECBD76350C9408454F90C04E9F106B659DD02D +5824BAC124F4547215C3A1CC3D38CCB90765731744736903F24271B9D8D3BE66 +5790DEA93EBF0C8E5EC7F70721C00205BAF4C7BB4B6637F5C4CB0F2858A7E1F8 +93F56B29E08B5CB9185433A3CD281F9AC60576DD1BC993C08D61111347350861 +783244234AB06A2B5F94134721164E3F09296B2CC51D09C1CF55211160A43837 +3210EFC0B9892BFFC4BA6F4B37F9084382E4C8329C564DC321A88A4AEEE84812 +2863DF387D3FD8F5752305598E941412CFC362BD40C1B3F30B42BE007C52DEF6 +0570FAEB855BD314989DA4590AD1D4A89BE78DAF819D776F9ECA616B88FFB866 +7A0E1F09D20849ACAA5D08DF3C31ACCCB086F55B75310685D4E3ACAED8B1A467 +706F72366FE39727DEDC6DBA504D24D9736EAE848E97C61131FABF70740BA88D +50125D6E12D3AF5644475779C0EF186EFC4A63FACA5D8A2A40BBC627FB743DF8 +6B2E912FE4499B9D5FB2A75DD37A900A01FAC066796BDBA13C9E32B86F5C272B +4B0480D4FFF49C5097C7590BEEB0224C91ABBCCCFF307BDEFA90E08446BBCA0D +3AE04D1B6B27D672617C8F9F88083E172CA368109A7C982B5B696F74FC9AA09F +E1C83A6ADF5A458985D9521953259835D0AE78E1E5F46F4A22F4CC5766EC5220 +CD8E11FB08D53D5F37AEB5E88E48D20BF8CC58E870A59B125059639581432D34 +99943D762D20ABC4D1D3DB1E97744753DF3B3C975952D6FBF22C0A2BE79551EB +3F63FB6F3F4D95BE06A9C776E7F1FDCE2318EBAF88D9F39CD438EFF576D905E6 +EB8984AFB3975CBF69A86E7D7585BC830EF5E23E069147106302D1EE530340F8 +347DB627B7A0BA0A446225E964EFE1727EF63CDF7D015C3874D92B642CA3A4C2 +BC20830B3475098718D29588F44504B7BBA9B3114A312EACFFE8087F1CAA7273 +7C85F63CB022B89433E2FD51F24F08F0026CC3718CFB2E80D116EE6F2F970918 +B40D5CD8FAFD1B3521C30FBA07E165F6EFF498A37E458C3C2748F8B76FB6DEC0 +E544DDE2A0EB0E8E13FE9F6BFE93419830E428C5D359470838FB7C28317488B4 +531ADE2C830507F77705AD6891DD9A9FB229D08EF1AD6320CBFD44AEDF48F270 +A5E44BC0FD3AAF090D3AC47AF8E60C24F39E1AA2187387CB1E2E95AFF46D6035 +AF7305F28FF3FF34232E62610F4A042BEA25E6DB4C13311FB2373405683C31EC +AF28B816DC2DE3A755FA83BA05B76F3A9FFC64402CB2B1FD8DDE4503FB0FAA6C +487A0E98B5FA21D2D0E0C08E95D4853C6B94FA64420B4156F604EC2904AF7517 +D37608E12E15E4A0694B6D156D042DCF390D2FBA766FEAC58202134C2D830D5B +6C73AA9ACCEACC970166FFDBCDE630296CD3B2EA3E358F2B664CE2C483157344 +22E31B86E17E87BE0D226E3CAC1E28FCA18E0BDDAAA4911B4B0CFC1611DE0D36 +9476DA0B14A81808160D1AF72B3596CD9D52F422E49ADB32631337F434445CCE +79AC26BEE9593567E6D3EF1C34F0EB319113EB747A222A9BF802502AB151E8D4 +F7D855C4722B69A5C273C55BEBE22C6EFDF368E7A8C96CF52633BFC5D8DFBFB8 +4D1869FCF68D5F12805505EF0AFD01C3363A2761E074C8F1B65CFCC31676E8CF +49DAADA1DC8A4083EDAA612B511D11EBB48C8AA68B46C9BE82F02111BCE83751 +4B898EF55DEB2B08C623F6BE1116532AD67AEFE0AC912B6B6A0CD5DF0AE34305 +3E0A6399F9583688D9A6CC489D3A78C6E91E231AB397870A35772B4B3E2A21B6 +323D8D4C0EA2E90AF4F1733AE639682987390BA69229A5B1250C707D7968C24E +FD0A41618549071E30C3B9D52726B19169E57944B1B308DCC548D33C37112BD7 +F40D3E924A44344EE55DABFDB38BD54527D69F0143F1531CAC341E2F6DD01E1C +2ADF7600DA63A36382CF208CC0A66BAE48C602264F24E531A15167B91BB7AF0E +1C26FFBD08B83BA63CB1AA44C10EFB8BA65C69B6E7D1F9E31E59FA199DE21D04 +214497337A255731A41A1007A9467588B8970A4DBA19A82B5AB3F1A625F41986 +F30D0FF266F1B01E6C7122CFE08644615006345390CDDC83DC092E21BCA8A10C +FC90B8BD2840189AED7E8454F2892A27A5F1EDAF3DCFBBD0B6B70E0D9382005A +453216284D819AE346D6625BBA0649CB036993C81BC8DE47DC0E7A842229D11E +CFCF6B6529AFB2982269BD9749D705DA9C50EEED1E170DCEA5FD8911DFACF3EC +B611B64A8E5F0E6C832442937EEC88C846E5D1FF75F727D46A06985171BB644F +CC176EF60C923F702D7DB188BE640A0576235B348185B1FE7BD4ADCD3672D721 +27D2C69A59DBB5DAE9B8D0D4FF08307C836C96966BC34AB4B86291E5128293C1 +BCEE06A9753BD16B7A46BD446B44A0D13DC6430C035812F0F7DA4AFD0D28F149 +CA679E12FD6B84FADDA55BEE84925D5C31AB08AFC3CB7405AAF3401BAABAA91E +DCF901F1C02D33C3067F2C70A7ACFC4C64D6028079AA8E034EF5A5827DA7BC27 +EFCCC8D9BC327FC1C7A28391DBC107055EB1E72AF7D7C5B2A0FF5FE8B87FC6EE +E8719B150520D46D80A7D04129A78B5D4352885EC2F0F00571842ED025FBCA12 +CECDD3C8872BE5A946C227D13DE562E04B14B0E8662A86E99FD207F7CC7C03A9 +10E7D4BCF20403E31BA872D19D919A2E62878D85A722A7FDF6C9647077560503 +80E15736CC7A15C036E0E393D40EB0869E04875142A7A785270E445ED15A0D31 +79682041D4E06BD186ADA99B1114D20BC49EAAB01165403C71FE0753F1DAF1BB +CCEEE569B7F35D05AD3A350914F18543F58B4217653FC1DC4E11B6B4F551F3C3 +EE7B4E155E96360ECCE1725A52E092247A7122D2CEB207C4515E161C6C7DF458 +4CDB8A7D169013D0B88DEA979C0FC29B0823BC382FE5A0A652ADC92C205B2BE1 +E56E7F8A6C2CA338DAB9207C4B34D6BFA688651F33A4AC17B9E4E233677ACC38 +819100D84A65658C0D534EFA1E4CD6711BF1FD9A3D8ECE96330E30D98D1DCDB6 +9ECB183FC19F36D5557E8CDE45A7DEA5F2DBB7B39FB12655900B54383E159B38 +BA15EE7BDE96EE0FCA3826ECED79205EF09EC5D22B45E9ADFD8BD63A930BD880 +A257596D32D565B22EA79873AFE995AE22D80CFBD17493103EC15203DD451D77 +9E5FF077766122DFA39C19A75F725249C5FD6F6172DAB38104C8D9EF17C59976 +2608766EEA72D15D016A14B61224D3B7E036BAD6DF9303C09D0303F938190A9D +896E2C51DA6F4BAB7E4125FDD6BD7F9E8F53A7B2BF06767D34539156BAD603B8 +0FC62ABC3AE2E2F87FC4A2A02493840EF44EEEE69B4CDBAF94E5F47469A788B2 +7DD2B0F561FEE6AF0B9A3A32B4398EF8385B45D44B093E507054F87483CC7A65 +54DE0F2D372E93AD7767460E35450ADAA100B66A55774D603E80E977F2CBDAFF +48D50247FCD4A9745C549BDEA2A3A484970AB11C148047C070A67766ADDAA645 +A0E69F0A798522A9DBC96C5A3DD2095ADE685AD822A19904F07BC9F124303FDD +2AB94120A04B8451843E2E17D77AB45AA4CC5EB54D656D04EB50408019EB5823 +B09E7E03A1FC293CDCFFE0AE30AE4F10A674FA76B89F1C77E0F1D1BE8D7D6340 +7D2B3B34817F51067AA93013B2807465E774D3684CBE3461EA7077CB7D3098ED +B90F319B4245D49EA0C0E941180CD5DD6E5C7EA09FCEA5BEABCBE65F172EB8CA +FD3ECA8939644924DDFF6563CDE2104B71321DB5621BE2BB04A47C9AE0B4C089 +1CDEA1F22ACA1AC6D51E2BFDE746AC5AAAF50E6EA8AF1A8511F3174561C72D77 +3E31FD25760D29E06BFC439EFD31742A1CA3D80286BEE71D52541FDF1A4562DA +086C6E8FCE2144148757F04199D70F1F5C815167086A7D2425ADF1B847669F22 +70D989E9FF76C9B8A78E83359924C0A0B71C0839D813FCF5AE63F122A4B29460 +354A69963C86F84B2C45271FD4A55D17EC3AAF29CC912F17BAA000B6AC6C1F8C +16F49AD587D291B5FAE5CFA1C14248CF27C26D7041C10BB062153AB19C533A7D +36DD9F4FAEC118D7F6BE81AC93E5DB9D518D363D2EC9CCA6680DE4CAA10E0853 +8AF5620B8126F7CED1C74902DBDD7C57FC66FFC8D9161D81B4D8ED83396CB0B6 +969124F5DEB10BB2CF08941FD99C12730F943A156ABD9474E00CF928EF98A85D +4A54CB66168C6353F8AA45E91E303EA35F9A2F9ED1934F01044E8AFF92F6FC5E +23234178CED72963406AB794EF3EF1CC77065B0C34B61ED9B8FB9E012B932B1E +C571D76EDAAC5F5D1824D33F3B1870ACE8511C58380CB1EC520251FCE68CF0CA +CA867B41EA77DC779335472A31CA940D5AF95226E6DB5CAD012718519743F5CC +953F4C54096155E5208D976A95F949ECD1F60CED24153087E43B5C9852705C63 +48A34256DE0CB89A7D3D8672975F67115106B253ED23F3F047F58B28FFB51C95 +FA8DC5EE05936CE3FA9DA0FCB262B1352559BA47A777CF7FE5203ED95715BB7C +CCAA97D93652BD828F28E0121EEE2636559DBEAC5C1232C9328E59D95F7860D4 +E41D8A0CBF0DACD52496D758AEBFBD49FC98786A65FFB437F8F771A68AC6ED14 +6ECBADA8180624157386803078C0ECB02BB7B932C39F6DC6E8AAC9332564795F +5230E53F828495C18360B7B3EC221247BEB7442A5EDF74227BAE75A00C20FAF8 +573E01A5877EB85DE496E36AB3794AD3515D2AC9E13A955FE19B1F3DEC1E4455 +D5ADC17D98EC3C2A9EB4551DD05C6397F9B929DA17A93CDA0960657C6F86118F +393755BFD5E968BE8D0C2ABA8CFABA4FF46921C939C3FBB3B32E00F768796DA9 +35B2042C3A83A5FC05ADBBC1A9867CC706272F852B26733ED874A8DE1548B87D +9D603FD4CF61EB969433D53A0066F12EC6B931383A848AB71DF468E6A1C34FDF +72321140796702414E04E0ABD984300B9F9D22F16E401892E6184A67B9434AD1 +23C83EDBE48F392B49251F6206E84CE8360F241D651A7F9B62B5DCB8F0DF22F0 +AD6ABD8F2B9E908367FEE467160E89680B9378F57D243DA04C1434FFED253524 +D0F308D1F311F33DCF829E3B5BA0F07C3EB16C2DB9CE9FAA111C0DC01AEEF1CD +FC2A587D9A041DCEEAECB101F1D597CD36FBF647C015B062DE5858F96DC10F74 +1021A06EB06F283820B5C0E62DE4671F72985444AE2C17AC2232E6E49B9BA13E +2DFAB0EB4B2B24EFF70A777E892F5B7B7C44153BA6C7AA19FC1315A857F1E564 +93990DDDC452691ACC8A681EB658AC0B7C823B7D3A8CB995B30CA3C44C352D0D +C4E253B3B694EBB74568E08479B87FDFC05F239297733C494FF8C3BB84558666 +316BB7B1969B523A58AB2FF029F806A05B72F6CE07083F9555D982058E10DA3D +ED21DA3E40F1E9CA9B6428984A7DFACBD366591AABB0DA6E17F401BF99E2829E +C89A71F2AFAD41C3EF856A40473E9C463FD6896C5D2148029F4FAC4C14C92E13 +A8FA2A50EF4C33EE9E1BD5C61083DE92CB45F426BC5A58CEAE29E823A8652F19 +CF88A03CAF9D697FBDBD8CBA47402061EDC788BF7A89521C86128CE4B4CD0D13 +4C7B36766649B401B0D10B686F04711890C1AC5997F2B2D2E0F3D2C8D7DBB266 +BBC730A2502FFB7E922F57CF8F52B3583873440D139B22FAF276FEB94F75D912 +EF6CFAF3C580F26DB6FBEFCF66A1D4016608E387F69B424D841E4A2DFC840FF4 +6497E03BDEE98DB3D397146532B82B54549CDC76D79B8A1CF1B492207AA39B5C +C68A13CBDC69BAFAB217AC5A76CF46F20E2903EBD232639EA413005776B1CDB6 +76EB3E52310A2D99A5CBCEC16209F5218D91DE873B767DF5A35819F00B3CDAD0 +548FBA1EA519D97B3D2A9F09330376D70E07C8FA0E38254EC50DD93473F86E99 +AC7021540D5CDF0AA97F7417B80E238C1AECC55286582FA4388218AB1FDFB4D2 +61B982926FD6CA5E1F3750C7DFCDD5715869092DBDE4DB0164E551567DC87E7B +003A41EAF47463A0F677BBD3ADCF4709E08ACA108BD076CE993068A6431ED97A +4181BEA89CCFD7BDBBFC892C0F4D15A75FE208DDFFFDB1544062658D9A587ED6 +E000F66A1F17080D187A6D8E6527B89E10551AF1F8FEA3AA87384AF4664BE52D +13FCA2C0081613F0CD796CEEB06D03C2BCC2E42C8C1B4D7B23DA0DFA7C84997D +5556977DF44F7224D82CA9DEFFA4A27569C6ACC8AD127D4A39AC6684040E6799 +1EFB7A0F795F7AB18C9702D352A5A9BA8D7FE7CA709DFAB6DB9155D2D1368A12 +90145D1809E05625C37C0D71E23D0561D47195232FAA5970265F588C82A6DA50 +26A66D7CA3ABABA6B937C469583B7B1237AE6DA66DBE7E91B4E80AC1FF8F6945 +4FF694AA6D9C3B25029FBDBE37453274D6BE1A7914C8EB57EFDA0C92559F3FEC +72F8E3CE874AFD49FB15BA8E522D8CFDE1C69A840BF0D7E45784642F6680C1BA +894BFD16D7DF40FBD111DB9DF3AACD08AA4EB01BE973C98F6F3AF457AE31C452 +0008841418CDBCC2C21339EE42E41ADB6C62ECDEA8BEF8A483402CD363454F66 +BBBE0C2DECDC90307A59EF912EC8E4CA6C14993FD67D33954F623BEDDBBFED3F +09C23C55596B72BD878BF68B557A25A25AFEE1A3C605DE39DCA0D586A081E263 +4FE2F07228ACC92DE650259A2DE812D1FA36527BECF5DE7AE586123DFFB29942 +0E931039D95774E0E961732ACCF261193350DC60116E8C469BC5482B51E717B0 +730A03A27EC79ECDD9306DEA21534D2804C745F45CE4B113F20D1CBF8458684A +3462795E7901BCFAD90E2812654EA2966C9064FA05DC20151EB8971CDB9291FE +CB6F8A18F05E30EB7BBCC169205D5FF17DC78FF18324EF97E647F64D73F0263A +69C2D2D49119E36D310749ACCEC23F2F435B967598FB71D4AE7465AE82F9C4BB +F5C980CBB9C08C9E867073726625B84569ACF09E2D4B7A62E3C824631BEFE27D +54C2D8E5B8511F987E96279EC67672ADAC8A55FD95346A89A5E98273E6805C84 +94BAB7BFD758AB05D898EB55947C52B6888D6B16FF3C4F4EBAB8D03BFF4773CE +85A1C9C1FFEA6736CD22E099515496C142D4841450C6493C39308469BB4CD63F +CADD4660AF12E09176818321D89D6250962D0ADD925E6360A12E4459F8A35FAE +4B2E60ACA34F95BC7D9F51EAEF17E005D85ACA444093DF4CB08976421B9D41C9 +0DD437FEF4E85C68CEEE5C0DBEB7BE7750075ADADD6F53A7D44C3E4457AAE62E +C917BD7DFC8E76A0520AC474570DDA5D3B816720DC627DFEE065BF1007129438 +875D9ABD264033847491D43C9A9711714AD90BC5FF3CB9D32D14C143991C090D +0E8430AD22ED7992451FDA1E5179FE72472FEB568C83138A47F0277C81857F8D +F44A93B07ABC2E874AF2E8ECECBDB9FE26164CE6A7A5DE4DF18648447751EA97 +AE6F927FE9090BD42FB13C65ADA216AB7D33C6BCC127F42503E6E90C17653751 +79D3FD5583E815AE0440DE02F41042D91FBAF80F7289E7E4F4959EE4E7C6222B +6D23CD8C79736E8325A50A4C9FE3A35CEE9BAF5F51C02932F8FEC830B38F0240 +B502334C036F4E1BA4367161E7AB3D4E36F4A2BC9C8B5D37F4527AB9BBBDB585 +F8A078 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSL10 +%!PS-AdobeFont-1.0: CMSL10 003.002 +%%Title: CMSL10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSL10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup +/UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSL10 def +/FontBBox {-62 -250 1123 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSL10.) readonly def +/FullName (CMSL10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 13 /fl put +dup 42 /asterisk put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 87 /W put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 +5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 +8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 +EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C +02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D +46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A +4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D +DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384 +7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0 +C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814 +25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5 +7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581 +299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8 +80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB +5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584 +8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894 +5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F +F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B +966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E +A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5 +9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4 +A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD +94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A +DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669 +E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929 +5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23 +8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5 +155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E +4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038 +44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D +8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0 +04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC +A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F +F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07 +111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344 +8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C +567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728 +C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214 +C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094 +51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01 +66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58 +9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6 +2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4 +4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7 +5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256 +0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9 +233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D +BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF +62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086 +B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88 +DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0 +C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA +CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC +38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D +FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24 +303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2 +8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1 +8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2 +C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53 +9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363 +4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29 +03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212 +93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8 +91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0 +FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27 +06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179 +95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954 +9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2 +7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972 +6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31 +5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262 +3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91 +CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1 +797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0 +DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112 +CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19 +8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51 +04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757 +78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE +730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F +021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79 +CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57 +90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD +97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0 +F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9 +4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394 +40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7 +3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B +362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7 +DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136 +7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233 +04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8 +DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B +C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049 +B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F +9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229 +3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE +D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2 +B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571 +74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A +44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5 +A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8 +3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1 +BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64 +01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4 +6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD +DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A +CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C +683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D +87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF +550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6 +2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB +17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB +3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E +F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F +B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B +1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514 +61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7 +124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2 +ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746 +0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246 +D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933 +F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2 +BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003 +75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A +8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3 +B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E +7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD +F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F +F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7 +322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E +523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017 +6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77 +66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633 +B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182 +5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1 +093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838 +B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72 +6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394 +EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF +A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966 +8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE +144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0 +7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F +172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9 +254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6 +5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71 +011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460 +B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC +0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E +3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB +E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E +993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E +0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9 +18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0 +ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F +CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228 +1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3 +A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A +6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B +BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20 +DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323 +1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761 +93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082 +E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62 +4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB +F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526 +4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1 +361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36 +95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C +AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0 +50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81 +88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932 +AB7916D44EC2210CB941B1422DEB13896DD78CB7B7F400EA5A6CD639D9CC828F +52311A11F2A84E566DE98826F1E28D55FB08ED70950205DE52C207CF14238446 +084FB4DCE04C781858BB4E0744C023EB0B563769751AF1D807EED20E4AFFDC46 +3C1510C782FD92902761F7557FEF701AA67B20A9B019C760B2BBA8A048BA3681 +35DB440925CABA05B8A13B2D30D14FA875D3E200A018C78BE2E930457BC33AD2 +FE3610314A268E9A30EB41F7C771758410E7D1179567B22CFEB5163F7CADBC40 +4D40860E83BD5DF2BAB4822B55B863D0793D3B60F0DDDB6DB993711C4C7C2F39 +31D02C7D8EE36FFF8FF2179534EE4F2DF388C96C9AF6978D929610EBAA615EE2 +FA163D8C52E5810E94456BE63570A6878E791DF4958E60C057FAE0FFA4C2B7F6 +192AF8786E14A6C6379C6E13A9C528A198B8EC8654AD69CCB5C209964A2B26E4 +E636DDD749286B80A5C22474B49FC5C093A8215D49B30ADA383485030AEE93AF +BABB827D996E563D1681528F54353D1245ED78D1915CFBB5595E3B9272ACF503 +8FEE0B65C4CD9D5783F948ECAB51BA25F77DFA440C1D8B636FF6A15E6BB0800B +AD6C7A22C4F0BF6C9A19F0E696B103D8150AAA337C303ABE10C87D87549D150C +2D9665F99AADD64CF8FB790966D2E63B22CBF1B1F1DBA95E3E233469085EC593 +0061E1CCC33F1B16293CC11C0B056473F6C8F7949142314CC2B8CA8582DAF280 +9A41AB9C8FEA6088FD3044FA72A6A754D4E46610BE64E308209D819B23894C90 +085143D0997EF4DAFC31A250BE0C3A45109E895B0612BC18513B71507D0CE5F5 +052E003166D1B15238ABF9942D4FEE2451DDC06CB4101F11D261B9318D0BF6E5 +C467A31637743F2DAA90E874E79C2E402EC53CFA9A5F4546BE39A838B5572D1D +1B5732C3B25713C60BA9DE651D74163A0F9B5710261E0D8980D1C8249CAD7F6E +FE7ECAC7BD98B3D195DACD921E686C510E89FE720C180F04C9BC350E6569D98F +A47AF940C5AAEFC1126AF1B85C57E2210E5354A5219CA51A3BBAE42C02B584AF +FF81BAC8673F4A37A22C8BF682898DCA81288AE3E8B243375A5BF77526B5AA60 +1549E16B2D8D9B5151D27055E5702D895FB238EF2A533E1A8C85E565F2D5D0EB +BD23CE36C8DAE8ACC54D6F30F68A4C513404B11D78A2F5F19836DEFCA67D2A21 +B75599819E576001830F03E7056E5E485F336EC4A4BE51FD2D46064A8D37F346 +A24BF0E1A977FF91DA4A22C604D1F6080524BB3B040FE0A359E15F6ACCF22CCF +FE1A903559F0DE0DC0E96EB5D0D11BFA464635982378D6A160599702C98D8F2A +E6E104974C94798F458F5E74A628723172377477D4E5E2694083BE189224B59D +A1DCE9671EB9E5DF532ADF8AC863018D7E8C602F9A6E698D3A353DF3F70CE34B +5193795E0B96A2F3B4D964924BF553FE384A914D58E5395E288FA82B71D64DF5 +CE4873425BBD32BC37404F494778872BE88203C113A12496B7C0A8331F58A592 +3376B02CE5CFCDE0E48ED0FBBA4C257CD7EE90C3EC862EF8175698926DE0B68E +462B317EC6A1148DBF9BBCCDA4BD4CB905C7BCCE2915E89FB30FD70DC83CE40B +A698FECF8278CEDD28309C5B1A639F987830B5ACAD2D66305FC2D866D0A74288 +A49CA23BA8857DF6F63DCF7C1A425C48A8D36D4D65CA427754C951776EEBD9D6 +6A18FAE4237B87CC59D2A1CD47BB12A877F00FE69838FB242978FA21ED6CA2AB +76492465AA22220F58A181D7A6FFEEDEBC8FBE966A2353247EC3D8330E9CB18C +EF1D61D9909CECDB6B943673C127AF7CDB6B249F9E202A4C9B110423B9F7C782 +66357A31DCAE814615A5A319182B42A3582872E8DE39FC9C6579C64AC8F443E4 +97840C614357A81758DA9F7FE5593160A2C5EA3BD9F7250F65E00A127A35D0F2 +91F02F2B7CB13D558D362004ED8B7126005C308E9CEE7796682A323B2AE86A30 +9E23684DF6FBE6BA8616419D6419B1830FED91B1933EC68B290840B300B10370 +B58EB5E097B674B5C3E7509174EAB21C7452FF9B52C2980CFFB1230B55348BE7 +4D9BD6B7AE5E1B1CF2F1C95BBEB0A6CED99260EBC0B344D036D1BCEA9FEDC85D +9EC1F2C9B6F2FE607E2D24F771C23E03C9BA75D8C8799094DF3C4E0304BBCF3F +25E0C964294228B1C7AAB6BC474449FD8E699B65D311A3CFBA80F6ABB9CE5926 +497FFF0CCA03755C4C20CDE7FF1B317E71412DD8E82B08AFEDA6E1CF6FE6DC8C +4E38B7416EB6373345C36E9CD7089B0E054A6594D8B0AB88AE4DAFD9BF6AB83E +32EE0923D01E66D56E0684FA96D3D3325492FE933F0E1D3A7C74BAB6AB15BB0A +3512EA91A63ADF032B278E3A13F71BA8DA4E0CA6112BBFC2D15237FFE47BBB49 +3EFCAA4139E445306633370700E381E1C001337F82009014A092E52B491061AB +7F8019D9C7CE4B358E5E8E9BD41BF9B50ED6C2D79FD73B716334E51297085657 +40B6428AD16333CC0108DEC3E57CF0E7EE528663707187A44DD55954AC5CEDF1 +B451688321E2E825A259FBB7D26DC8BFBADBAD045C0077E5BE68B818ECD13765 +8C636EDDC2B6433BCA62599EC4B2593D7BEF1355D549C5383ED246AB2C3E6FAE +5AC81CACB0C3A84895847407DAB75B5786B364B13FE0F246BBF6869BDB3117BD +B0B85BBF14F699A315DB6BE54552D0C9CD10BACAFD6A91280F4AE599F2BC79E7 +6FC2289A136E1A07D38376C2D3173EF851A097CC87101F638F27F7EDAB572B81 +6C02CE27E16F5A58A120D3F57CAA19090C95AEB29CAD81F7451C9D23BCE1F3F4 +90813DFEC50B2A82CB907AE154A161A711C039FC174E1E35BAFAAC8F23EE8542 +1B29DFD1272E1DF5FD019AF2A477264829B8A1CAD37BC8EFBE06105E74DEB850 +32D99CB23B7C73C4588DBD5082A81757A29661FD48C26E5F912C8FE91A8B4F34 +D824965E08E9F09F07566E0B150C472FFAE787983834A7DD0A107CDB74E88971 +C070FB0E9CAA2C89F38438F7A03FE86FDD1952A3297832BF47482ED86A1F7C3D +417A40F376FDAA0C5C2B4ABBBF81B7A7F98FC188DB9D3F24105A5C46F8E95190 +1A7D3FB0AE4239F449D511BD67956B1EC1F525FB18D59DB64E85130B5A0AACB8 +49F428C3E0C6D49F427F9D8F46C8215AFEB1DC8E7826FDC15743BBED087943A5 +03268D2111B030FB2AF950FB31DC9A586A9AE5885611A41D472847A793024FA6 +1231C822056A467806328FA7E5377ED793B35F63573F732F37E2CB77542F5202 +971DB462A9BC62FB026804113A5D5302D425F0F0010FF5FEC527D6B186DF1472 +C26CFB745BB58EDB9E4BB82ED93F79C14B02F024EB4A5B201150FE555974275A +A7EC7B3A43D51CC07E2B500C58CB1A3D3053E8EEEEDB175B34E07F8AA5870B92 +C2B83FD176DDD5759AEB0B2E830E322B79C1594DAB6F1A480947039960E7C336 +3806AD208BD519261EC06BCEBF9644C4E393C341AD01975BBA98EE091729FB6B +65525C29EF52AE7E192A157B14E9A966AE44F754BCB8921A41A254FE73004558 +C24C0104B05BB03F2D728036478234EDA8BFC50EB7AF9E3DE533FBCF4218ADE0 +CCBAEC68D1E58D193C5C8E44E09048ABB8A424BF47095C3026213A737D21811C +ED6D5FB33558AC6DE47E36F895AA3F28BB8D2D95F47760464FA43F651C8D1AF7 +8FDA203C85FF5E528DE450A45381F6E4EC602D60163FB6A37C5DCB71BBEFA92D +F92FCF38A84961D4ABC19697A787FA9821B2413A442358E1E7055B60958A8441 +141F65BEB4FCF018BB5A03AE7CA3DBCC895EFF8603A58D1F1E4A5738087D1F6F +658E8473D006D46182C7765010DED78D28FF964BC738EE4511836BA8E37F476E +CCD904515D8AF4F4D55EDE81CD9A7D0E4882A1B1230D3C3B2054ED59CDB47824 +6237B62DDAB266F6182FA0DE3C6A6CC8140FFC9CA0D1AFDE2D392F9ED900AE6D +D306E0269C8392A77262AB2BAB9622A78B581D6B5B25135A45C86E4FC44E1859 +8E7299ABFF56499E0D80036F1898C33D11E086D5109165D0A65763B58784E4DF +A19184B3CE380708B9F8064BE7A284BECC8A7E05A7E80EAFE929077887FC5485 +979A21EA5C3464B0245EA502125F58D12109F004B9E10EB64FC70AACDE12D286 +3866345A485C6014B1AFC036EF065ECABF161963CBE455FBF38FE747AF3D87D3 +9B879F6601C8EA1E53A47FE615E3D2449674B731FD77F7FF7558E353D85927B1 +24C2791F1D7BE9077673ED97E09E9CEF3F1CFEFFE483A4C85FC66942107B83C0 +08B334BA91782F11887BB695F8085949039303FC16E7BBE6702D86DC4AD3F016 +721E0727FB713005968432C736C922F28479C4B79D47BD822F9EF2C32B53258B +CC9F638CC7463F17C87D714EA9FE17CB12C9D52991498A99BBC00FEAA9459D3B +0C46C260B3C26A235674A22FABB22342B1B826D55F26D6FFC7C8B25BB1AC8D4F +C5DA87FA9725BC2CAE75C46BAAC2497A7B82AC0A5493BBBEFBC8F4C20454CE54 +047BCC7D34652F3A313241A2DFB5C0D5D2044FCB9BCD362B782ED0C0C1C5DD8D +644A84F13EFC98BD46B9D6D49BC1893C05E74A51F920B4CD231216524A833C18 +C0C67EA86C86F556F84D15E829275BF4727A1090822CB62FF416BAD2DF0C18C7 +045120FA62D43C8F1577E599E5C76CC674742E7C4BEFE404C8648DF0A9817FF8 +DB061845085EF12F5DEB46ECBD3FC434A4F28104D1C96147BF965C89C87598B9 +E08B55487D12A8BA75494EA42D647BC8B1BFEEA70115EA418B1D76BE05EDC032 +BE66EAF3E08361D0CB03AE9F87AE76FD60D22FD28B6355742159334EA6C06555 +377F938C762AF675FC18593FF5917EBF6F9BECCDC4F1E4B844E5632F8722B459 +F3F62EF90B2EBC752093FFAF98578152000F2EBFD23B8D811C811AEB1B7BB623 +692DAC3C3797214E2E50302CAE5A55A1A81ACAF8C2B93722857441653DFE9B5A +B22A0BCC5CCBA2193DE5EE973F47B09D9DDF8BFEA812308A500966411E4C9813 +C4128790573AE6E8BEEC11F442AC98EE1DF17600D80281A3DC33ACA9A92ED59C +AEDC5005BC9D0D4BDB75FC84F23977D5265BA8D5C40267A5FB948D5E914B2090 +A8CE7735EC55A70FFB7FC6BB6C40667D9DB75152746C5B1E04F44EC49EFC78E8 +7511FFE34892778437B27045839303B9BCEF1C6266C4FF22FC7C0719D5FECD7A +EA23D1ED55B7D774B8A235D811FAD3BEC77D0D0BF0889D3830D3000AC07E2BB0 +49568B90D869CC9F6E9C2A4803B410E33A464EC7048D27526E3EC5BA95949A3D +3FE96D48DB7243324A5181DF197181F193FEE8691C04E919E8884F77CD1AE088 +8D4777228CA4C9758D346DABF4BB658B44B66AB7D02B2FCF07A9A70683E8D03F +F421D37C558BABDF1389102B2E4427448CF9D3EC745F87C6B970C7AA2A0D0373 +AFD00324D47487B33E335ED4A850D4195FD05FEC6E864BA4E9C72CEDE18207E3 +597838606BEBB1150637FC79798BD2CD18F7FE5FA60F8FEFF89AE6B0FA468BB9 +C38089C05B49BA1CDBDDB40715BB20F659A8553D4FE63F2CD5A4C3C627CE252A +9058EEB29BA9F90E69727ACC6CB705F3A51D1D1B4A3A4D7CBC53FB9916CC1FFA +2DCCA0E1BB275480F173E9E565D5B3581F2CD148A2D7AC0F072B0DEDD92E2320 +0D48A2D1A21F00D8EC27B2840BFF210DCBFB89B0E7A6ACAD1FB9F73ACDE3037E +CDBB9B62A0B1CB500417F36A8A70B309281CC592B689114E06896536E79CA043 +213962462A6E79BA5AE61D82EEE6CDE9A7878F8AAF84588727538A70E346B80A +24A4C5EFE6342C38C335FE9B46A7F7DDFE091477F0C020B40D2352D7F50AB515 +795E60906ADA155CFEA213D90C11DCDE1C9A8DBAFF45E562C9929DFCD863FA47 +0937D34E73B01868A0F6772F7E0353026097B916A2D952A0289B7007E32C074F +CAA9B38B81EFC7B1313C5D00F88C5F068A02224AA46903836B20C5241C3266C7 +F18C157ECFC0EDF5C1A835DFB194C2C1112E02AF28F500FE4C680F39042E880E +FBB55CB05298E82E7EBA0A69CAED282D56098212F8B73801D42FE9505AAD177D +3422E7AD6EAE8E97512926073E2940F9C9AC2F48CE3B13497843AF201D6B6B64 +32238DC319F66C3E7E2118CAB1110F5DDF17B5A0ECCD97FFB1CEDA94FDDC8040 +52FD1C57F7E66BE37F1A33D440BF2F4AFBBCB38797E32D9ED00CB78D9FCDA9C3 +4B3E98B085C9BE53FDD4241324181A62493942C21F78C88A7D8D2345382517E4 +42F191649B1A74C5D7C2B43164666282BE2956CB777A838B879F044CA1D1CD78 +C2BDAB54A72511C29CB289655E41843869013840A68027DAF0C549CA3760B60C +B8E0819AC2B88F09F3C6D31EC3CBB473363EA397BDB78E912D724C9E3E419E73 +94EA9BF281C2BF8F00CA535B079C7DEBEB727E5E7D0E0204870F92D71DE705E1 +1846972B3D45EB1487A77C218AB7852D683730B5CA16F599E00DE83226D80516 +5176621A65E12D48284DD265D56FC330D9290066454370198D9770FE4E10DC7A +EFAD00E7717CAF5931D1BB8307D587B89B535EAEECD6DE63AFDD6D61B013202E +CBCF3337F7E982EA2F32BEF54F522F9F1867DD30B628861D15539359AEBDC060 +A756F4E6B5867259933D91215DC32B2CBCD08335A3A2F5C501AF422A961EB188 +76622B3ECCABCBF3276CCF83B07D20444DDCBCD728784649170B7CF1E13CAE2E +DB4423DB8A6AD7ACC12CC0EAA93B48F0A82C45E14D6DB4D88ECE6724E1D3512D +7570ECE04BB2DA767401E742205B4962677B0F04DA96EC4143917AA9C3C7F832 +0CE3E99FB8980962968C8D8C77E40EFB211029C725A872AB549C0E44CAB2D033 +08BCE7D54F951917881E289D411B7F9CF62E850D979CA9A9B4F1B993AEB8E40A +45A6F7E178DBC7DDEF689DCB3716668FE53809996A636B187B0E5136BFA883CE +F2FECF459920E58D453937FEE8DC4A562E1747531860F1DEDCFA8022B40ECC6E +0651E6E710337D5C340C1B5E7315B6C788A2D7B2A1A2E17AE2EC1F9A19137D85 +6B97EF446C16B33F2EB9B5E5BA62C9ACCE5A56880D3C052B40A5B4F6DF4BA7AF +63675AFE59D925C328E85956F5E873B3199D1587EB3786ED7C223AE9CC580377 +F9312B24BBC20C89AB5894D807D2ACA57AB522F65BF8C2ED5FA0394761BCE8A8 +EFD4DD67954EA00127D6DCDC1F34BCF10A05D699658DCC4BA2002623E9488AAE +037E2BCF2872BD4757BCC1EABB3AC5BD53997109155647E74606E36BC01B777E +B5DF4290548694898999E0D010E21B15A9F9952644DEE4BFE4BC9144302F8CA6 +0ECA6DB2CB809729B51AF8AA5EE0718CF5B888D26D968D0C6859C513009D06A6 +A752724C7DBDBC0E44A1519A4FBF3751D45674E1A48BBF77511F10916C0B64F7 +56A6397A6F87470433B5D6B4BCA543AC09BC6EBC2AAEE66366CF2D712AC54A9C +22C8EB38DD43A3A9259E65AFBB66BBE006C91BF3A33F5C96140EA1909664A52D +1DD8AC38E0874DD82C3C1DA26F174862691D6FF3A184ED4CBE325FF0009F3DF3 +58063B1B87DC2082BF928B86631C8AE7B6E5E6F740A22CDFDE990B85C8C95661 +46E1C9AF820165F23F79CE75BE8BEACE1A93BB99F090D77A5001DF044E8250AC +50D1132E13C5DA0E3AB87B8032DEBD4172AE3C1450773CDB95778C038029D7CC +B9617DF174352590FA1A5D59A6409FFEC99BF0262E2C9CA86E3FAB1D7B3E2B5C +ED9A12D619817A979A37E8A795E65A2C597A5FFB20639E02162CF3C89002C9ED +79357F3C287213C2331681A5A83B19562A7AE8C7F145ABCC8064F754348836E4 +A9149FF7D6C902698914027F26270BA0B900DCA5B54A7149946F450C3F099A0D +D7BA65F2A63F85B2F0AA00C1317B18A981C62FDA579BF9D4AFF8935EE4FDB17D +86566BE4FBB131807B983D7E435331853B0E37C1F081864BDF90E616CB6C6225 +7743C718EEA4427EA841C2B18CD64FE10A97C4F0F312270CD53B107047194E94 +5F68F13D1B7A709240DDE46B5CD930179CFA9FB55FCBFB6735E7424DD1DA7389 +87B3CC0556367AE585BEA4794B973B299BD3EE4D9FA80833042297973210041A +97D389C51C7715FE143F36F0600682A0B2D9FF2A32752F385AA6431DEEA4F4F7 +727834A01CB8FB8521238AAB2840E0C0B8D8E9EA78671AD5FDE58A29C3984917 +92674B76312846AA81ABCD41AE8FA2E606D014E0B809F1392E77286995D05DB0 +0B6707915FBA9CBD725428E6BAAA754DC45499A430CE931EA84A432C88003580 +42ADD71F3290FD1E099F3542C1C0058A88CBBF059DEA3DCC463CD567231CAFC5 +6C6918ABB202A048B710C2762E6BE6EABDE006A2557CF525831C42F6119FC97C +BC5362C9D26C535CC109345F27C1EFEFD7BB6C851B94FA8F041A7DF0647C4189 +2F36858579E3A8117C8D166DA1203E956BEF76B53A96229D17B9A0AC825D0D8C +985F5CD86C6BC4410FA3FD976128C2FB3C11D28C42BF48C412CBEF8DC43A3E82 +8ADE7AB8FEFBC97A7C56A87AD689899B3E5D425178BA486D128A441701812B2E +155D773C36EFC26E895B1E42C266C0A42FFB9843B1543D612AE11A9BB79F667C +BC1EB4B71F90EAA3F76E7A74E14C67A702DDFA7D47527DA34075E55513DF8CBE +9805495F6D9465C9E6C125578FF2FAD484A20D1236ACA83CB397F36758EF29E3 +008B29781C8AE84EF10271631A505802A815EA85DCF750C94CBC7078FECF2633 +461CB3786651E2D9A1D5843E346360BA511DA13FA80C38AAF32FC71F83760C17 +2BAD518FE7D7F3BC4D519D00242DBED65B9DBE9CE156DFF29A8BE5509A999044 +E7C773C7FCBC7DE8E39CCD8A2AD23847A5375C668426024577B92BAF13737982 +D0F4FEBFC0B737ABAABC60413DA58E484ACF4CFC5D000AA7F716D73CEAE4EF7D +D0583E039FC5581D45B20BC7E997BA580900C317209B3438693B81FE56A089E9 +2B45DA8FE45ED4B4495EB7B7DFAF908498EB1E083FFD92F6BBAA81152F2182FD +38633737BE1A8F1306C28BE15EB1A9C62E34695EBC19FBA95616C5EE9011C793 +44451F7EB64694A13BBACF00BD13CD1A53723145B924A7816B8BB903AF48269A +5A2C190F02C5796FC21DCCE0E5E8ABFEAED20AD3AF2986E166079D6E4E724B6D +295FD7A137DC0827C7E7BC12EB5E852EDB1D8196141F5DCF225D797EC491BD58 +B40F99AD789075C138C7111C0CD94916861E1635B28A56E7AB874EC147A9B520 +D2747FF57C462C505031BF269CC8B8944179F52BD89309B0EF555BEACE3EE882 +DA6D5B23900D951B52DBBF6D599A456E1C26A764881E4CF9B6441E614DBC6FF0 +22E41E54FDDC9261BD091C14DD2CEB08E465664D9641B90D514D890952625E89 +C8FE9D3683FC9555D345994554DDB1AA757554EB7213ACB5E23F2EC9E0B366CC +3918AB38BE0CF3142B017B1D6A82930035B8DBA75E4C82B3F05C471C16A39F58 +5BE508CD96725D68622D374B2D9DF5E20AB55211C688D82241AEC10C5F34524C +713F440298F0C972EE583D7DAD6DF8A4ECA94D74E386580FD6F17EF1C500407F +93B2289EA48CBECEFDEF0FE42468B8F995DCE0E0EBC3331030F9E643DEC6FA43 +B217D08818769349B66F543DD4D615BC7422811B515DBFE38C7BCDF873CCAA9B +229E05B247B5E1CDA8ECC2B2DD9EAFE1ECB46A9984720984ADE2F7CAC17F29F2 +AEC25F3569706327C9B1874AE5CA3D9EED82789A97E5E472D29B44AD4F067205 +57713A251B3E0189DC75DDA15AB7AB5C8BD70408AAEFB7C2D64567AFD28D2441 +C87B3A24F95BD0EFFDCD4AC40AA1654869FC996DFB4BF398A3BE1615B42A5BF3 +51CA13D3EB4DD8DF09E042254EA1014128C8F3A16DDCFB327D1EEAE7FBD60210 +52896DEAE39BA93CDF5EA4CF44B5606C894327FB1384F1631A13A40DB6C9A171 +FE440F2703849E0BA34FE0CA0D4C1FC9325096107F7E0DAE33972DD7EA56B64C +1143A671EFA91DA6164FAA378BB47717AFD582FBBFCC5079179A014B09BA5E4F +1921B31139230E21CD4F51B8ACF4B124FC627EFB24C59D537584D2E0176EDE3D +F28018366A9DC6D32A524ADC1AC95FECAE94F6BCFC34BD966830F89DDD183027 +81DEB19FB81642C2248BDAFE1E76AF63E2E5D7B877A35E0EFA8B31560281EF50 +C7E30E6D51DEC5815FF32C8D77E4998A9371B77A8E0011BC5E11491CFFC0B194 +82454CAE336A9D3B86CFA3A511BDBDF5A9FA1BB86BBCCAAC317B20ED0CF5B808 +8120204E23A07F6C0E13446D6FAE7C5F1A72C2A205FF0D805A63A7040CEED398 +22969E4915A3B9FDE22FF9B51DCD706F80D1D6B564EE47F6564EC8684BEE04DE +7A737A2AA16D61CFC9F1FC46679D110666B558C597C25808CCD4E792B357FAE2 +48E81C572A431F77168F45B478C45AE1F8D941972BCF70322EA91042A3F2C2CF +25F90D648F6DFF6BF44DDDCFE538195FF0509A630C430315D82C6B6AC0FE40C8 +D6326397CC9710B327289ABF1E7A9ADA9F96A0EF63BC555BD3EA6BBE56C8E8E0 +A5B3D5C2A3242F825F865C87A9958509460EBAB50FCBE4018297038650A0A988 +4503FEA808399FDBDDFBD0448A26AC3CC0738301BAC87757F68455764C04FB46 +DA8ED6DA80738F50D45D1D2BB96B2ED4427C8D115534C849AB959E0ACA334ADB +C1213FE6A99BD6647FD6EC8EC55B41D0FFFC677D913D48FAA4F2203F43458736 +71B4C678BE42D124DAA986A6E0BC1A634308AA35AA5B1BEA20AE164CD35F6343 +E2E21E4F339D471D227E25AAB6DE30F8715C8C1F62A66160833E07A78036AC10 +6B3F0B6E559E6049F6C65E25547E8270CB82864B0EC463621CCA7D76EEBC9361 +5F56E1E22C476241F9D804997C5353AD62715113DA0AC722B990527E4BF6D172 +4BBFA0A0AA0C5CA8008FC177A05F7908111D61865E8737DBDAF30E92164B39E6 +58583B4A0583EBA4203AB1532DF32BFA8A72A48FB4B585F9DD9ECF88622EEBFF +EDE453A1C00148A6B718D7CADE28C2DF77B7EA48C81491E94852D326738E92AE +29ED6ADD34C78190593E83404AD4BCCBB6CDFEAE9D4F177F71103206CA4B2D30 +E4DA7DCBF952616648EB555A445739868AA4A14A75B05DB425937450222F9BBF +64F7C19BE2D5DA4EF552F40503BD7F3EA50E8C2A162AA8A844F0922DE1E577D8 +770FAAB2541F2212D61622683CBF025160174F914B098283646B37DADE179CDD +50609510739EB25E11388DEE403D1B9CF2D5ED8F472AC9413069CDCBBBADFF24 +6BAA20942B7F8374DEE26ACD9411DBF4706C4B892A9DD5817FCE01C0494CC23C +047EDECA0BB875FD5244550DD25E62EF09299F74205A66978C912C5A53C6B4E8 +D08E5A1939955FD15E8E5100DC6EDED963DB99B422CE461EDECB09BAB62CF8C8 +0F1A5EA6C6CDF8CB80FD3C042CAF38404C1C316B9FFCF8B52E4683B33EA525B6 +7103B83C2B7B2538FF157C564876BE135246768C9FC7ED67EC6AFB708870AC09 +911E384A83B35E00B44A3A4BD1DD43153F2CFD11E72695CAC8AFD5F3803A9435 +51BFFC367448EB7FE9D193C58661E3954E42EB60F72CE9D30182144F78B9B127 +B7305C61B97638530B15715670AA4946FBDF19865FFB380C1CF5E814E27D8C27 +9112A309A85846044215AD34ABD5DBB9A6CD61A02507B4D6BFA05995BB8871EA +8E9695A147EE66A210F1E217A2E52B345BE95891AC31C6B3E95876DAC5891FAC +5CCF1A6C451D59491398614DF4166041B9C0CA71F52FCF46D85F080185E5020B +995458A641715B12387001934B33354349522715A6B6AF9510AB8E9DCE3890F1 +7310B5F8024E0B402B34B4F152BF4696D8A77614D3279ED6AAFFF6FB8DBF2052 +5AC7675F7EE907A6A9E24F69643A17D96284FB2ACAEF0327833B91E74562841B +9647D4E45365EB5F143C068B560BC54627D2B4AC3E0CD6574BEF0A6D8707FD89 +182B8613E9E0C43CD6CA97538CFD387DB8BCEA74F30A1234363407A511DC27B7 +5F32A3C8ACA1F86D2E9043880EE84275E68419E79D161A0013E0A109EA37BD68 +6B1E1AD4D5B50FFCEDE468DBB54D8CD564A02699FA10C65D87E5D8D28E391A5C +C3BC6AE2E18F71DAC5EA7F271B6C6832FDBF0D8D25104CF52BD93912398F6751 +04F081F02D01ADC4F8845493EB11C5EC45C3673C2A785F70E3E3C696200C54D0 +B35553C773F42057F10A7977FAF61697CE1D1E66AFC9ED7FC59C31ED12814343 +2DC663B506C6AAA7F416065EF6830C21739FAB9FBEF85236D165F8FDB3ECBFE7 +A15CFF27A4D6011C2C300A813C00524CE6C54EDC08920659EEBC434CF13294CE +6D31A137A49FAAFE7ACE6A13029A3F1258C1F00C296BF9838984F0AEC83848E1 +90616090EB1CB156E5416B06F57135FBA8513565364070A315EB58874FB05E18 +6EA1B28F4218F4BCEB6FD1308175FF6C279BA6E003E984B6701BB4E1FDB3524D +DE45A62C8B6CD6D076263BDC8E2DAF770ABC416980141AF61E93F104FF825EEE +38C47092D068E8A387CFC722271EEB54977366BAE5B59A28E2907B2FABF4BE0E +3B213D8BFB40EB63F6985405D1322FDB941168A14D5908847351C613DC9AB450 +F30F2FA3E7E587CF0BF5C212958396DB53559E255813B1A3230847383DE89757 +F8D5DB7B2A40ED6B17851CB4F16C6B92E36D56AA8879D35FA42741E56F8BB482 +5CDE18EC31720C3A4ED4E1D9B0DA78F33BC3766310EADBC2E62EEFA37E5B6F5D +548954B8BCF32391084B7624F90CDC81BA7C859B328FFD4CCB10037B74B6AA2E +3490B6792BF8AE8BD32484BE3BBC6CF4AA9520A5453DC57B84C0191593463399 +3E0DBA9A650C7C4E1EA4B89C92EE2969FC3DECFA3476857AB671A7C448E9E34A +ECA841CFFA739F5AFC35E6D79874BD3E2EA8D296AAE4CA5B6638B42B4532D73F +9A827505C2FF61C679FEDEDF42A89238EFF0ED6262CCCF1C83D7C853582CECD6 +ACAA428D727EB24C7D73BD180BB4656BB86C4FD851E0B4630BEC3A26E8E8AA35 +EF46DA4ED0DC5265BECEF32EC4276B232028C0F838AD7ED8302840D0028C8D09 +E6339EDC71B1296946153D0CF942074774A641BEC0EBA5F8E1339057F5894EDC +71C129E2A6FA176658ED2ACD7624CD0A1C097B1D2D473C2BC3B6AA57FE523C7F +8C8E440D35DC20742596B4CB3BDAFE616CB5E62AE65D31591D86404824AE822C +11A005FF2126019C235F46E97017EB522D9607EBE470A7829E7C26644E8FF329 +14D99E34D496CD5BF856DC28DFB0D444F1645B91A66BFFC2E8BE1E16FFF6C014 +531CF12A160AB4A04C60AA8128FD963C41BACCB964DA973BEF5E9A24135D97F3 +F5366C576598570701B017D6B926CC26EF1B5D542CE5E1F70F6D1E87503BA8B4 +03B6FF8B89FBC69CE1CE1D4350D9FBCB4F82911F1703EBA205FA9334D610AD4D +7A1CC4D1E6C1F4CEA2B44EACCFDAF8E03380D28601CC1D9348C97D8F9CE57EEA +E47FBBDD1380BE9DE4EDB9DAB33DE3902C0A21658FDECC414EC3B3A0EED730FC +C48AD1E41183A824E52F97BD1A2A2064A57465AD4C43BDE090AECFD9D6367BDB +12BBB6A243D46477EE41DFDFDB2B117932EC0D031D72A308FC31A15F849FCE51 +8DBC93E3E0CA7616450E70FD78608545568E5D6A48671984C2DDC3E1E1D9F1A9 +85D99FC7B17BDC29A205DDF584A84547DCA587C2A954DF22D576850847B52D68 +BA8030B7931FBAF0AB8D08A765E24DE5F0D8B221BD705E2003502134DEC27581 +18E341F63C4E112C22870E7BF587D2886C42E16F206900F3667B3D3383E1304F +DBD345CFB73716CA68ACA9791DF448074464F4B50CCEEC86E21E3C3A914AB2E2 +42336C063BB1236E0D4D48C957B4B6C9ECBFE9A96494FFD42DAEE4536A1FF654 +A9C7C34B296FD670C6C1C6BF3B6FA4C24EE3758C588A47D94E96FBDC5FF9BECD +A8BBCB4BA781008B6A5CC88493CBE3F6D74E67E5CD30BC3872077D886AAC9F9C +C070D36E84E752A2A636CF68F451FBC903450B9FD36792C1CF9E49CC98B4890A +B65231EAF73628ECC8B3C318901FF387326E2CC40A3218A79071ACF1A225CB0C +FC850EF019A47820388A26586AB2979166B97F1E167A64426E08C03B4EA97213 +61F08047F258694E32087F982EE546B9B5A5BA3E8CD96377A0B5690C5F0020A7 +96FB7829996F9D25D67EE802E05AA9A40290FAB56CE8F8D1447216BB83AE7B63 +B96722E3E9466215BF614F1D8AFC25E59C2EB9C2C7D13F5B9D00D18A998D618F +BE7ADB4129B33A71C35B11E2E9DE1961E623A39AA6276FF6E4ECC389360D6075 +554162F67D69D66D5FB21359E375E528E1E14D7CB385C3E8476F900207C7E8AA +9474F526899E8EC5027BE24D551E74C8C99B39160551F7B7BE2003F8D9343939 +49305B8D3522FEAB0D0C413FBDE5F6397618C5E7DA59ED5BC3FA4CD95CFC98CC +ACB69A0A7803ECEABDA3FB3589EAB7551D7E1E3D0DFA60D4F1FDCECCC2BD79FA +C806C2CCE4DF768D8454893403B10BB44A2D23629372B018D10F184614DC9C59 +F10DEC6D77AB55A710C807E7D555995673508F2228F427A37855549508A6F41F +880D9E983C9FFA5E0B1E8829525804536BCF213CB21E7D0A94F2C13E1599B2EB +135464B3B6CA16D1A3E5424CA492C77963C098F398B61CA9D713E0D86C7F223E +CA4C83F02025A632339487C7CB700CE2B648A84B8A96D405E93F686066EFE7F9 +3601B8A93E1E17B4EA42FE70D24C7E18CDA5CC7CE64B6B5C96888935DF566C84 +99AA5688329E1DAA4073F7EC4FFB0DDD5D3E430D2ED49E31D611F97984AB0D7E +7E151E6B18DCD4DCFF6F0952EDC070C71798CFE7F458A3533D7608C131265743 +B34354738E20F027AC853F5FE6BFBE06A9431C7BC6E86B9F74EA06843E71E749 +8471F0F91BF4C9EB8AEAFE5C7DA3B6317266AE50991E4F658CB22077273441AC +D8788536F218BEB4F32A95F802755A902AAF18FED775CB55BE2301E115BF3834 +DBD7D9A09E6031E8D366B7B1F5B2F6143406372388354E221E736BAF04DB167E +423AB83D3FB3416F3FAB96FCFFA567CE33E5C684EB6A5FAE0106EDE8E26D86C3 +916B4BFEFCBB239A592E0610F5B879CBC0CFFFC5C6F1C1D60DAB644ED9671882 +89787E9AAE0779271A5E608103DD84A19D22651FAD3F47E1C71A0A429B751F25 +405C770D8F1F014892446E7ABB968D5F30AB29EF6C00F45723E03C9C33FCEFE3 +778CCC1769123D59372C1260DA94D75D1FEA47B8860A6674522C415EAF1372E5 +A2F0299CC85619A331EB47B492AB04C22D02977D239697703ECB8FF91FCE19DB +33EECA83DA27D6C99679801EEB419803F8C78EA9AC14B7FA77B4334D09C56980 +BAAC8CEB54DB7363EC708ECDF3A858996BF50D9BC98E8825E3D0731387EA967F +B16E477EAEE8486B8B428C497004A16777B440C1BE6B194DAFE214C8512085F8 +45AFD6AD0202D937F11EF41C09B62A76C4729C4720916EAFA5CF0F2B536337B7 +38167F80AB0393FCF141E31CF356199858645544DF50965FBB2AD9738E22FB25 +7CF67EE01BD054345DF144731D396FC10418ADF0AB6D860358AC0ECD35576567 +F427153D2EAA47A94FA141D9A90D5B06AC547F873647CA5DB91FB5EFE02D764E +3F5A7D7B1B79A48B876B9B1131FF3B7E3DC14D3CA47C9914277CD8AFB4D8DFD8 +3FAA28D06D9C98CA4F72B6FA1A3DCF8B62559584932A9E7000EBA74B76304119 +1CEC18643B0C195D48E6AB0596FE33C56265F76F580BB4AEEF851BFE33A0386A +A986B0963ACFCE2954D72840F6C47A20A842F4030C7E7CB22453957F4510F279 +BD8378CEFF2CFCFC864A53299D02EE336E820566272A7FBD161969DFCBBCF3A1 +FADE251D3A1CE607A21CF3A07E1B40F4D303E8000C3AF67612D7D1040EBB4008 +4DCB1AC2E82E0F96795ED044FCEB28DAA619F2499A80430D74A3DF6FE928726B +0902342AE27753E36AF2CD68DA7A39641D76EAF425E6079D0B01DA2B0033B22D +9E28588F45E886A3BB1CD5DA3194F07670BABC5FFD5F430D3B5BB616A809ED06 +EA2F183D9D6A672A93E92A36CA61A235901597DE9812713A118A51107EBC1A25 +7A6CB70D73ED31318A7314A3C3D0C35C9BDB25155878F4AAB36ED33D8DC1294D +84EA63B78170786493CB3CA7EA7A3DF8844758229829AEADDD93203B38B2085B +81FE224939B203E64E400BC0D7EED4DC438E0942928E89DCF80F7C510A2B1F87 +97D83BCE1F0AE770D59E03498868A302E40147792168A9C07A60BF308F2F689B +5FB4E9BC9F7DBA4068C52A25CB31F180DECF0C5D80292D89B5F61FFC3846AE9C +F0D774B011044C43F547BC1E6B8A0D32E5B25D12803EE8F260D2F8A956A5B46F +6B795EC9E40D1458E7C2D416DE04456EF0624DFA0E8F4279C50B3DFEFA57E3B4 +7EED73A53F4635ACA9CA58899427418741803A65BEF5C12B58221E6C685C4B04 +04AA4391E8B16C9E7D044902F38929BAE586471ADD2C42F58BC7F126A3BE43F3 +736935703A2593B6909A9075582D57731EB5E73A8CD2568620A99017A021FD0D +0F346DBB9DFBEC179B3070968000112ACD77FBF93F9882CC6D171CF9F3CF19FC +F87F9312E9A30ED4245588A00DE6FC587EC478361CECB9FFCDF1A47A662DCADC +218BCDE6C92E1633F01A1C5665FE00F722A48AF55A373A4349C35D866BC4AF64 +429E0BF610943FFF401A8EB08A0E6674E171D994BB79E2FEAE8ADFFBC4A2FA4F +FB80E16038BB2D7EA409374AA194754B711868431B3ED8EAD9D7B14616AC5C98 +0F2FC106F7C6A78B838D788497F0BC2A7D4598B5F11380385E17D9786D5AEB00 +ED987B1047EE244A645F458C8785D372D90E71F89F73B97A4CA9B34535A29136 +9F97926F249DE89A572AB57A4E5D82C484CCDAA5DB645DAEE36231C7472F2BA5 +29F46FFE55CEC8F4770031564696B5DB9102C854E9EC60C5BCD6E1EBC8623DBF +891C89C4BFB53A6A2C7B9A7004A58D0A1B7E65C39361B88D41E392938F09B48D +7B82E3C8BF0129EC393F1F4A78B0FF832CA1A7A702C7FCB85A7FBFE1A9CA2403 +F0AEBBBDB6D490F6A65504B5A1F8CEEF14BF73D7BE2FFAA3665A7ADE79B73085 +D4AF6BE52B26E45F1368F929AE47A25AD81E36FFF85B048878BA7E500D22BDAF +3D3C08BC57D7B546F54060C1F42C5A13064DB85A3EE7ECFAE562B1D8F759555D + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSS10 +%!PS-AdobeFont-1.0: CMSS10 003.002 +%%Title: CMSS10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSS10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSS10 known{/CMSS10 findfont dup/UniqueID known{dup +/UniqueID get 5000803 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSS10 def +/FontBBox {-61 -250 999 759 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSS10.) readonly def +/FullName (CMSS10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 40 /parenleft put +dup 41 /parenright put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 +7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 +DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 +511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 +1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD +028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 +1319147A4A219ECB92D0D9F6228B51A97C295470093CA270C4488BB4EB864B48 +63941B9739638D2E6F3CC778582B46AEB4E466D89D1C211225274356A4BC90F3 +274C6AA56E200249B7D0949A3FD4185DCB3E5286910EFD7CA72D5D8E8052C96F +388D12094B87D3705CE64459558CF024667C0FE96CBB32B0BC9E51037D7BD62B +E4B05FF99384E71D78441A79B0B1DBA1CAE02434A9FAE46596FB86B873B1670D +AE0BAF516445A0DDC127F8FF3ADA0B10EC30A9CC1F7E9248828B5E8AB46C3FE4 +154B80A54128A08777F5F9B8C519C7E3B632B3476F007FA156E9F39FBE57638B +4214CD2BA79BA9DDA0F4C073AED814ABCCC2F7906C57A872C00E67FF03AC1200 +29DAB92376422FA21C67CA98BCEB8C431CA2D3EDDC16972F84BF6DB2F705BAB5 +CAB39C82D139FB1304B9E7BF1F6FF447596081D5690B1519E468D6BE49C329C5 +C9C809023EDEB9DCE4A6D52A8049E0CC134E8B41BFC6558CFCAD3D9D2773EA16 +131567AE6231B3235869767A1E7C1FA6C8D6FC1B276CBB1CAD14D376188C9682 +302836A9290E587D4225EB8BB1DBA2C4580A81FACFDA197174FE948CE757C575 +F23070FD84DE121955D7D9307BF986C5E739FFFB6CB76822C341FBD9FC2E3378 +AC9332B40C07D5B8745D74E30F1D719EAFAEDBF5FBC40D0546F69A66072D8A49 +28D2CC2E76B9B1EFD191E0BC7510C2C8761BD92EFCFDAC263342A01398A56D18 +121A591FF5CD4AD8B25699A7897E60BA940336BC17B9EC9F97C2464D031F958A +A3548D0C97C50C580B6EEFD0FE8330EE2BB0D2E7FD1DAE33448953544A4B1C5D +8EB57798D0ED4B22909FEA78ECDBC4D8A124DA05B9999242D68681017285A0C7 +69041C1F79442279FBE328733EA0A6694D68BA89739FDB9297BE0CF1808C07F7 +BBF6F1538DFE084EC8C0EC24D883F6CC08A51DFEA23EE920F44BA55FFF58E960 +C7BEE551FCD2D5814DE7E3F835608073C2CB80EC57100CFD484C837881674E92 +B217F4D11165427DACCC29C129005874C05CDE5FBB2D912368EA2B98C45AEDD8 +8A0D2493F60EF36809C8C6EBBC7856F6656E8D398BCB29DAACD4F7D4300A0B01 +161CEF51195D2C58DDFBCAFC1C03F49304ADF02789889826F1E20BCC14827565 +F2A45CA57DCC61B52E33638A0C6C5A59B145E82B82571DF1806EC40FC0E8634E +A34A791B1325571E19F3AC2EF6FE68A14B0ABEF7EBE0EDA3942E85E5AE967A14 +0C5AEBFF2A36DCA8866700CB7082D2ABE470864C44AEE1F6D180D511304C8674 +D02FAB12A7079ABF96E1CA3CDF9D75532123E87663B1D524265AEF63EB5C2169 +B67A651A101E1C7EDB008D3DB06DB1FC1A81B41B291D6C4A58FB57989FFCA434 +DA84B3914D1D80B17AA3A55A70BBC06C49DD5F7DDD03FEB0055088558FA192A5 +261477899857CF598DB740E82D035E84CF17B33048CFED2DCBEBC2B75CCAEBEA +B6C5AA1C6978FBB36ED98D9047028360ED430A0AA69AC85A8F83825EA649E1B2 +64B260197B06A24A1DD969CEEEE136FB046D713D0630B246BD41CA285F076038 +F7F8431913BB9A3E70311844D4C22AA446E3CA217A9DFD75A898997130269B29 +AD4AB7D9662856E677FB2DAED7078639CF31C6E6637C74DE2B5D0ACB88BD61F3 +CE3C5D56D3D4B3EC1ACB33EACBE05E53A133EBFE93CE6A0CBC8F24BDC5B31BBF +5B3E55D6B40B1CED389076014667E28BBBD60145A06BDECEE8011A2C6F06D091 +73767A8045CEF2A110B614149FEE783A2351FB2938A9F73CA406538EAD82ACC5 +A3DFD3DE00221E1B4EA977AF8C89661357FF7D2F1FCEAD6CFC9D6AD81F95100D +EA1F328249AD84AE849220E6593D45015B4D7C9527F3063E9F6DB6E572092A1F +1F460696227D5F0FA5A5484B1F0D8B4A35066451663BE448D924DBBFD388B6D6 +D7CFC87C9E75B7CF79A4C9207E29E0BAAAD7FDF529B860F7731EA978E335334C +13CB2F0A4250F5957B44CAA0674AE8356F586A24FD137103973B9A1FC31090C7 +C84DC5D380404BCDF3FE20C6F74FFDD8BD1DE845E99DC6FE09931F003834ECC8 +08C5D962070B6C44F901A787CCEF048A2C584A2285506B4D4E82B1BF130E2220 +B6C8B3240A4CBBCE16AD3676B23A50B75F82CD88D1B8F21D30A12716426112B3 +23DFDE5A348DC9DCCCE5BB5DB5433A5AC125DE1229FFAAE0D8319B2929986EEA +56A93BA1FBDBE617F30852A3DC8C712DF674169C6D656F75E252187A085B2788 +2467CC4DB08D48EE6A98C61BC55E6EFB1938FAA718802B7587B94C8F1477E9BB +DCF6E02B5E67FE3AD9D87C321CD9BC0CCD36B9C4BC601E6BD552EAB8E1C940CE +3A22F3C2501C3C939CB4F17CE97566F0A04602D2A22A05CECDF4A49CAFD6332D +5870E1F31AAA5F86867F71610CDB83E473B9D20BA00D8986D7148E0EED03865D +9622864B52B09D12E0C5FCDD023D29D5AB1CACFA92B6FC14FC84E95F407861D5 +2BEE3301AF399FD7ED04DFDE6679A345A282E7FC08D47E3FC8969D3B00ACD7B7 +F8769647D6D4F4106340EF739583374D023C2702C48FAC1B643B5897D2D7DBCB +73257712A0FDEEEB98A021D218CDDEBBA34687E23C4828D7F96D1ADDFAED7EA5 +B279322E6D55FB486AD8F3A8E7B2C67915564FE56F0C9277A06B29C47FB7D007 +11AFDDB3FC1B173B4E449CC6B198041CCA0624D81B4840FE5B63BE72157AC6E7 +03E5E95D2E2CE2E40BCE8044A8F2AA45F855484A891B9F0F8F70188AC66A8DEE +F4D656CBE216E6D9AC33BA8DD0685D480833E1226784469A221D9FA3CA600AC7 +5574B5226649A9C48CCB43339942FC9010F86BAA2D181AEB487A92A96BF2EDF1 +60F3B93FDFF4137A25A8AEC5ADF8613019CDB103DC4367EF3D8AEB4FED0E6BF7 +622AE0CD3CAA0321D26CA4280CFB60D08D9560AB8AA5698231171B881BE9A27F +BDCF3162134126212C523738D221AA05E31CEE73D9D40F73C450B6AE2C1E70D5 +C37162BDF55943069923A290A6C720042566E55A21CD81C460818883AB016C16 +8FCCD1255A66977DC1C110261D7642199D466DD3D2493A2D47694F842241C474 +1752B00DA03E69CD16A8A14BEB8A431A315D19A39BA978E46EB1189089FEF647 +F9DBB58AAE6B3FBD475E4DCAD241A051DD100ABE81D40ADF18A4C50F53BF749F +D6F7C8E02A5665B4AD18DDAE79096DD447F8BD32C68F9F97F05E0071D9E9AFEE +257B96D48ABD9920418E17C8F027E9E975E4A08DFB1988E7104CBBC1CAF356EA +7750AA7110BE116AF1BA69A94776E4356573B38472A8A1292C63701543B0F315 +611A0E0595B30424A1137478BA6F990AC7C3AB4DB69E75C222B617F373C521D4 +246E954E9857AF59D1E6C36412B643733CF5E1C90389EF0E5E0DA55D3AD12E97 +E7630C315F72A03CAF22E0ACE3AAAFC1D496CF4E5ABC49C2DD5E264BE7EB2698 +AFF36089B5DD2C53DB1C1FCFBE1E89D41A95DDD278CEB29DC85FD1DB8B83CAB1 +EB37C531E9BB8466ED6B8B60258D3C355626CDA43A32834DC89DFB11E5FC6D68 +0F78CFA871113DB81A1690250A6F842ADA15734CB6DF7C6ACED6D8D586BC4E1A +94EF3052FB0F8B9454390B882CBB6E135AF1F9C777AC362C2A758C3A98117120 +73C6E2FAFB580716D4B2889A4331CC658AAE996245685B973D9C184541385680 +AEC2956107DAB00230FB39BE98D3CA898D917E5F2088F26CBA4F8B5B115B6443 +8753331233B10852702FC26D9DD4C990C13CE4D0DCEA23D62A826A4B4FD16070 +5F3638C0A50A3373A33FCAA6F3644975AFD0560EE5F2D1CDF08820373468E4FE +6679A229D6955CFDF7ACAA92A87E6D8571AD18CF59F84F88A674B2946FF20A28 +B9798EAA22442415EB46B9498DDC0F4BA6ADD347AB43E9293CAABEAE80127378 +129D5DC69F6DFFBDAFA5D65580239E8EDF6833D0DE6DF75F0FD090A83CE0974B +AC947BABBD1B1C7194DDAEA37B0CAB477ABF9433FCE0243C8D308409427D1DCB +8EE4FC36C7E5CEE104904B520B3F6E677A5B92F694BDBC2C799991667E0EC14C +B95EAE7DE1854BF4542F05B4AF401CF67FC3E46EA5A0DC362F3CF177B1796DA6 +753AA803E724D1721DDD1BCB0C12CE0859E172D2A370C3697286F80D9E138AFD +A0EE016805F847BD30D11D8B891E54C77AB51A7CABF76BB14B06153C7F811FE4 +93FC4B7CF161051A458EDF767DF94F487DB939A2740B4242BFEE234F75084DDE +207E84533004B933D43C712F0C71DA4A00FFD6D721EBC93AFDC4200E3B8DE433 +3ED3E1DB799BAA27548ADC853AFF5D9D6BD92D644E3CF394789C99D9DC054A26 +7770AF5DC5BD6563929AE11BE341F036584DD573D3F43D9D975201EF77BEEF80 +D1EEDD1D4AD5D4D4DAF6D5B9D4C1736CB111D6FC74C236779C0ADA430323A825 +09EA8D0CB1772220AF28B93098BDB36913159208D1B2D7ED45808BF7B686419C +5C0E3DAB5BC9830FDF3B494D624EE8068BF6F5212BD69EF466B9A213047BD105 +B848F056DC544A8CE66C546B1A4DCB4BA29CF0EB4DCD9C2452F22172AFF33B29 +E97E12D8F0D312B03BD9E5377BF0C81D884F1E79DB66E8144F106DFD2579AD26 +C693C5B68F3AC46BF0D6281032D4D4BAEB2243151AB1AC0BDA2ACDDD4D590C90 +F29B335DF8F57DC593DCC081FB56924028E3161AC4865B49D1B0F63F5EE866D9 +7A71171C09B09A44B0E32F03494D9EA63F3C89F5E772BE25A6557F119299E989 +99BA041694ED805AA4F3BBDF00D88171C9D43A9085A287A36A1F0F9386F2A98A +96815CA51F06E1CDF20B757983C5FDF4003F5438232159F325C6335B734FD982 +1423BA77D0EFD044381AFBD0704E3DE95D23A70E2428E9AA355A9A8A25C6C74B +48488C14DEC93A766E112D74C83576ED355F17A809E8D3F9C65C4E3E14EF484F +4658DFB57597E2A4461D8044E95844391C1275D63F282B37888C842A5151937A +45007547263D70195ACC018A373D498B88C5A028BC66ED96A343EEE74D61EEB3 +D9472B6A549CEB8699F4B35154A0E2ED22867E4F9E4A76311EB2C9F9078FBA81 +838EA49C2966BA64C165434DA3093206B70186BE80600B891D9979F730FDC794 +5DD6D8B2090CC67A634B719F441092A10C447A86ADB78DAE45823ECED5FCEADA +ECA52E363D913D9EFC0ED98A5A1F823DDA3350EE27F09C14E4C7298CC0FB6200 +DEBC640C68C82D70AFB7A7BA668F1D7948686206884736CD03D9F6E6CF9702BF +E3C932CEF3CE07FBBFCEC0476EA6E8D5D4C5C6450C8FB236B89BB82D51886240 +5BA7462F50A88F69228DCBDF26B7250E90B3DF8E94ACA1CADD9EFB5C73EF9DD5 +46052314D445CC92512BA231F79A09A2F0D91976B160B8C9BA055DA4AAC1300D +491193EC66A6DE12BE01EEEDBC3A2291DA1F27AB76596A236B75E19FC5F1FB6A +DA1AD835CA08B6CD03B97B4CA1BFCBDD2500BB09F1A1B0438E4A759370EFA318 +F062BA9F3D352572CE232E6FBADDAA5363807D0DC5320B807FE5485C8CB09B6B +0BED9F5B1300FF370252DEBAC9DB25CE2EC494E8EEA45FC6604B3C104E81B287 +EDD49F3D7430EC9176A16B4FCEC5DF68DCC11ADF90BD5337E2E4B59BEFAC8298 +E5ED2C7FC5928635420FB1955251932713236DCE28012C86F63D12AF1DB634D0 +0B8CB8992B8723548177BD6822A808FF221A9E38B0DCCBC1F3430A9BAEDA89CD +ACEBBDD8CCA5E17F1CC37E35A01E058BAAAB6BE7124314DA19962BADB74EE73D +8FB13FF6AFB6FFF97926CA045B62B98BAA753AB0FC78B881D3FAFF9EE2FE918C +8EDBEF87637F1530E3E13AC090FF81F4136E08D5F3734327E643CDF621278741 +A17AEBC56E21217888A6C8B5ED4269731910E7E25693CFBDD4EB4A32698F2447 +4C45D73E810B627D8719E4E34D8FF378F9B68BFB149AC67B3B1E55F20D097FC1 +AF74D46F5A3923C63DFEBFCA210F6B257F5FF3F2AC34CE41C15C9977634E473C +2235295C05C3DF6B3009C7854BF11CC87471CBE085793AF9C5D05C5479B9E780 +14A5A6F3F6DDE5A18243DA15732CCF26ADE40C566DBC3C62B71D46DE87A12C6A +647CAC923254E2E74AF882DBD5C9E108A9160393C5CD12566AF7C824EFEAC56E +6F05B92C73A76824C5ED1735BCBAC61B98D509250C854CF1500C212F574D18D6 +4426B8510FE9785B814A70E75C9234D42483E736D0689D3561E8EE5650F33A36 +D50127589401D267BA6442E8616E2CDB1F6691D3FC4A2A377E5E154972E890DD +60CB463E9EA9A6EA61087DF452FA5646F69BE879337EAA0F5DA4438FF0365627 +4E3B16851C2F08E976FDA27AF451CCEFED00376FC3D6E0C160F0BC19544DE289 +BECEEF9A067FD71D54DA3A4F73F06E2F522BA07551296214DDA47B1BBB1212E0 +1100ACB5F65FD30C655A3402C83058F8ECFE48FA60B6A3DC86C4996414130194 +6676EC7F37454023AB53E9D9EE60249ABF6953E76DCE3123DD268BBD492412BE +65D7C3E5A5E483C381182A8F19B506F0AF6DCD55532B89852D1D96021B22E9DF +D9D072BD7DD4450577E658B433A84F92752B260AFA2EC4A118747CBFE36AB7D7 +6D5DD96A119AA1BDD0FDCBC3AFDAE5FF72713EB46759A06CD09B5CFABCDAB0E9 +85599506AC07AA525978AB157496163AAB387F079EC9FA1F9E91B9C2FBCDC9EC +7027D77016760539AC03F1C1DB242D28D6EE946C42DD2262D82ED48C3A839853 +BA977046F0EF373AFF884AC3112D2FB319421C3165DFA5710BFB9AB9595A10F4 +9D05704B9E22137CF27F4B2DA9CEF6D8801D5F792969B2E58FB539B8038DF440 +6DE20C0313A7BCD16F279290AD6859B0E657CC3041C7928CAE35B9D3A681F2A3 +2D40F8EDAF1127E754276556C95E1282514B6EB6E43FF4F0FAFF28C715E3F39A +374415B62C1F5F8E31E006D6ABC736057910A3729AC60360CEE1B2C8D9F77336 +39CAC45329A372205FD551B9E9EA5082411207473D9D90E76136AA70180172E6 +AF6EF3EF6B38B1906B904BE9BD5251EF067738840C28877659B649C6C4CA328F +1BEF8A9CEC2CB062702F58CC0B8D2D097FBC278F9FD894E10ACE1DEC4530CBF8 +E4E467B6DB9C596DF0C3D43E6AD70F30B733EEE692C2EBD68756D0C16E1F00B6 +AD011B5DA073A769B53C2DA2E7C9B7ADC6F551BF4DF4C39C66443692C3DC62CD +B1E094013F364D04BE2FBFCD1C7B2836180E9022E0434421FFA4317A50096684 +CF0B8740EF680F27F4A84AAF2AA92C64883BAF57BDC60C6467A8D4E09E6316FF +9BE73053045E5F3586DA3BD1298DC15D751913FB1E72EF80047F6B33591B97D3 +DFAD34EB224D64EF60F5B4ACC6EB42E1BE0CB2812FF2F3C264AD2E44F5EBA441 +670CA0A60E73176ACDC4E42E74F8F489C73481EB5D46A61FDA1C0FF9F8844DBD +99CECAFE2A72833E4522981FA13713AAFAF8F121E60FAA6F379B2C8874CFF23B +8FECE70654E5855E525A403700A96CF7F8111BF2B58386E29640D82F1DD86900 +E0E203F3ED554209CBDA2A61A5641D4B39D98C5C43D4575648D06BB82B6C4D4A +F043EC61B17C208CE8B4F43A7BCBBE588A3D13A183D79A47404223037FCFA4F1 +DD237344E589F161BB9BBF3FAD2E28749350DB9A74C09E894BBCA85B82E704E2 +99788B24642A7D0F0FD96601CF1AE4819EBECAB89824A0DC1C03BA4B546ED36E +DABC8D49CFAA53D2A9A5DD6B3431E364C99ED0323513476CDCEE49BC413E50BF +51EB93563DC03B62F84C5F96ED713F288D109C79179AEC41424822772032035A +40E84014F5BF40948F05E8562C9CA9DDD71F89021BE238E74781A92D64E5F9E5 +AD6C0D954C6686C714BF189E78EE47F1530CDB8376E52631A1A26E3021FAB977 +DBF01167266AD68A779C0180E034A90CB77B86747395BE885E484BE4028B4093 +8BE191D58D0BF85308C72E6384292A2E1CD06130A091F8AF9DC6C3E12B1E4BA2 +BB2C37AB4AAFC0CCC7964C06B9EC1C7E3BDCB6BA265288D9C8625EBA35BD2A49 +BC50472D7AE262237FF1EA8D9DEA3C0DBCF7C3B2DF5AFB1F31E46B48E096517A +0CEDD60F43DDB684BC6E4C3F6F3D70BD58AAB5052936EC4ED7140EDE795223D0 +4E3B95161D16B0402EB45FE97ADAFA0433FCAF55E22BD7E4AD2030D9DC86F55A +8D7EA00901EB1351EE8A0F1BFE75CE46DA4165D78043F8F0741D4D9DE0CCA00E +5F7D89A849AD0F0CEBBCB948613028CFC39617FE9184753372C375A9896F5F1C +7E24255FD49D2109CFF9ADD9A118CA47CF58975A9CD3A960A8A08A078B98A50E +4DE619C8B2D3E15938C879D785539445AC468AABD6A6576AF0E8ED368A9350EC +717B7D3BB55AF58941B47FF639CA2946028CDDFDB84FF0060D330DCDEDF13BE1 +FB1F743317C15C7A9F34408F5FF7CD9745217D9B809DACDDF7DAF9D821C06B37 +25738F0D20F4A86A079EDF71583A9640173B3EC529B98899601F0EBDFE45BEF0 + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTT10 +%!PS-AdobeFont-1.0: CMTT10 003.002 +%%Title: CMTT10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTT10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup +/UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTT10 def +/FontBBox {-4 -233 537 696 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT10.) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 36 /dollar put +dup 37 /percent put +dup 38 /ampersand put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 43 /plus put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 55 /seven put +dup 56 /eight put +dup 58 /colon put +dup 59 /semicolon put +dup 60 /less put +dup 61 /equal put +dup 62 /greater put +dup 63 /question put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 94 /asciicircum put +dup 95 /underscore put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /braceleft put +dup 124 /bar put +dup 125 /braceright put +dup 126 /asciitilde put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3 +7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260 +6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89 +14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0 +0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397 +3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4 +BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F +D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0 +FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB +556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F +8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E +F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB +B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673 +125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787 +A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77 +4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC +56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178 +E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F +15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385 +2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9 +05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390 +6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD +04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728 +C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4 +70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA +4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A +A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473 +62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364 +240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D +69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2 +ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84 +121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4 +0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB +D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A +0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157 +D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C +550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844 +CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A +9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4 +FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F +7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06 +E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6 +50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A +2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05 +9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2 +44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE +49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9 +385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091 +8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011 +6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C +EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0 +E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB +C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE +484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29 +4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0 +0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C +6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F +5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C +1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3 +909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8 +BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506 +CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0 +2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0 +CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08 +EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811 +0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6 +9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A +D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4 +21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0 +7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F +52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A +FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD +AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7 +F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429 +067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E +E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431 +C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937 +5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B +0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD +CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC +2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD +E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714 +56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957 +F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F +E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F +0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D +67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046 +EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7 +CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8 +9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5 +9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0 +C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861 +327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203 +F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC +60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD +A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4 +B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5 +0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F +1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1 +DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D +55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C +7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E +75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5 +E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149 +8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E +F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB +8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F +D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914 +54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0 +49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9 +CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0 +34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276 +1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA +6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A +DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4 +E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD +4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD +2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC +ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934 +3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE +97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C +FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570 +A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF +639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4 +D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615 +E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2 +1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E +A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3 +F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780 +5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5 +4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50 +664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844 +4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8 +35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04 +1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6 +01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A +5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82 +2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0 +DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C +BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507 +39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1 +C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665 +99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481 +7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE +D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8 +6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184 +5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38 +6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B +F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81 +E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9 +39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81 +7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5 +ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77 +6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882 +2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230 +1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41 +06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE +5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A +288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E +7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F +759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF +E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E +03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A +6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859 +314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266 +74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D +906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36 +673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E +A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901 +931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B +CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390 +E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1 +4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136 +2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE +F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B +E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE +E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE +251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71 +7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6 +46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C +E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33 +DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A27D3813 +F871C07E725D4518013D9A84CEC96782541E5580E33C2EBCDB18F08EB4655A46 +507A8526DB26C854928B81FD502B0CCE4A68943C12078F57C10F4E85FBEE1025 +46D925B8B3B447D4920410FEEB9844FABE985F9228FDD9F58392F2F3BD650E49 +2E3AD5A14984874DF4572816931885CE8A448EC95BBF40DDF4F85653AD90A88C +C4A879C0C7596E61997B972E8A55E57B17F802C738E5C7A8FBF6424F8B131B23 +CEE3EA3747DB066246C250EAD335A76FA166ABF75120CECB59076AB31A51F176 +57176CBE8C802A97B0542A5CFD6D5E6D7EC848B923012E45D9F065BFFA0D03E6 +788B68BA4DE51DA37994948F859D41C28BA939C3A82BFDB44DA585AE80B8CD7B +A6EEA79B70BFB4864E06F06A9751BD2D2A209D150D7135E0A25D67263EDD2A7C +C63B5B76ADB05A2BF747D5699036377F1A645372E5CF6497D8D4465492780B56 +0D7A64F4AACF00DD611A0D4AA2A1B4ABBCE41B0BF87A7351F26E125166E2E07E +2E64639C4DC21B996EB744C784A145F80D07676331178ECAA4967195803AE02D +1A6A04B38D721323251A1B1F656498F5FF255E4F1632DEE1A8C2B197CD7BD5FE +3819B1998273EA5EF8EE032E0638F6DCE419852021D098A19CBA9A2B675BEDDA +B6513BFA1F239FFC92CEC9ECC612072E87FBEF1ABEDF6804E605AC8979E970E1 +3EB524894E3949BF090C1BB477C45FC0054DFB6B6816C5B0312BB9FA09EA87A0 +9A18B9B5E0DA687BAB199267EC6668094D1FA853632DE7124CEAB78BC994D6BF +FD8BB4B920B89A68DC0D60BB73AFED84D38925B4E8C4D4E239080FB47F44979B +7660A9C57F1CBCE1AD69AE3E7782796EE69BC910251DF8406ACF78CDED5224AA +B13F1E17BB454BD4B5AAAF0143570E5FB2236DD096A2607B8D24EE238110486A +0759B4AA276E3B5AE6BCCD2299EF7EC5C0ADB9E3A838DF0A0541FC56F62684E2 +F165BDE1EEC719A7DD44D7251B0D28C63304BA3758C76B1FACD54A4E73C9B32E +A49366083906EF8927B6463215012B3927CB643C0292688601AF2348D62292CD +5E20110FDD05739D7EC6A3BD1B166DCC421ABA7901FB926025EF88A54B0E695C +38E9C894A2EF7F33E5D0304268849FC3D2F972148ED6C631EA375D67DEA1F8C3 +C44173E5FAD943C81B72D818D7202AB20B77EA0299D4FF7FBCFCD7BDB0C9655A +B02646E5BA32F6A7033BEA306BE69EDF532347B24DC7E6BA226C6005EBF841E4 +16430F8B4405B2ED05003F10080C12CC74EB07708FDBADB821BFE0DE6C8A3278 +C2349EB88B977D15639695B35C35235E00862E70D7E9BF6632E0F2E342FCEE2F +16880A993EA9BF5FE7C0220D844C5920A2C334ED030FE2D062F8549508589F66 +66B2E4F66E249A01BE6CC56E73AB21117213B7502DAE7A2CDC2D8788C24F8F40 +74B96C17464510BE4F2543E536BB32E943522E9113DFBB56096A34BCF507E7A1 +B17451E6AF90ECD2A3E0234FF01F93BF0BF1300FAC48AFAA064419428256019A +A55C94130C7A4AF9ED17AF615FFC9C10517B0D210C464C8C0E2B344B31D33886 +5264577F17CD7137CCED2612E1B01DBC93A98CDCC6C83A858307703AE11DF924 +BABC5FDE240C80CB0B4DE1672AD86C9BC4773E95182C70A6E809D336B71E25E5 +17C60BC4C8182FC222EFE5419EEAAB8CB1C04750631F7B4846D75651244286A3 +3F87AC81C3DE5937D4545937DF166D02B0505EEF1F744A2A955DBA5AE1FD8453 +8E3AC7E38B333C7A741A58472B543C870CD2885E812FC88DC0E3A56D3340144C +B6EF013F04707315145E4B41142BB00A2BE5F6D17EDD30DFCBEA3F099010C431 +E2D5BD261DCE594B5E0FF7F1E836E88494B7489BABC9A230A7324E122F40DA62 +08922179B7EDF55176E4D11F985E6F3CE8B6695BBCCFF8AD96CCE92C0CE3E8D9 +C27F103747346DE482B3A922A19BFC5E18C3556B48BF53EDCE941744C43EF096 +E36866CF42D145087DE6A41F205D04A802E2E26EBA56BE4BE182B460E8A7DF98 +8C160EEF6FFA866EE54AA2541B1595F5B1D0104BCB313E5C886A0519311E2413 +CC40CF96EF3E05CCAF796A3FD36BEE034878238A40C77C6205904A9ABC8CCC9C +7E1AA1FEAE4732BE0FCB9BFF9044486A232D39745885AF66470F281F7CD076F3 +B11CEB70BC1215D944D65357D0967F83E13EBBABB3576B89AB755A14A4A8D292 +5FAE31DDBE3999E4EAE54E5892C6087C4B6436DEE581FAFD1F33A8DB8000B5F0 +F644C655674DEF2BAB3105EA12B5550286FC001F5BA1A63F46E30A2EE663C24C +F5390CF05D72727D7AF09433ED15A112E199447E0C516C8D2E535D38F5EFF96C +763F51F7A8656D90DA6AD7199EC102AFC5D65DFC505E51E7EEA199D39C2CDF80 +B2CE3E35B688B79D566F1737C588D9CBBAD02F9782C7DB3439DD85BEAD21C70C +5628EA55B38F9D2BEFA897974E09C2413E9C51A2400BB2364D650BF71637E7E2 +99DF9E4BC127FB7367DD9F74FEC16E339B19FB70A20A4A2E4874E110880294CA +C90712CF08AD98C8532E3B730962F63C8F8D3DA209A0E23FA25DD02421B4D4B1 +DFAF5D3548FE36B0A1637ADE5CCD1672FBD40A3D1CDBB9499B4C660A27F619AB +C06F37FD8EBE08C838060031735E43E74F649456956B785270C84C96EFA7C5FE +2404D77480F5FEE892AF6534497C7AF401A5C9AD95B4B4D186076AB0A32315E4 +E6D7185675405E6E483571A3CBA6EF76403567F282B2AA8FFE99D988D612DEBF +7ABD96797B6404CB5CD95D39464213DF90944C3ED33778F3EE4FCBB1A5F961E7 +9714553A81472BFF2052561C22720C0C8493D1B2FE75019255AA8014F437FFBF +380BD498D02D7FA6904B4BC147C8D75C4863DCEAD5EA7E6FF41C609583BB7E99 +03ECAE65264FD63E13191FBC5B26E034651B737000E6B894C373B58DF4002F04 +E2F7ED898A9B029B671A19934263D92A0B8E3F7594FC90F62F937842E614689A +238062D2BFB7C44482AF7C1556760125086F34A76C83B27717F322D190D30308 +EBD2A7BAC65B74105193942208DD78056DD569B2BA9FD4066A78DFB0316C1DDF +C1B960A6AE6BFD9F7136870100916A9F8598C1647E1A9F86A26A83111433584C +D0F4804BA5C3754AA9C93A9054C4591D38CC05AD1433EE5318458AEBD77ACA20 +5B1FC97F62B5A90E3B75C7A15FBF4EA4B0A8D1134E117D38C82781A68A3EE04B +80DB2BE38196EFB1CFD47A5DC9874A15F21D156A23DAF2C7D31147D76599F8FD +4A575532AD29F7203964BE4C153AC914516D33A54F97B9BA83562DB89D40DBF3 +4AA7BE547EEF84D1917B9620FCE9E5FC8771BA045C6BA72DC3CEA88BC85FCE2C +BD04E17AE45A9D871930CC49F4F93447F43312888794162962428B915A6DF5EE +0758D1D24AEB9792A9AED3489EA635140874BA43FD7FCD56103FECC4F4306C09 +8F06A031F5C639184AFB5C97A5ED69D6A974D6BA2144B4ADCE8F1285ECE7AA41 +BE46EB5473C5E6327ED45E1BD5D2721856E2751E85112A44A04F54556B41DBBC +224A1C1C434FC53BFE371231544C64E64BEF27AC008BD468B51708C46ADA959D +68C73A16515F09230DEAA0408245960D54D12C1E3AA868E5DDD8ABCAC5363927 +4C6EBFAE8F7B31C89BB7E1196C4C9FC9AF846006E838F7245B134766D83698D0 +85E95121BFAF5669E54B918FB792E8F7EAD1FD1EFAEB2AC98A1144F4A2081500 +2FE1E7CD3E1FFF00BD79CCEBC18EB0552EA5776E6A52E1AA30E3CA1FCBEF057D +EFE38381A5E9A53B3ED386008C162188E393E81EEFCE3D59300CB1E5845150C9 +35D129A662146D504FC1DC23DB26E958D628DD312A2682654356C3F3221269FA +A8725F1D52B5CFD7ED9FCBD8F4D2CF53CD7FF2BF435E75732BD9868155B6A9FD +4511BEB18944423CAF5B2FE4EE6AB1CCE21927537FF3ACFE2D3344A471FEFB32 +D3E944E0DF6115BA76E5FD1C6141FE96C397B59F7D3270A605727DCAF2BC0D4A +AE8D84FDEA284931A6DD9AFF9CA3AF16D21187533B45F77515F6FA432FCF53C7 +DCFE593148D2286D448A5922B774F0200EE756E982B3B4F8050D93E031488398 +8BF46569A6B233A0B2AC6DF78385C9A649DE07BE3CCF13DF7DDFE5F163D523AE +46077B52147BC1C7BA80BA33607004F0B289CAB47DCADC7466F743973A546CEC +939AB3A938BB362C529C4F71232FB9341EFF9A7CDDFB740BEB573F009E19E9AB +79AFECE39A6D28F0A70937175399A045C2C1AB3DCA0ECB1F7167D07440F53910 +B8123E6C1E5EF4F5A1FDDF00D1AADBBA2182D35624A8170D346E40B117781931 +C79988553558F7696EFF44C0A4FBE8058D7A94F0E7C8C8B584E6790D59CDAEBA +5B634EBB57DEF241E9823194818E6DE24985F2AE341E878C9665827155CC918D +7C3CF4E508303382907BAE5DBFF39C75A49103AC5E604FF20C2649C30A70BC1A +63B54D38C541D76E7616B6132C94D9366ABECB27D33CEE252FD573BE533721BB +4311CB5557376E17EC4952692396BA291A5E593396441707B48037A84F515C13 +C58D372418B8DA762B731A8B15BA74837F2A6A1A1446289B247E7A6F05081B32 +E928FA2A972826D39C4A2CBB68274054BD284EC26411D07CE7BC2D06D64E2690 +C724C07CD5BC7F2DE4859F83F548DC0CCA56B9FE4E1DDC62E4B943B9F395508F +F98E980279D2E7C13DE18A22A76CFF59814F2FFCE93978552A0F4E01D78B3C01 +B45A9CF8FDEB42A166A0E7678201526CF4773259EAED7B4099865DB5AB295C98 +FCBB1521D8624B87EE1CAC6B9B460E76D4B4E4D0A4BD69CA06A02D9AE0DC14D5 +55C47B7FA78A0BC299545C89FCD1A5449D45FAC62E38A42319DC318AC386563E +4CFA1E3E137ABEF3EA7D9DCBC7BCE914902EC7D7B1AE6C9E19E739EBF1BCBDB9 +983829702832E22044F9A5B475718374F1A60FA48508D815F6810008C1299759 +EC776C0E70ACE3F719FE1E9DD554CABCE3937F54F38D5CC3C1392070A07964F4 +26B7CB30915F7586B31C04BAA3CA5EF956DA352C6A8A2A1356924727A8EB829A +48C9A8894D29C2C196C0B731B6724BBBD84FBB94AC9B9DC80C435C5387D625AB +6538076BECB3C21D19FAB3551075687E1C43CDD9BE49CC506D3423B5C2A6754D +87CA10D3686A4FCA91AE60466045A328F996EDDD3918E2F56C029D1992A2A1A2 +78B2E95B99C822822F3630378ABECE2C2318010BDD2A492E112602BA2E092693 +54DBFD0367AF9552B11E043BB544644B079ACEA1BA6123CAB40F9E7B2ABF6969 +A8BFED3FA9C3CD76CE6DA595C63956DD27A87F256A7801330F603F21DC8195DE +04BE9EA43F308B2888F5EC1D51DD43C6B44363FD277DB689FA2FED1D4B587210 +3F2B7305713987C9FB5B6992F23646F5AA9DFC71C0B3B411CBF369315255C1DC +BE9357E76156A356902148517DC6EEE64AABAFBF106ECF4E55485756C801AD0E +81961033CFA0B2DE0B96B88B38DB562AC046F65F058682E139C0F882CD795096 +9557336AC81FB537E37CDBBEC64975FF3BFA899236778283770D540257D3524F +8B5ABC38B9DD4A240502ED8AF2A7496295A793CA1D6CBA7C2C50E60880B73E96 +84E0E5C85B07EDA8DD48A8249D6EE25273D3510333287C71DD0ED8032EE04848 +0410C1E0785B071430F4053AEB3042D5B9C3E34E4B854D42EE5044DE5941DFE1 +AB6DE585C02B5FEC52F0C565E6A5635C377AA57607723A9D246639CF06A2F4EC +90CEE93C2EA2C419F3AD9CAFEAA6B2ED3F2D4F9F6330FAC9972903786AC09B7B +DD51932A1378BED9BD5434078442B9C13CF156FCB4060CF81F98D5EB8011DDBC +049806FAEC29F3841CF0BAD050713FF0CA75F4058F86C388E179710300A21312 +72915D0C9DAE32B1D6C092A9E5990178E8A11C6A2B525E0D9E006C135D1BF185 +FC7A58576F23CDE582A0512E54798B634B2E5A06F4A107D2685EC1578583515D +19230589279FB9BA66E6DFE827387C5FB1E491CE19739A4532C5CBE869174A29 +F1E27164210F9D924B835E9CFD9356643C3DFEFDD21D733DEAADE25DDF15EF88 +17A9360BB2281613734FF66126A90DB9AE008F6DAFAF9DCA23A882A38A0F478A +E6465F8391002417637A87303A9168632C68A031EE4DEAB32D7E6FCA721FA484 +3D01D2877B2CE55A8F3665388FD2791200FE69D692EE6C266DCD65014A9BB1E9 +27C1F5E6857D5923F56D3AA916E50802FFBD561FB9894C1A75022818A6CD8EC7 +06DA976DD2609CF7023B0D2258311F321E064D956CB8D55C1A4CEE12254DD6EC +68680A52FCD777EF99456BA60807741E0845C47E4F8A93E11F4CDBA611DC4B50 +3B5F83C5475663090CF0450893E076132C6D25147C260D4D731A03C715BB80DF +727864AEA432A5C95E688313C1C62C95E154E00E5F00713D2B27E2F64F7200F2 +C52B3C95376242DB2233B50B988214FD47A88F3C4F15001EBBF541BE75CDC0E0 +D4087F5DCF70B0814207C43690D2D9A2AF382423515B7277E4D3A990D4CD0F25 +9BDBB2350A8ECDE52D641B901E94E524E9FE6612037EB6EAD9C3A887B45F3B02 +2F60C45F88E147512CD1D4A967AD6FFE126F3C4E92FE3117E38FB2A662D90B1E +12C80B32C9C547C7EB719063E25157F726885481D0B2EC9472A0108693BE337C +2D7EFFD1285B4F507316529357529D3245AE2D18A4DDAE37225D682D8D20574B +0DAA73817D1B70CD37B2501CFD087C0DBD704C544DEDFE282788DE15703E9D81 +F5A1AE011E6DDAE53728D2FAF938EAB8ACAC0D07F32CE8E8C8E8C0262A76D9DE +B533DA266E44B2A36DB0E19710EC9B9E99E9C1DB500D0D8A293EEC71628E9842 +A8CA8C99F9CC5B6B26E4C96F7D840C84D827299489D0F9C7E952A91F78EDFFDB +83554679AD863C2C64DC49A33E74AA4F58DDEBC9807A92372E227EC0CACCA61C +629C34C083A21F278CBD8747BBD7D00AFC2BB546FEE02DE9892EF88FAC0EADD0 +4EE10387D6386E77C462864180AC2F655ACA5903C751F060835DBC1F72AACF0B +F4F48B83FC85E9A3EC662222907A796938C8CBB946801696FFD8630E897170A4 +759BC269834173D8EBDC70CB16EC918CC68DBC61D8A53EC5F6F63732FD4D7EC6 +234CFC1408CEE045CD2739C71BBD175368731CDF9CC19DB87B7B974FEE39BC9A +80948277A9676968840537A4DAA22EA9D970FC096ADB6172577DC54FD7B57BA8 +7925FADBA77E5707C51B8EC45FE227B13966B45C39DCF0F315EB7A6149134803 +E18FB6CB61F252E09A7720804C6941615CD2B01FC5F8B8E12D3DD1D4984D0E16 +0E4E3342253C6CCF6EF407DF245C19FB550CAABF4A4F6B0E251D2EF04F18BFAB +A10FFF86ED39BDDC366595AA6D4B1DABA39FBAD8620E7638FBF54E34A26487D6 +2EA281D9D2251055C510A401023A14F3B97193C2B038FFD1C728AD75A186721D +23CE5865389B0E47DB6F3DCA265B878950B567895A10EDB5A6B3F3FCD30FAB63 +C6D09D90D2FB1C05D8839D0B4EC950006F996447840C8DC888EA71794A23C27D +D77453DD43121B9B78FE67913896A0B65033060072CBE1992DCA145C1C88A88B +B516B239797B9B709045266E742BF9907803FD36953C9299BF788D3BF01E9134 +9FEAE5F30EE1A8E7449093FDB9992D74493DAB0BA265D3974992F5D4ED79D6BF +99EAAA95DFC89ECB4799BAEFC10012A5610194CA9DDDCDB009BD6436BF30B1B4 +401B2E4B6FC0EDF60FB188878A822073165F0E0399ACBC7E72770F960AC46061 +F89852A0205A8A7813450A60A16014AD433C45388A3166C15D900597B37DB638 +9DB6D76BFC3395CE83ABE084B5DF3E616D5E13CA29C7BC6C19737C4CFA04B514 +7727C2383D4DC36CFF04142A1425D1A420DAD27EC6A779FE4FA9E8E44B0A71AA +2DB0DD4C5A4AD2EA39F0FCDBC0CFA81644CD6F86683FDB5D97E7FB3B4C5C9BF0 +C3F0E49BB2031EFCC6770FF520FC24631DF7DB8D2B5A7E672F6352ED95C3EF41 +80B53CB4780B779A2C870E935E1F774C2B83299A9FDD5447EE674A157B7B51A9 +DB721193CA4545B4EF0D312DF015F1491AAF251B16872B689C2938053BD3843C +9E4B4DA7B1A9ED3DE85A2D848C5DD26F4B3D6CD96835915EE86169803C6ABA5D +BC878F9502190EED465E574E5730EDCCA3B4D5FE7B1BFE3F5AF5FBB466475A0D +E6D2724FB9C11AC63B3424F422DFFD3B72A168522CD943D7EF214A36B19F3C1F +8FCD50591ACD2E4525078561EA379982D47A010D6B7C325E8566BB370E6188F9 +40F7934B2DCA11D58A5EA2A42FA79F8F5A69E4C8313E2ED201C6AA5E7FD5BA87 +3F819A807799AC8084E2FAE69516236284A571A5A3CEB8CD0A73AB1D67EDE888 +1A69184D68842D02BACC239C898DC171A8EA05B8D2811A865BFE2AFB428AB6FD +012B295903DE73A0D3A393E0D9D766FF470401C335AD8623A5EDB7B0F35332AF +CAD6E222B741973EB894361A862317BE692CD4B855E4042F7228A83C14CA28DB +926EC8CC9BFFE3BF98AE8923E6B6BCB248663774FC2DA52C5FDD448A5B85BD76 +6493998AE13C84B4D8C1CA3FF66982244E7197928E8CB91C71D60CCF1F6BFF74 +1FBE8FC9E0285ED3AB5610393B7D11301D8945C71B3AD01F1E7F97E9BB9D8737 +C4D113FF9B84E8D84CF3D04C01AD7E9F586FCF5B20FC9662A5D6440478134FAC +BC580FF2FDBCF7A494AD744A9289B8358D2A14F6DC4ADC0A343D857D2EDB65F3 +4D97B49CC92601B90D63C5650F895A2485A18617B7BC02EA2A9FF1E0D777F393 +D7A6DD6AE36E73BFCB74560E398583E0B716650B24FF5F54AA73346A01D76967 +97E8E1C8B6DB6B4BCB511EFF3237A40960F3EE230EA142EAED3F73CD0B13F23D +A1D51F490DB90D37ECCEE52B9EC135E26F36E509535752FF6F9135A1DAC1AC81 +3701EE34956ED7BAD6C8CF1D70B9CAEE2644F94B10935F9DD1B03C5D356AC0AD +0B6F327DA139D31FF65498675D193540EAEFC3FB8A119ADC74536C152DA82D2C +0B523263DDC88E048ACC64DB32B259989488476CB0D351243A09A2BA6697D0B0 +6C8D52A51C0F631E9EEFEF3A2042A2EEBE5046FB670C75B4157F7B5AB507FD34 +6F52BCBA13FCDF4C923DDF9908ABBB26521FE2A7F9A0BAEB7EF7E82830E596BD +6CB249A0F61C0FAAECEEBCF556846411E352F468F7F6B404B3BD3B92712D362C +4A84545661FEE4B5FA52A7A7C461B9F7ACC3E8321B30068F609DA42857078152 +1A00EC0B51CDC27C8B505B00E49BD1439EF1C861173182EA5BC4CBEE7CF73255 +57E6AD9AEE58B43D54F6E22DB3B8F5F9D58EEB756B672547B521CB7D82E78B26 +32C27B3F93E5122482F87852C2F357E666AEEDDC369BB5DEA3E02EF8CC69DC4E +31F677ADE63DE168D6A500055E06FF746F5FE59864319FB3E49DE62F5E2D7005 +596F22D88796164AD412D3B254E8D5F7E7CAE3EF1D35D67733BA291BADDE92CF +70BADEBB6169228447DB4A99473D865A7E105DC43421491AB8563C62C215EBF1 +564E27BB8C008B2617DB934E0665D7208C441321AB5EFE9FF1743C357A9C2E5C +4AF4039F16367C6B9837A08924300E6ABD2AB033C146DE6B2821DD9172E5D7F1 +53785578BB227092E8ED1BBB8E0CB70C2E23E640AF20828C09FDC2421ADA6DC8 +2D117F0E3DF208E70F00C9C410E8F77FB1221D1C07F6C25C1930D0F2DC601025 +EE0B877941CC9F82621D4712CB9DE0BAFFCCA38DB1CE1896D6A5FB876CE944CE +97A297BF3468B264B32B7C8BDF5777F197F64EE9BD2C6676BA50752CFB9F5051 +3C14D6D0658F7D4841B9F3C47B9522E1696F32838ADB3E877FDF5339F6721A8C +7F39D070D9912AAE0A69B6E1E27F4727513D78AD9F1128079E3100D0B559B179 +FBF88885A0681A7847F26D70D8F7A3286E4958DD615CED53147A5A50D06D55F6 +45808222273C6F6A972D49873290654057517F1E067197C5A863324BAE696A25 +F250DC419B5428EA0655E118F77B1545494C94EFA32D34434C0916BD6C62F9C1 +2506EC7CEE3456B012DEF7C87D19DCD3F197047F3C57B2391A238839884A3F19 +CC0B1814255F4DD8977E61513F7FADF4BB98315C72F84B4792243022B827DDA7 +FEF9E1434C631FBBD0CE34CCCF4CFC655D0F9BF1E22B91FA21D95C6AD6B0C098 +E987D92C862954B2CFD8E8CC0132432A40ADC155F8A0F97FC03B38B9738B4317 +CBDBB8E7B4BB929F6D39338AA69A5A11BE27316BE370800C82706772CE33E367 +29A80B24D41F520D993098C4B04F0F62F9C74679BC076706F0969545AD65D6B0 +44900379A36E940359B6BCDD0F3F5FB0A8F30BD5456EED4DF5CE72F7A7B93858 +14BE51729E4F8AA97DD6D134279E88C3EF28D61D7937837DF831BC8A314F2D3C +1353E96806AE841A57EFAD644C8D884758880415F91E7683A88CA150493EC28D +6C7272E3465DFC48645B2F722ABFC1943CEA4B5ABCF8D76C3D032F1B3264E7E5 +06690EFDEBE83EBF967085035A199297BBF94EB3D884AD4C0DFB476B85E6BFBF +F69BCB9E57ED6753285C36AB62CB8C98E676D4D23C44416DFDA957CB93EF7E78 +8379C6328FD6711EB9B45D10681B56591EA22DB43DDEAFA65FFCFDA65075C6F1 +FF96A492130ECBCF265425FABDE849C62767F6B36895CCB19CF177B8BA4C7163 +D9DF847A42072F60B3911D8DA23A30D63C7FEE986F939CB35F7C47298D6596F8 +9BD7354FC35915C0CA8CF2A60F2DE21F355C74E605DBECE35A70FA12BDD3D915 +729B3D75FC8CEB2BF67DAC531BFD24A2E975375F85D7AC7CACCFBC62FE51F11F +F877377CAA80F8FD8DEB1B1FA7C1ABC73B88D4ADEF4D045708657864418FB434 +7DAEE52F2E2AD61680B4E5E229C12EEAFCEF8184B3B03D16BCCFF6E0EACDE3D8 +CDC8D9185DC2672784EABC5E55C8F45AE77BD18C9FDC3189D24E3C93CA20A916 +1750AFEEB67F95016FCEE6BF60016FE2097AB01CA18B0EE0CEB254976858635D +13D51A80F202A59A66B54E81972AB98BF9BC188EB653F43FD0EE5E7740487B5A +6102C31D939943905FCCB91C95F54E69CEBB4F4A66027B2D03AE23F09D91B676 +4EAF654BBCB61F084EB153BFB0839D882ECDA35D1AC2C1863A3C5F0523FFB7A1 +A707C2D48E8B2F421A192E898960D888212D488816628740CD9F9FB6EE1DC21B +82725168913244FE38347B234317F127026147CDB4BBF8BA9274C987193DBA07 +0DE6596DE26FAB1618D77E552AC34F71D0B77AD262314963C69EC171C1EA0706 +905BD2BAE70C9806CC263DC44FEFD2E7742538B2C62D782D6FE9AFB6464BD9F7 +7C537D1CB46E93F998D0AC153BFF65D71F72DD0FBC30E427C94BEA08A51FEDD0 +E9BC9C656715B761EED9E0DF6F1430BBC2F5FD6F2D5A31FEA89F7D3B8ACB3524 +56D36998729CB9EB6C464A709387869BB5D9062A5798B9C3F6906CA8E9C1A53C +BAB4CFB6D6CBAFB766754CA2D15E927872427EDD9E73BD16C3BF4DCC479B7550 +1623FB8E04B11986EF4A3916248BA3328BBC2DF30E994B20ACD597FF14B91032 +274884EFFF7E94BDE8963D41E9CE9F192C84AA7B2FD2F6242B9828F54759ADBA +352CECEE86152B06D785DF2781CB339BB1B1571FB31D18C3CC831B15736FB91B +3C95834BF98DC3B42C9D32804F0E1B0418C30E944E103B1B381FA9B54CC41994 +78B4BFFE0445D1499C19B4577513B2324B7A3A752047C36449C2EAB3506DD87A +A5A7FAE639C0A70E71A32DB71FF4D8C741A8FCA4A26C886DBB89AB5ED74F7B53 +025F00F3E5832CAD54696CEA99BF7D37950143F74A1A31B139374778438D0DCB +75D125317E14B837147FAE2B7DC6BBDE62AEA6D74C7D8B2EACDEFFB5A61763E8 +5CD01EAB644B4FE0CE573B681C201BE621EF353ACB26BBC14DB249CFB079F488 +1ADF1C4E19CF04159792E40A5E63EB9DCFECFF901DE04D02604C195C315AC187 +34DB4F6C850E9BD424D3971CC3091A41D5B8F5020B3C79E72B99A1CAE66C959F +55E4C6C1C1C34DCEB68E8806967C638D01E8103A6E886609E5276FC013ADB053 +AE2806AFD0E6CDAFF0D97E75AFF72A027F2817FEB32964ACD45FEA9534996A50 +53ABD80249F5890C69BA0D650BB7F0AEC076CC809EDA4BCD8265F334DB581361 +329C2530144ED7073D99EE1959AB477C6149B3A6547F024AF983BE69BDB9BF4D +827728F2423F648185B1FC0AC9C7ACC727AD43FDB6B0D433C8172EB74B8B8AB1 +8C0C2C0357458E197A842358705883EC22E7162967172C0519820D5994DF9D7F +D50B52AAE696F603985E3504742D31C0B69D77552E9396F18C71DEDA17BFFE67 +E1415DD4BD373819A33CBE990992973DA11CEFBE7B81DC910273B315B82B8861 +63B2E66BFC29A213D5526427B723B4856DFCF3559FD701F77857812B0C6C0FDC +4AFFAC54B1CDF29E882BC2E2E9BA0319BB084DA04A82539AEABE7FB793B7AB28 +E755B8B1CB2F0EA0329B29816B127EEAB2E16B99B9FB1BCDC5ED2A5322F3A271 +99A1981B3212711FE1DCB32D0638EF932D00B3C04F896BF7DC7F67EF8F3DB82B +0536D186F24BF7ED544AE148F24F6CD5D81059F55AB8E24128F755991F89CBFE +75DB53CAD6129E392EDF60FAB2C90396568683A0C996C46358975676C6A8E3CE +131C90FA98570DB4E576B4F669CDE352F19DF7652C97F2357C4C8F0716E5C290 +1354DBE5105A874C105F541DBFD7E6A63B1231BDB998EDC392678D1EF93183FB +0815568798BDF68665F37205546A6528225B3B91B3A80C0F433C8888B45BFF9E +A972D7C29B2647DF29806C4113613512C117061E7DE70F763D097A7CF236F371 +4BB3BFDE60B73EC884BDAD2E7864F24BED01210DA9F229F7A87D3CC0B3AEF75D +D8B763EF2B7591B8D2CC201A635C82B771BFDB42FA533E321B587735AECDB3DB +071FAEBC9ECB06F06A0EB364ED723D12EB6E7BB479AB013624ABD11060CFFFF3 +5FE5CC50E86F9224466913EC8167158FDFD81438BC1522685CDE8A038F0C8A35 +8AA1FA8E38ACEB99E18B55075D594DF39FF874DE7E7E6C95C677F35B2DF0F203 +B78369144DD99484A35F26414874463458FE0F6D2C63481260398F5FD319DED2 +19C9DE91CE63155DF12CE842E67B8DF8E61149FC4563C4ADC280E564505F0F80 +2B6CD6BCDEC7AC194C372BE1A4FBB457739A8AFC4A7727E37E2D3E5AA30E7461 +FD43AA99CF8EC08CF47CD67B820899D75935C6DFD775619CA2D52E4FE3A5B0E5 +3D1231BC641544611EB461A1991FC02E040C574272D428419F6D0AEF4285DD7E +4731CBF498243B66ED76F66CE3F33DC996BD10334741D351DE2294D268EF045E +CB360B89A5E9690FF21C91E396E686C67B5570A1FE2182A5E78DA735C70162F8 +E978C1E449853FA9B6494F2C38F5FF2A27F8E9DA96EFC069145C844402B0223C +CAC1AAF9E74C8576E524A2E5F072DA0297AF5AE4F1B0F1E3BF24989DD836C057 +D18E755B8296E8402CEDD8F34A258ACC0D34D341ECA9889F4B2A06FB778D591B +157DDC8D7F54A289F918E980C367E46575F05CB8C847000C6CFCC939867C78AF +8A0980B0352250C063F3960D06E88A86694879A6DB159C2C5CF831ABD393A174 +C9BAB470B7EF87F10A5C3EBA5716279D525D51323BA98E262B1EAEC96A61163A +44F84EEBD3CDE74822FC6ED53FA7C30A4167B1BF8BB9D3347665A33DCA967641 +E4739C8A7ADC90369E7C236D812BD03144A282176D5E906B55D1274AD6B5ED2D +CBC01CAC7B92D8D919D25D80F0E0CD744B33F303C43E0D9F1F0E778056C43E1B +5A300D823B0070C69DDC9CEF534DA19FFEA924A6D20D50D3CEAB46949288EA59 +8428450CE0960400BA1EF843C4D538C6A2087D3E1DB7AD847898602ED66F9366 +3F8E07233BE8331D36C159E8602B8193A5534030BEB136E24B24886D063694C6 +4A86C6F0B74CBAD19B83C2637AE35A07221F79860B87754A8042CB7489B0648F +50BD0B93ABE34188C91AE0846406F063DE6FC2FF17D3E39B758A9182F258E2F2 +8FAD163152FFDBBC23B122523A2BC4421B025B0D8E876F80F12977AD02F2C393 +F8DBA9B7DE3D98B21C2FD1BFC42AFB3A6B0C303E94EDEE21B704737CA349ED48 +8332A075AB14489FBA412E4950BAC4F79BA0DC7EB6AFD1D43311E04F7047C851 +02612F1BDF9549A1C5A4E096C7946749A9E6FD356FAEEEE03C196042B6689913 +2912AF6EAE06BDA5E9F7A85CC503E22008CDFDB0F51DAB9C7821BDB79D1E7477 +16E244E95AAA34AD1B2084506F7C22CE2EC64C2EA5E2E2424E265173B01CAC83 +5A14B1FA3CA554535FB71CFD640E6F04917771589AFD81CDF19B80F2338A462C +A7931133B7609357EBBCD05DC82B6909139C5D9ECC63511CC7FF28601260C7E9 +B3253E2B8655135DF5AC5EA5F037233C61495895D1499C5A00B13A90B8B3A886 +42F3F12F7A902F5520AE4F8E5AD9380EB5063BB93D98476969FA47F2BF6EB1A3 +94D15CB620277C1D586661CE897F3526DC5B52C447FAEB44FD3377DCD023293C +CD7A75809CE202165BBDD0311E1E793B9E44C747FBCF9AB319C9F3BCA0F65881 +D85A2549005C27CD2A477C5DEBE1BCA541DFD153BD6357215CB195A53CB1AA0A +636FA25E28420EDCB036BDC3AE3D522E912C00EA6061E8EFC7176DB1D106BCC9 +F7420AA98E67899D2AB3B63A14B966D06BB785067DE6EDFAEA7567367DF1B9AB +24C2194360006894B979EC31B09E92440945036AFB89155DA483FD44C1F9515B +4B576CD51A079C22C668B72EA35E21930B701E7AEC08100BFCE2891AEC0CAFD4 +A71401645287CE15CE5C4A94409B207D1A8B13DC9D1CE2CF6E09696E7793BC1D +8766A4FEFD11FB4A3B13B32A5E994D010370A0890D85A500FAB60F60D8EC607D +CD3B7657B32A4B99C89BCDB0162BDAEE9CCEF0B52C54C8EB5CF320DCD9803405 +10B060667538413E9BB43F15C72510A68AB688C9512FE05E87AF5CD4C2717FBF +F0B5E605CE4360D89C7BA422C2A867710CF0668BB684E83FCD47888C92216068 +B03655C718AB989492A6D432275B1F64005849A85ED0D167C121134A59996BB3 +8029B44938C401192B96DFECFC6C7EA90EEC009AE79F2D94926581B2073B81F1 +E995224D452AA32115134F7C8B0AFCBAFAD316F2DED91212E5E2715A9A0F59BA +787C811A7CE37859B9BFD4B6648010C449AB624401ABBAD5D22623A05B127FD5 +F6C3FDE7966A3AFEB0BB98B38E8DAA05643EF7A9242F48837F2552AA6E449594 +9BE7E93EAA719FEB29077A5B86C14B5F47B1B86D9F1EE50A9BEF6F6FB2DCC4C7 +D3EDA4FA1744310A2C5BD39E8EFF9831D2E91698BCE0D2E9769525F934D7F08A +FB4DF1732A46D4CD48BF73322E25BDDA632CBCD9F0571779CA52A60775ECAAF0 +04A6ED054E9527CC85F67D2C480D6BA074A3D73D5386C7D3B06AFA386C931512 +AA015585BFE18F6B5B79140570B655295A0C56F6D3FFB790185D4F1A10F0AD18 +C143DE30A7FAAF80239CAFA2DF1CEB743341B05E8FE1D90FE3C0F75398B6FB76 +28FDF55AF051AAD341AF59A6FDAE8B1BC878A52E5FC2B504D4C113979D7E7524 +F44C86A5C12F5546024D792A0E4FF98AC19EC3850D88DBE34B4C2BBBBDD77E62 +67219B59243B4DDDBB88AB7AFEEE234F08DCA63F51508BEB43BDC3B00A3A6F9A +B4EB5EBB12D928D2E1901A0D9799F82676F6E158A6E521D11EADC606176809CB +82687208E6F491C6B92901015A67A67508A68FD8F910A41FCE333AC61A17F772 +13FBB7DDCA5C17263946D38738E019B016BBC294F89083A2E8AA6A9433272CEA +42C8A243DF05FE3AB837F0793AE36FB9B1378B7DF1D50CB48DAE3F9CECEFEE6B +7E372802B2A19C7C1BBB14D3B061C5DC6FB29EAAC558386C58D87E1CBBA07AE8 +B66DE0AC1AAD4D714C00B528E0A10D54AD7D99A3F5459BCBD196C0A86DA69508 +C4C780D2000407BCF22ECA07C1FA37DA0E05CD0D1A78AA64AA9F4682F2F2F05F +0D219E2D4A1B55D836B36397586C46E54F7E7B56B969EEF401B7BA9AB3B71491 +0B33E2694C3B10AE3702DFA3EBA9A42888E2FA495B521FB5B860EBECD878EE73 +720ACF8DB674DB5C4A3418E5C4B1B93E8BD5FD6FCB334BF3C93D6825201A02F8 +A8BD1F64CEF4D6E8BC96948226D8E0C34A7C65978BC66563B39BB41098EA4DBD +DA6D7CB34A411B9A789775C2559A9F90B7F643551156FDA8B8C3B368E666A546 +0D9458F1BF0649BBAFCB8A2B0B35633A873D5F9B0E55A1A1EBA070DB4636B725 +BAD1250138E0A08B59DDC3BAC64DBA14313B8937275F8E8A506F6D6EA691FA5A +D37453B2619C027CC5E6DEDF6C6EB248F182A7349A21CE744152BED4F91508AF +AEC8563F1894734EC9BEEE05A1CA429BA1A134CFB7D7D533595CEBEA887EFE8E +8D41BB1711FD033A6D6707CDCD2F1F3D02DDAAB98311AD5BA5DA9EDF971FBDD4 +BB4EF7EB3641CDEF6CC694948ADB8D94D39106C7D4E8E788627991A6AE33D7DA +81FF3259C745D3C3F53FF8CC0FDE715D61801FE115F534FF3FB04CF5324979D7 +2AE393F01B9B84992F16390825059AE1560CA637AE72CA56D3CA686CE9514E1F +CE1859CFCEABB3DF9FBD8F0E3A1E8B1ECF291081A63A86128BDF2DB251287810 +DEE008FD4F5ED49D0BAB3E7638B975CF6C8528B9B8BBF490F9632F83A060AF42 +1469997731E304C44B80503B391B9632C15D209556CD5FB94EC7CF4C98B51C7F +284ABF771FB70ED5F1CCBF4AA789AA9CF8C9EAF42F9C9725D87820C10282679C +DA104A08E1AE5F01DD4399211C62C5F3370C9D159923447D15C2056A0F840203 +62903BE8B5B1994C9D7C6052077E5446D54444628AE19229209F815677ECC5D6 +45E6E1CDC2FF1AC81EFB1D73ABAEEFE54E185E3A817C0506CD754393CAA3D30A +B2F401490D83B72BD07B4BF1D1ACE8AE0AF145A3CEA0E05439EA8EDE1C4597AE +B5E866BFC94E30C9E8D8884DC900862E23767B9F8781F5623B4F5F74592F11E2 +DD253253D176019798665BE833997D2ED432380DDB144EAB37C7756C6F729B0B +D13D8D02951BF2C016DA02873E4B589EDA8021397BDE47000E0BBDD2AD8D5160 +C7E9F69831FAEF84C27C7342C8CE4092278F767ABD3C7220870D40EF9AC505AC +FB5F3E1BD3F0905F71AE8751C4E6BE02B392874356C7F25B37B16D7E8848A9C5 +08FDC51948C71D3031BA695B44891D7C56F5A06113C1DF9E7A5B2306053AB76C +18B3BFED61C8E196494FCB0408DCA9389D6DE9611CB19B793D286011E9AD6E78 +CFD74396029C4ABF7075143A71D14EF93B2053A0E8C8789E176D500DA7945DD4 +B7F805169681F4033DA8A2941F8BAB7E4A1A0971E017FECCD8738DA3186B0DB8 +8C63476272C63364DF6C3CA5D9847A6D81736F0BE388AF95A7F9B5663F55E3DF +1C740E4358B349DE17A63CA2282B03065A66D9FE3D6BDCEF932193E5F2E2D150 +47984A57B31A7AEB54A101DF328A74040317529842B4A5A20E3448077C331626 +9A5EA78E5EBFB81778BD4C9B392186E3C811EE82CFDD6A57E050DA15478791A9 +65CAAEE28B55362594BB58EDC4D01FD54CA7EC5C4D2A3FBC6F399D5F35EC2256 +EA0B1472A99F3349DD62F3931F193C322608E6452472E00EC22BC13E2E17949F +9F00E979D5D5E38CE6C6EB9CFD7B05E724CB49EFCBB211953A36EBB3A3E18498 +8CC2B96F8FDE18C678282C0A707ACF03CC41F735E5A4173B45A9312944D69B2D +4D448C4914D987DE531C6D3EADE9C94F9E6F978AF50F6C25CF8586185FB7CAA8 +5C428C606709C5FA5ED63CE6C0456664A552BD6B6AC8A321A97807279CCDD27A +EA484CFEAE6FC10413A373A9E041D3CC05B48BDDE5DC89F1B9D140F95C9370F7 +1126CAF6256DDC8081BB304F294398A5B5994800684B097444BB35D4D293E782 +F61C8EA1AB2886CB6911B260127D8A2D116C3AB62F07920E37E0405F516F47D4 +C4E865E9606301B86A9013E5244E1C145D515251089F62C780C17B1C2A605DA6 +4E8F113081631041C38512469AAFFBA750A16A4921C2B809CAFD80F17DEE5BBC +6A00C67E59A4C3B1C34DA41EF7D4CC836CBA67ACD86822FBCD160ADC54D10A5C +CD5A1C1D01AABBB900776AFF0BE76CCC484037C34D348A7BE0B15109BB114DD6 +F0EACCA18800AEA8692D875F761C574B90F586ECB60183D3DD81C3B1C0EF1822 +3FA0688E244FAD05F5AA4490DC6E0F515E174DFC2F26821E9C4B189830EE8D14 +56BD9EE6BE690E62E2688D180B231704148F643873BAEF2466099D01E98D0A22 +8CAD70DF0140C21585651CF257F62248FE2418DE3087907355F88886BE1DAD3F +043C30DF1CAA28F327A71B8EDFB5470F64298B899596DD2236B23058E3339E8B +82A8B27BD3ED46D1B5F2CBC333B4AB6C8314B26320134D8B8479F2824DD9AF44 +D5F10F431F64B832D1881F59E8832C8935765E9C1ED9768EB864E3847F4F4928 +71D2CBB138BCA7085D5E619C17BD6513F53293A9F419A74077EE0F97BDFFE479 +CD960D5603C2CF26A3B4B3A6372F954041FEB600A528FEC76BF86420CB8FE902 +C978E8D7A3D317683FAA98F299611F900FC0C38E267B9D2295AB317A0C65CDEE +214DE4298121B7385D9AC35D23ED48BC980D8BDF0ED1B3DF469E74B2FEB07B5C +F26F8C6A61D4B1EF1F95EC93F618CACF0674C625BD9E960299A92E12BA082080 +7DDB8D06817185AE7FB28174B530DD2EE84660606AABF27A171C33BD15173A09 +69DDAAAE380C89FBB4FDDF271D3FB5CD0A2D62A1F1BF8EEF00A9FE22FDEA08B5 +32E6995008D17A9B885BFCBB80E9AE1E3A4E75A8820AE2A7845D366F29CAE72A +9D41A40B32DB7F477E218C646A28FFDA6E58EA290AF7E19DCB764FFFFF8248E5 +179AED3D8F1B91480B3729C79B3C96B3AEF105E11E370AC65F47F58917FC5EEF +68C5F518D1079ED2182CA6B149F76312133A4BAABC1E1862CBAE7AF59AADF2C8 +FE748103948695737AD7BEBC52DF8C4BEE11C346D0E9B07338A1E82B86B8AF42 +88A49CA23BA88579F911319AA8B7DEA4CCA6387BA33B217D02D121FD38FBD51B +C100B95B21D41606B40B9A11CC731F10A8F4B86C572FD9AADCAB4CAF8F27353A +C05EE5A9F372B1FD74B71522A6F9248F838630A8DE2429CFC5B34161E83B0B38 +9713AFB911C246E5ECC6AB86CFC463B46D0358841EC85787E055ED7C5513B0E7 +960D05F0BDCD5DEF56CDB808B755396E2F16F43B6D58BD13DB0A6B9FCA646521 +5B114C3DE7253500A6D89A0DAC7F9EBD1E14D7EEBF8EAC1ADC5EA574781EC870 +7C820F1ACBA1986CC55F78DB10F9F76E9392FC9265F3B370988CC56BAA379B46 +E5DBF4FC5C1A5EBFC1DEE04AD79977B8B9213DB98649B6F9AC0F99F53A449CA9 +FA33BED4F5EDE8D1B53EEDCACB0A883976C98DD719BE5C2A0A948535BE0B324D +4CD123FD9E346FB8E5C5AB593049CD5330D34DEB46C4AD0D21BF6E5D715B8A62 +40E0BDA591D2727E4245B29089FCE0A2238B7AB0798FED91B6F8CDD6C2FCA085 +3993743912D66BC8049C30643F9362D510575CE4926D53858A1BD2B8309CA46F +F93B3941D0822B182AE4DCDAAEF090AB4DCDBF403E4BED69B62ED62530AC3A6C +EDCCE216FFD057C8A388145720BED9D31A89D149E9A26AA4DDFE8EE93924FEB7 +97A0DCDEFC84F9266A86D2B88495F4A9B1D33248BB0861BC4D38825D1EE3C930 +11077737AC6E307B12ECEE27F82B554F40053CA24D2520DDAC7F547407A77196 +41E85341D1D1C10411003E66708BC4FF4F31AF6E689321788C59D63DF263FE23 +71FF6C27BA99A5D9C16E08CECE622CDB8517D14644BD03A5E7DFA8DF8AED725B +F6AB8971EC1AD359AA0290B31A2DC818DD2BF80EDB07EB81F7787965ACBDEEFC +05337DFFABD0786D1C71B192B04618A00E90E0BB3BB704D1AA86E1FE5AE09B9B +256B82ABFCE181CC45745A0B2E51B1B780A91FB2387EFF75ACDAA8AC13B1F44B +81AB96DF1D9CF587DC8B9F926D02F81C8BABA56DFC79E25883453E84E22CADAA +ADB64593275CCFFF770B53ED4F4F1B0A76DF0D5AD96FEA25AC42B8C350061A2D +1C97513C9F7F921ED913F321CFF95EF57FA1E19A9D3F3C927568888E1E7DFAA2 +D12525815F2C65B72737B4AD9BD64F922526C3527693B552ADFA10C281F99A79 +26513709301215BEEA51BAB631ADD6DB698BD96006913FBE8AAF394A051ABA45 +D4C7F093DAC9707CF64509D64A39EFA0207910A575932F928CE105E6A2745088 +4D23F6EBEBDD583037106433728693D9D24462F3E75DAB68059ABCB05B2B5633 +D46ECEB9E1A9CD67317F5D1197DED31050A102F739792CE307D6928681542F39 +954589A5187E9FF713B1D0A3E5515C5C0F935B7921E4B37E12F0638352EA1447 +7C5BB21D4CB3181B1C056A3B4D98396DF351BA384FF61A170C1FABB51B025E1A +206FB57FCA26D929BB232A9CC3249C1A0400FC039D3EBB543812C5918D6219D0 +882DD96CFA770A03BE1D0494C090D5F5EECEB305435FFD740824EB85E59CCCB4 +AA411710DC67EA2489430D8C08423F00C499323ED1BAA4EB1B5089424F898D86 +BDF5CE56C028B107B8972433EDA77EE397A193B1793BE61F8DCC0273A0FCED9F +8A98FE8D1A49469C3A4ADEF38888A1199DBAB63DE30E56B82E55C6B31D70FB4C +5F9514DF02B648CD3FD6860E426DB1D853910F1F96EA328759229347ABF6C503 +A7B6A63D729001711890C1AC5997F2F352F3130C760F49D0510DEC22B51A7FB9 +F2A7EC4939171B82F24440AA058C5522681A0A97BDE06B15B88DB1F1246A095A +E89230E74BB7B404806FD2FE9F698C167954184129B40CFCD711D69D7C1B4F8A +7D2A8D496A7EA0FDA901AD9D79D067614D868290F804649280671903D1085A1C +E2E3C0ECEC635D975D66CDC5312568AC5C85F87804BE7E60EF787F5B97DB71C9 +4DB5F1AB7069B1B411319D3D70E1554D56120E2E5C9D474DAA7C93D5371A9DF6 +10A823F3105FF629CB8A2D564545638B9203283F6D70E4CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMBX12 +%!PS-AdobeFont-1.0: CMBX12 003.002 +%%Title: CMBX12 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMBX12. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup +/UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMBX12 def +/FontBBox {-53 -251 1139 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMBX12.) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 44 /comma put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 89 /Y put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE +0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D +2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608 +1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C +42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557 +FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE +78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18 +22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE +A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811 +4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065 +4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7 +95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D +9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC +5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF +9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3 +CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511 +BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65 +9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68 +EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A +D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE +2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE +947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B +0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6 +4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C +BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2 +F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4 +6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514 +D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415 +F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8 +481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24 +FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D +419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6 +7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B +70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988 +2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE +0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC +9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A +C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D +1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2 +A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969 +21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530 +7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198 +17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60 +30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F +3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257 +96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3 +B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950 +1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B +57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE +B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC +8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91 +8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59 +B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E +BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC +21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91 +D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4 +FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F +A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4 +A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082 +A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA +DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38 +7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F +07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9 +BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E +8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89 +E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C +B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5 +45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67 +2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5 +5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF +A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28 +5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975 +E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01 +5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94 +6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30 +8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB +BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6 +9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB +B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B +B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E +8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD +595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E +FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15 +13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A +FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3 +DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB +313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248 +C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89 +F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD +DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844 +8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753 +E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197 +A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3 +C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20 +417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43 +19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4 +9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85 +12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83 +3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1 +A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68 +90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94 +3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5 +B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B +82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550 +1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94 +AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D +9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985 +2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5 +99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A +31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414 +3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86 +F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5 +70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E +5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891 +84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978 +BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047 +8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7 +5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7 +9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B +F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E +94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE +0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC +E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4 +7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581 +596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442 +F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E +7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1 +1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785 +AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE +4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F +744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D +67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA +054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA +6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B +8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE +CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39 +EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4 +C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76 +57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5 +5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F +C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1 +CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2 +848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C +B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB +77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28 +87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58 +3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8 +409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7 +A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B +72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D +99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD +8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB +E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C +82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3 +C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0 +EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634 +23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A +59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F +C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0 +1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C +403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90 +1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893 +75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E +0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35 +82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25 +C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8 +A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC +9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06 +0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C +5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060 +62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D +6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E +1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5 +648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1 +FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6 +754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A +E124929876488AFA97FAD1A68A0C3496BCA768F4AF8016D7A65BBA3AAFD7F5FE +E75FE714FFF3D54D09C9747ACA01CEFD260985C6E87477C9C7843343C7E9E3F4 +0537D461EF019E046DB8B5BA258462B2FAEA1826B3410BA3333480CFE0DECE61 +CE2731FDDF7FCF2AEF7CC2B1EE7095F480B3B27932ADC486BD9CC130D94BBD05 +43872FEBA04FB8866ABCB4D379696E73B84BBE98FBC4A16CFF22F8A7AF754624 +2912C228030FF7EF23D51DD61BEB5171AD31E2B630475E16B6E0F3C78D44AC30 +712D165DB5ADED89056FBDA355CE0DE5DDF2A52DB851879E39085EE9D44EF757 +9B4BEE1ACDB865002ED4C5A98683AC13D9E1F818EE88E0A0408E13888A023B87 +31F35E750C4DE7EE68DFCC0211A2860C0988F6E682EF84373DB982BA28162A69 +64E9CFC6ACE0A25114F95EB7FAA7E99A68533FC4888AE57C5C104B219CFCB938 +DA518553B57BB2D9E462A5A68F1E8E0044F1FBC52560D53A6C2EB0393AF5CBB1 +55D81F9DC2C643F2E2DD0129C306FA3A787149550BF32119399076BC885D150C +B3584CB2DD79AA0B27FF0D59D7CBC477D5A29F789E37CF19F32D9D3F6914961E +AADE5423667209A686D8BB6F2293659E91D09CFE321C53B34D830CF72F00D3E5 +FCD3B6479BD4C862429A52E964B3BF8B81906F32517E927023C2AB14AAE1BC5B +6B0B906F420772505D76FFF558C9D3BC3E980A1FCC61E9AF4B9A9843EC4787D7 +C41C6DEC165A5299444976F34F301F2950FAF95C529BF7A74514AF883C50B4AB +C21227588FF0A57D1CCD8A91EED659F63BCE43D5ADD1F3CEDD661CA2B68654B7 +01E17109377F92C75135E060CD805F98FF47DE13FEB6C7FEAC15DBF630016448 +6C7F12BBDDF1C248C3B8FCDB8DF5F93357AF164A7114606087697E5021AFED3C +0F775E02982C4599496B71E4B6F3271396CB9B581F70DCBB0435F111D2216D73 +0C78C0A5C2AA5D2A40758BC181BAEAF2641B439D4FA6EB46D03338BD95820ED2 +D57CB7AEE41EEDD77FA59FFD1DD7B805B567A1164AE77D8DB5F49E8779938D9C +875AABA87925BBA4B374E59AE9780D231EC4D1B192E7CCFC31D87F5378200532 +F64EFA6055C148898D5E67ACE7363D8AC3CA2050EE8C47DD1EE29FDB882A31B5 +E8116DCBA78D5B9329DF559EE4F7855222AA01E676A7CEE978D9881121BBB96E +DEA72B73FDB70E170B93BE01C4159319F4FAE38ACA41966CCF60A8F9424C098E +69210A0ADB89D2CECD169D5448BB34DEE20D9905BAE45DE37F41259185F8B175 +B8EB2AAC102E05940B494BCB1F3B79458F0086AF241B063D7EDDE676BEA3055D +E3D18A35A848A22F9B4B79DEBAF97466F8158D8E782331B673D4FF9C12177DD0 +CD62BCF177DDD0F950A8652AEF529AEE43BD52DD513F8D6585B85F4896B45B58 +6F0FC7FFD12BAE6B0E477C9D6510F6E87E3B4D75C9DED5592CE95B6E8ED406AD +D71F59197A116377319BA68A214FF237B591757AE362289F2782350C12666847 +91F72F0A88E56827097522C55B3F44D76ED3EAB90B7ED0ECC3FEF34DC3C0D391 +6E06E03715926E3AA986E3C5DC076EF9CC0F5B71FFD3F02ED339B1CAFBCB04B3 +D7B17B617003BE14730CA3341A003EFBCDC8A176BF4467440389BFDB7D331823 +CB278DBE285E6732477E017A2A9B1AEC5C113A491EEC6141D7B9C435091FAC4B +6C393AC995DC79F0046B3CB03CC01F714A30BFA08052C0BC7C888B1E615AF648 +256AB8F551EFB544240131B54C3415265C6716F9E852DC4973525332CD5B181B +A4DE4E041BFCD79E978E572C2A53A7395F23977E60B61057111B47AD35A580A8 +769AF52AA9067CBE946298D77FACCF06BCEF0514943EE8AABD1C54B9378F0BDC +CFE0D81EB1BF9D0082FBF97648C763009B41E8610D6904DBDD4F1C5D82E6A663 +2F6F7C4F99B83C0A327A90E16092E7963848B243A7E718E078A209B1A830D978 +73588ACBD3E1F872900D4C3879524F139FFCA71066C96424771C19E5FFA0285A +D0E051214F11F4D7557C8B376B7E6DABD206AE08307F20F12755B39306B35011 +E5EEF050AF9118DCE00ACA6B266E66C0C63D579D7D90134D82268773D570B7CC +5E4C183ABB09646D3B9E70D06E2CDCB9EA0B108A6DA4E3AEC5733CCC0A14EB34 +1D39DC8EF3308FF55CCF1F736B2DCBCC90207D6D484216A28C5BC32775C91D2E +78A63A01BB22EC15E69860AF1EBA0D74EA154F044CA403E210291D18489EB661 +40786D375568D52BE04A49C51F2E294329192552E084BE826B25EC6A254D891F +6C34A8B08ADD1BFB2FEE17B28CEA54E4FD352E2A01C649D05BA5E72722D42F5F +A2C90C27FECEA6E5C21B0DF46E6571358C04287147DB535DC397A958A90F9A64 +6A60053642B8607ABC3EBD65B1A46F4B22017F945D059975D7A2A465E13651D1 +96D111DCA6B3AEFD4F3B5C0B51E968F9C6E1C365A390850BBEE64AF381E7929C +9EE72908432B77B9D58B0DEADA36802520B699766400B2B04AC92014D99C669F +FFC0E2127416F71925E7579213FA266F9803C197F2F0722B37C78C03A505C76A +D86B400C039466E4D2E2DC5CEE614932A0B8600811EE809E21446D12A4A30D8D +32C6AB1BDD383C05897CB4A08F719102D38ECD71359273F623865600455A040E +EBE2FE4D6D031A0F96FBD7CD0EDF88C6D092755EE07DBDD793FFF279D1C5BFC5 +4DB4D3E4BFA1A8850A608BD6F635A7AD717C45407607FEF9E14576EAFFCB5EFB +2B8C1B12CB88CD3D70FDD0458443046F85CE4DAA12FA4BAF6FB1673A1D3C48CF +2F891D1BF832037885457B4E46A2D2418AEE1B46C30EE4E524723B7842C9DFD2 +60A72B6AA65B88031BD577A546CB320EF9E2B980DB8E85BA6652FD2BF20BB637 +2753016E7800E540154727C01E6ADEB5422B91D5C20F9E8B2B2AB9109EF13F05 +15DA2ED05ACAF566A51BED58221EB434CBB6EC3CC34C083DCFA54694A1E9FD7D +2FA520B3DA37095B92844CCB2958E86484759AF1657B5B6966E70E21F720B0DB +51F4C3D14EF63A60A5383CD166AC41860949F52A9EDEEBE352C64DE286D9FA70 +7030FA4357196B56E8FF52E2264DD8DB2AC5057E448DAB1B828DAA153393C805 +A57328D0583339DD7AFBD7A9A5B0D67FA92C62046F8F9B2FD8FB424EC1165936 +486A469AAB12FF9490BA39D4AF4EB41D682F278423016AA6C173A2ADA81AB2A6 +919412F56463799ABD6DBCC68A96C67C18E793A4B84027DD9CC233310E84E4A3 +1941DA5DBBBD462F7C7605ECBB28F46E6089E9B911CBE04C207C579BD999ACDA +F9A39FFA4C396166DBA3A7286D8A6830B975CFBB9CB99DCF36A3057015218BC9 +C05CCB01B514AF78D5E3F6DCEDE6816E64719DB53CBDADDC52C3E05E2075813A +9238E39CE61E0C17DBCC3D5A321950FDFA8F7DA670821C1F37032E6C52EC0BD5 +81F698295732C4248C634449F3F8DD016D07583818161066DA6D1F8F97F09423 +E887B17579B2B6AF2F4D18DA593C0A0E7DCD4A21AB3D7E657D12E07FD63F5B23 +2F362D1664E293E7D85957D450C025C5B9B2E8889283D8C8D395B135AA50942B +AE668712615EDC2100EB5EA761360E565F06A23BFD436DBFFAAFAF6E583E84B1 +AB02C5418E41B8CDEEF026EE19139441F33DA61F28E6218B0F2C7FC79D2A3AAE +5C7270F0032E465BAB57AD5323F4851D4C231A66D4038562DCE696F2DCFB0F7C +B85AA1DF6068D85C017C5C95064FD4F0C3EA966E1E94CA3C9C9A76AF0B5E981F +4CC71CC9C686EA4ED348CE57AA6BD30A16F7111E092D81B6675F7EFDB30E4411 +C0CC449A53D60F13BB248ABFE7DEDD56A03A675707AF1B1F13829E41C9226504 +FBF20B944E575731B7FD1D1D16B18275E7AC756800BEA08B3DB6F505127B6BB1 +2E49246603B265FEC2DCF02330C86FBCF9C9F83D335E363744CD49AA4CADCC4C +EA2D570C6B130166F100436E50118D56630E2B596F44D37275D61DCC9C9D365C +DD280B1E3C50F7CA3CF3A7AE08FD2451ECAC08092472D660BF787D04D3C3B936 +7292F46A57441B15E7398C7A2E139DE61729D049484B9E9E29632795AF3C198E +E450BD4E843FFC0B8EB45D3F0BCD408A33F6B9E6B83E19317183654B196D9FC2 +BF327E50BF4F5CC83989D88683FAA8851FD91BCC64C797370809623DEA519BC0 +0F6637F304BE66317FBF98F8C700D28D74B643FCE8517454412D0F56D4DA901A +8C8890F98BDCC83B836F806A4BE2349868E7722D6D8A260FC3FCFD39AA2DE620 +E8F5EB6FD9466F7135C436F9E86937631BA472EA77E9FD4BB9E5772AF4E19232 +712783E10A83A065E1DBE7F3DC45CE16D1BB35113470C88FD7BACCCEE874208A +43D915B0B6D0A497D55D5D4ECA65FBBE334EA902D71766F00B1D950FE2F1EC77 +E4ED0E969DCC78C7F04BFE7D03F1113DD85A47FDD921E4714A59EFD829D62F1C +98876969C68FBA644BFF55B3FEF54D99E081FB6CBDA470A2952E29F52FBB59FF +778B2A9327D0E12964F34E1537E81251B2C910E6F75497A01EF0F24A3C85B421 +AAEB193514A26869B53A9C7974CCAD5FA2CD9E3598353D755B04597048C5F740 +81CB4F80AF5EC07078B84458A0EDFD58301CF24967ABDC5CE8B6A9737748C494 +0F16EFF7D430328DC9B04E0770C70E68BA005506E86737776B763EB88E64C5A6 +F5EAD4C4356F4A196900B9D3878A0DFB898496EB0C85EE207C50C868909D0847 +87E9D16DB5DDA440CAE1D609EDAC8D96E0E83BB67C74AD1271559593CB4733C3 +58D54577B35CB1CF9B954A9C422482682732835019D1FE22D6A0A6EA8950D25C +E30AD2985C44267209498029F8FE133A435BD5009CB0A8A1099E95B34BBAD9E1 +8FB64C79F6E1D8C09553B35A952ECEE66360621077435F8E6E64C1C6D7713BC0 +91DB1434B9CF86CBF48B2FEAA908AED5691CC81C09D87EFC6FBFFC2D1F79EE9A +836F333D6B473375BC8F6E8102B0C24700FF38BFD7025963C86218DC1E077559 +D4B80B68208E317E47E4B6816F04775C64DFBF621883955BF81D0DD586B4AD09 +CC10EDCB8A82C0B6D4A7056BA14A113DF3B35C7300D43772EEC5C0309A741CD1 +1A26C2C80D520DBD1EF1256B746BDA0D34DEBA442BCD33FFB6F103EABC60C585 +D885AAC3E1B6452B48A66C83F918E918EFA6034829C898440E436AF1A3D81AE6 +E74AF9E8F505D5DBD7BB58432C5AFF73C5406D78C8BD85181E5345803B2D1F98 +0C81540F82A04C357AC31E9AED37BD4E8D5FDD95B058AF5AAC0E1D35A7D11095 +31D1F8AFD1DA22506B8E1B9D72D91BC9F19D308C7FE6B85C2B8D5109276092FC +718C3892052A890B3F785E57F91E83FDCCF702117E5E81A123C53218F4B74355 +65BD683FB87D87527BEFCAEFDC83C019E7FF741486E3CC1597B6A2E493D35603 +92B57EF508876C54193887DAEED97A41B66FB83412239066EA2E1C0617FF7B10 +8BDA62531DA6C6F8F06B7F150DFB3F6905A2B7076442F7C4780A41F6628E3207 +1D1FB86627C40A84D9894B73FFF000CDBBE088CFBBB241FF16C982353936EB17 +743EE092F93894D92E9BFD73E382FA5E618B21AFE8E593B35EDC97D82D5FF8BF +485605DBEF4C1C533AF217EB31852B6D05ABE12BB50F307C0F59500B5F89CA28 +D7FAB89BBFE04B93474B3E6E863F5BD37222A6EDFE81FC5AEDDFD128DBDC1ABC +EDF98F9D5AC4888493B4208D2B7C937BED3A271F4C0DAF78D3F5809B3697E28F +8C8C00C6AE930844D3B54C6C52E0F48DD76BF562C67D4B035AF36201AB990445 +6DDEE6DF82A8E4242787B565E8DCEF69D54DE590019CD5189053A04342E2515A +CCD0D4F3DBC7ED1FFC82F35407DB1D4D5A322B7957A40C30B3DAF4CF44CD096B +B8C19BE6005DB525A0462BB49665589DBBDB111CD21AC2F7B6AF3F61D6A97FEE +5103DBE08AF0826660BCCA78410A361CA68950DD6A0AE6408C5964CC8C73741E +4ABABF4EB49D61BE53561577CCF022347C3DFE48F5913E45F1C7E39A1747A0FD +E41B5800AD5FFCC50DA109F2B38743A9566FE6098A85D27C1E3C069FACD059A4 +7E4A706761CEDADAE28FAFD44A8C3F9CAD93CA94FAB838D8053CE56E0B0A4AF8 +CEC76D72955D888BAB4ED03271BFEB2A41EBD7F7CE463286D25F49894E8E6BEC +18346F4AAE8B7C2524D586C937020B6FEA4A69562275E28C1CCC37987E6CB9E4 +27F47C1B45D60889D8C40A5E3CAF5E67DDDFB2EC9C87142074CDBE0FB508EE5D +7F9ED4996F009B94E0FCBC38938DA56EF7E86ACF4ADC049CB2CFC6B9E2B4CA10 +699D52B2ECA9AB025A104109637D50744B218924373D1D0CD1138D516408B64A +DF3E3A16F462AF6BE00DCA51EC0DFBB796313B65D01E6CE4160E071B17979990 +D6337DB92F3F112025DFB0DDD1E1EC1108F55EAE8F96788A1894F59B525F9935 +CE8818B66542CD18D019EF18D77DB8FA541BB47445DCDDA30156033BC031C191 +5039096D293D1A34FA2EF1551E243E1D88A55EE6E2736DD1A725A06F6A78A520 +BCAD87F68AFC45540ADA3D8DE97841178A7FCC969C159FD2B6F5153F4912198A +A555B9250AA73454E9DED6FE1060661BEA6283FFDACABCB0207B3A48E036C39F +731833C66AE165844344678A3D9A70AA3910473EE01100585DC37E364C3DCE0C +E81306C3DF3C6EFAA67A8DA1F07B0D7B0E919F4C6E7897A4B3AE49A29ED10788 +83FAE69A32A97E36A29BF854831F84534C1F36D962AB49551028505A5FB3B84F +6F0D66A06D333596DFA8F3384D6C74022523B58F1E96BA619278F79B6D24C63E +138E241ED8ABB23DFEEE6B7B2B7E16568AAD039DFD22E5B42AB5B458FB8E7239 +57282147B69E6E3A3C5C70BCA065826FAACC8552FC0DEE5560FBC1084255DAA7 +2E8D48ACFB4C3AA1C28F0A6F7D0A6AC1293AFA503A96B664169944D0F31B4618 +C09B8D108D0F77B9485D1ED26C487FBB8B47F83F782A0206B625A4A81A350D75 +A1DDB921F0610A4DEFB93C2288CEAEBE0AC68F757D11D49F3052946BBF4B11CA +2B9171A4A18D8C5C095703ED5F10D93C6EA3B4E46E0C9E9BFF3AC1CBDEB4E019 +123CF2099D469FEFD70066B214C0C76C0B2E0F4110DCF2FC8E8619707E025927 +8D5E5CD3C4950A055ED20CF299DC3127B7FA0AD747533CE11921DC4F110B6ED9 +21B9BA08CC207FE021DE4CC5285829F47A92636B0DB68ABFE8E26A50E36BFD2D +C2641EFD86B588DF3AA72309788AE3ECFE10347F41F051BF51F54F05007C21B2 +8B4F64329200E21994516DF419BB3E10224A92D7E5B7682D0FB7097EC5672780 +77DE4BC4B1A343611F79CCF778793766CC0E01795A83B3171421F40A144966CD +41A188F56F3D54E6578732D53E21156993E78B903572BC184C87DB3FAE64D5E8 +597D06D882D5C0DA5F8F8AB03014C5886E836F601A0C4ACFF9EF81B986E9D053 +55BA66A303FDD1AEC853A9E30DC0C1F42E850C02FE9216A86E9527C1BED627D1 +6554C85BA07015A2A7A7F00FB51C14CC19DDB920C41DBF56DA249930D58C034C +BDBF98F17F143EE5C635BBFDD3BC81E4A1805085AE6CC28FE3EB47C2818C35BC +ADF57AC82D142E1AFB16106AB08A3DFE989519E5C5903F2D8C42B13FB114857D +35B75B239DEDC70163B181AA43D7F9B964EEF1E43CCC9959AADE728DA6D08463 +854EC66A8F2114A2200EAD92D5003C357C0B42C113A0CF1095D6375B613FD68A +ED6048680853B5621B55CA62EECF5C4F77F909D7BF361C53F8B90D853930267C +A79CC67A446B0087B2B4FE074C242C8F3D8F203E73B1FFDB2433010E00AE80B5 +27709B16EEF0EF42DDD56B46D1C0BFEB89B5194A2285C9C2F9B62541C0F86BE7 +ED1903968B13FDDE177F877EC6B9ED63DFB5DC4D26385BD85E27B86B5AAF00C4 +427FF5CCD7D539D7912CB8E0FEDFCD4641CFE9922C4A3A67A72C363A18E2BAF1 +15B2C145CA6A6C07461E113517D6383A03120286883493139D48E18DCBA93714 +A936C2232F79E6482E870BCC7E1C22355316A34D521EF8405E91BDC56C0F6DDD +FC53DD99D9837771A89B5B8CC3F176A2A9815AC1B6D2E43C394C43ADC530C84A +763886ED0DFB2AC863D8EAA55572732446A31953620D920AFF34E2590F1B29C8 +EF50348330B6C718E8C23165CD739392185CFB2970BC2148CDE2D7D3C1A244BF +AAD43899E41254AB30FEB10016E5F11AC0185761F73ED6285E041132B9F094D5 +FFCFB4C932DE1CB65666A1B7BCF0A610BBA9578B8414B90FE0F6D5E83C8B9335 +D487A8380FBE1570A01B995284559454E89DB607E434BEA9582AF8900C1CAFA5 +9411C8BD17F37969432F7CA0E7C676D77511DC2037FA3461C763809022E1A8D8 +6646FC08A21541654A5735BFEA2FA68D9995AE458C11C41D563418A13D5FEFE8 +E7E3E3A601A362CA2422A749AA1B226D35110B03270B6C620F851A3F50D34707 +08FB5DCDB10D33AAD6728B0E76AAA7E98767D997F144ACAE9884F8DE2B3FBCEF +DE7463CED6C95DBCEA9AE9EA9E666B366C5FE334D03B0097EE7148A3DF2978B6 +FED5E4C262DB969A775F941AA6653FFDB7066A24FC6E19EA0868AC065D5863DA +0BACA600CA715BC1A23AB469530F4D7730131556FA1B3CF3C78F2B37EBBB801E +F108203B858D2CE1E432E9319BF6CF57137216505A8DF7F307E70DE9A2387853 +7C028D25FEA6C83C2558AACA0B903E4DE917B872C8226FA349F587E482ACC697 +2F8726CAD12A19032AB62E3814AC6D2C3B36C09DD4E4D8B518DFE2C21306FCDE +0F030AB52B41116486DB9E5BECACCCF97C0CE60CA33F5E81E2B1E118F79F07F8 +51F02CB58E8F9C63A81D61D6AE819C82E5F473C9AB135AFA3495C8363A3555B8 +7EF46153D5D277B5759558BB7FA70D96D2B0F26EC3C984DF063A14463DF7BEA6 +398F4CC4E105522C359F8352D6A858A7AABA0FBB87168C7D00D96E1B3F15AA2F +19F1838AA08018509DF7443DF50AF59511119F193D4F5B3EE8AC9B2FB7D19240 +CE2F356E4BD77087232CD182E5ABAE8F6E5C47B5F26F4EB75052CBB82F3A9AC8 +FCC913DABB75A51F49247BBE4369FC52A6A24344DF6926F3DEF4D4A2847A583D +FCEFA3EEFDB13FF245D6A0B0D1B17BB4A1C4D6E94D577F9936B1079766C46960 +29B365FA82CAD68EC00CA7A4B89B4F06BD1B0790B22C5067B2D26AA3F178C749 +A146A1651DD02F0397673C670E06E6BF5EA920FCE3FD23BE3DC25D9BE67A168F +07B8D5EE0A2A97DDEDED6A2707CC2BBB455A07FC27258E85A640C51802B19ED9 +E9F43E95A190486D28B70FFDF5D89E3326F9F8E223470849C3070250A94F854D +871A511960C2B4C857AB6B83C6F56E99146C9B1A4FC2D3D192EE0AD1B448F573 +7BDE711B9E3C47EA284063F1F8490A6DAEBF52677F8C20EB7D6A9086084296E2 +AC144156509A91CCA3DE861398DEFF7E74C844A3ACAA79B860579AB910E5E1A3 +4C5A81109B1BBF9DA1C2C81928353A443031AF58B5E1A545EDC5613CB726B3E4 +169FCE4503C5FF09A1F402F99D4EBF27B3D8DCB127D6BD615584C311E3C1FE4E +B288205B3E9281BDBC52A949E8DAAFF4FE860943E7810B65B4B000A5D42A6F01 +10626E1596DF0C854CE2F3407FE0E864EF4138422F16CFE2C65525E3972E42C9 +A27BA1895C8F2C386FB300CD73EC7DC03EA0846E3DC5B843C1FFAC25BA59F47E +AC3787E294EF256061CB16EE09FC5295F5803BD3F24F6C4188E206EEFFD2580D +94BCE1E6F9C606698BDB3218301D3765973C2B75AA913443CE6B1D7438F805E2 +5D5ACC016A8DD0B71E5D7EE45E019C0B7BA0C149B9158021B6F472426C655275 +C645CF768BAB03DC70A9488A06BF62BA784F44A74CAA79E4332DD8BC1FDD95DC +3736404A100258673E4895B8E22B1A123E0919D5CC599CDFCE0BD96C10BFE421 +0CB3A7F194A2442E2AE8153C0B531D05F1704C4C63F8CA19990EE5A7D08176B2 +38839E6BBE2CA42F629F7EF5163B64DE09462BE9C202455EB083C529F48AA41B +7E0342F4C28AD3DBDDBA75880CD30B272A212B5C3987D27EA1726956CBA39A5E +4C83EC82BBDE3103C0BC11B5E03D951DD80D863D6AB24F1412B31EB47A1C92E0 +038E8796D09C6F32FE27EF73BAA5718CC8D84178C53313D4FA7720E706AB0B16 +8D264C86CE1CEA0DA942FBC8DF04241F2F84BD46A97FA6CA390A8A791FA8CA47 +085D532C8B72D9AC204A8F2711CECC595AB286C4608FBD36C82A2FF545602010 +41B69445CEA932843CD24B22261E1532E848148BEA74579989C0F3450468BDB2 +11E0247514C2C2ADC66820A65FB9C7683D50D5961C2122CAFCAB27AE613DBA6C +911BCBEEA62D981B55615D47FF6E49C7348A680BFFE06EF9DE6E19DAD5424965 +DCDA1B655D803CE8581BA0AB7EAD32B7EC4C9CBE0BCC74DF132F5EDC9D50B438 +D87A96B3FF181058A150FBA16390766BFC98CE986C3875D8C6F15F78D88268E2 +42ADD540D06525B10F6E80F114E8DAF907F31B639FC62E1B824F3B245083F708 +C50D9CBD333CD4BB33F0AD549BC51BB611DDA9CB4520ABA377847C5F4C7644DE +A3AAE8A48CFA03011ECA539AE646F47988982E09DFCDDB5E25DDC32772885AAB +BF9555F6FF946A53E9656D625DF441C32CC63137FE4AFF164836EFC6718A8DB7 +B4D81E86F3D4D1A0DF6DD22ACBC23A2ED878B9BD43617DF539EB4431E7E49CED +22EB650937C1188C750CA36E20C8F374DE68B7C79007729BE085772F7A3A8DBC +9BF36220846630924F317CA350E9173D618F81DADACFFDE09E710299BF6001FE +B5CF89F66F623A5F7CED70EE024B8ACEAD657F63F7CAA773B59B5620E72FC26B +4678042E0BA4F75F5596600CCDFD7972806E1F3CF64C7EF3D88240C4A2A8E81B +07B93F8060719905C7F7E877C4FCA35F46ACF97F7128EA1FDAB570ACC9B8CA88 +957A8F91D301336210FD59D3C5F365E822B90076231477F49C3CB4EC2792024D +6864AD523326123254C7AE2D9C11D30A4ADD2CB8D8CA14CCFEE0FEDC8C49D2F4 +99C69EA518C7EE58E94403C4C20DB99DE800588BBF79C27C3A6F03D653F3C15C +8238B0E8E607D425028405BE81042E33EC2B5595677AB24EBD08BF1858CBC0B0 +154D1E3CAFD2780D6A73BF7D8DBC5B800D4328E4F14955F6D86A2F5934A4EC50 +B2D7ADF53A532D6484677807839039F9BD047FDB0680C50BF89D3924716F80DD +0B421DFBCD32F4A7C454B4B91C6C8639BAB5598951DAC178E2320BE563AE0F14 +B96CCB98F51AEE99B83098EF77FAC10D8B88FB29B839C094785F46A377BD655A +68787E5A6DBFE78ED1F304AFCFBDBD481348A65D004646E03B5AAB0EDA67A779 +B9014D14750AA488D8DF9C9DD347AE5B68DCB3C28986D9F09C48612B8795BA3B +702415A816258790947FBEFBE2B85BA0913BFF1C4F35C7464DCD0EAF8397A769 +8677C8DA5F89253B1C3AB2F41C3C5448F17C5DCCB18DE110CB9020B9E26F0BD5 +E0806485FDA93F3B54AA9B9D445090A23123BB399318B4771EC426CDDBAB6BEF +8E24B165DEFDAEAB660649754283A4A3BEA95522F058D118C7892EAACF376CAC +877028063F1C0429B5AACC47CA6874B8A83C75B78A64D21CD14214EEAB0F4FB4 +D26FBEEB479ACBF5740230C9943EF7B6983AFB683855A877CDB8238CCECD8156 +DF9271A64D6148560A81EB5DE5F20564E2EA814A974DAA436AC36F107B289E90 +111B28D488CDED75CF61C3FAC18581D21E7B517271FE4284CFD0865A6FCEFA3D +E26B649A2F392FF3A6A0A781E090FF5A98594BF0341D065E8E68B0A0969DF7A5 +71356D718C2933003D218218BDB35BF0AC541180635FC8CA3C777008B09FBCF8 +8BAAE9D764AC5A8CA2E88E11247E8512B6FED52E7C2339CED4E4F82BE578E342 +6DE6129998C520F77AA5032191A68F101D9451651C003B33D9A0DA25E241ABA3 +A29AAAF4B3C81DEF8C36A52C0D8A42999B63199295BB479F171599CC952C7F59 +B18BDA62685B45AE1CE46CCE2311789C46E155ACD5A8838C6E392F5CC2551401 +399F83BCBD4DB6BD9DF2EF4676D900EE843BD07D9CACDBAA05855AE2F7993A7A +2FB0937F06186306D7C788FB26B536C1915E570863E5FB2D91C63E6FDEBA34D6 +A2D27DE682224614ACB3A799B3604026FF9F9EE56ED3A9380E1BA58057A036C5 +5550170FFA61924C47BED31688796BEB3927C3CBDC9CBCAA0BE5D685D7DE241B +24C6EABDAA52B245BBA14D214CB61FF044B0EC7CB8731958F61D65D7268C7FAA +B5BEAE3192ED338920EBDE9B6F625E10CA87520C72223FDE13C7BD49FFE99DC8 +5DB87EA56CD6C06C8C7AC6C193340E9F913C83B62CD5BD580F5CC6B6D8C1470E +BD09AE843D9EF28CDEA143B7206DBAC3B896CA9D6169DD634B30C41D73310BE2 +DABB707A86A5FFE942BCC7A75FB92EAE77EBCDF26DA07B07D8ACE98C3277995D +B7B1198233DC78136FBE39D3DE9B6F1F62BBB311D451B46D7AE0FB28A3EE7AD9 +323547D3399AA95E95811CBB50C5EF6680363FC8F7C7E5230B9DB9815F8697FD +047161AC68896D17821504A87A73775544F932495C55174EF14A8350BC2C055F +E095F53B4955170A06721543827E3F1C90CF48866685B359147BDDF8FC42C423 +3A6ECC23FB9353B3B6B90C3E8CA4E4E930AB97B2A5B8E348F9242F479FB85CF6 +C67ABD6A09ECF1CFB93CAB1960FDBFDFE108570395385765077565E82107CCF4 +95612493959FEA678C601C03115D6947A0B14492B04053FBC7CCDBC058DA2D32 +44E1CB3FF3B4F3582002245707F20494E04D681627A2D084AFC1B8144F5A21A5 +088FDCA63E160ED588C28FCFC523623415D2632F2104245379D9BC5E067E63DA +3A320036E60A2A65F56997572166E8E6DD4AFDB39F1F84AFF1D5E05366F0E2D9 +0FF1BDD6A98C9405CFB576E4C96F747E4BBE12569018B5123CD9EB8A5C0CABF4 +63833B489B792596B97231202AE359E0D9648F7A350EA0304B7AEF575212C851 +788EFD372B9A3220E6C647A317FD31663D1F6E6B0F14F7A8EC8E7A7C291792C8 +A9EFD4191C8381B62E8BCC7B14C8755FE1613758E94FBA6EE7F9DEAB356EFFFA +20D359112A8CF8AA6EB2990DBD57020993A4C0D3BACD910A25F318009C253F49 +CF460E81F4B942F009BE7909AC9EF593E7050DA6F7E0588F7D70B7E5E3982855 +29752C3FED27CC39C420E8A1A27CC22335798C214CFF18359B85F84CAB375769 +035A617724D498437B8AC8E7C3DB12389DA206D271D4406913F37EB48C820E07 +245E5E87E4F2CF38FA332B539A8FC1F5A2162A1353DC27C2064FBDDFE12FF7E3 +9A6A7690B8E0730C0F9B78F275DF43F5F5FEB0360C0DF657152846DD8AF2186E +FF6E19B7E53E8F992451E1CD7E888417D3168D1299CA31BA75DC2EEC6DD751FC +FFF946411A8C48E3A5C98535A58FA490DE9F0C5ACBB228A5255C48BA98736095 +7CE11E73BF3C403915FA14A4A8144BD6AD1D79843688BD5BAC427FF96B6C17E6 +82266F1204D00801F0274E8C05587957458527D7EADE10A03C301578C8BC4111 +334DE9BB4B78FEFB8154CE0ACBB95316CF7B5A1BB4547722DDF513E013A23B3B +3899293091E25619C0ADB9B66E3C54DE2A257A5BE8CFCAA337DB1D7A01383F99 +F5457952EDA9C68E89BDF8E7B3F557DD20834C428A4DFA5B957A0BE481889125 +02751A25A687F5CC5E679329CF50F644BDDF436E1E3178CE27E0B87115FB5A98 +23065CEE85BE84BD37DBC82D94ECFD6FF88284F98848C73E5155D425609CA6D6 +ECC71922CAC6F81B37D3A0BED469A5A879673F4D7E623D77F2C9533417FFCBD2 +BB09CEDA826AD2945904619620E7A759BD3BB2E799ECF66FF19194510973CABD +46EE7FF5B8609B79469720FC8F934AB53A4A39E583EE43E1E3568CCB96A7877A +923F66B2F7EBA572ADB047DD9D9F25E01F7681A4B06C05FDB062FD346DC244FA +B3A054BD47B48626907A7CF81674F3535DAB490E275E776154471A5F8BBC9F8D +D811CCD6B26E085A660AB44533C4A3FE8B1511595399832368D022623D945C09 +B65F2E7B404E11A0BB3AE589BA84520F06EED018D09245CE627E358E24FB4690 +A617620ACBBEC71D374AC3C96D7ED04DC0893C1034226AC9D70FFA094491B64A +2EE7DACACD7B4712B218AED6786E85A97A0662C261E99FDD6322998B1F95E08E +D035A977C2DB94793DA2D90F3A14D4EC9A879CD3DDE7B874872E117ABB74A699 +16BE210CE77A1F4BA087E7E5E6F0666CA396FA06E9D7582105FA8E9B702B5654 +7323554BEC4DC645EF7259FAD81D36725394F94C1F1B0DDCB992F4F6692C879D +D8DF61F743B5BFAECCCDC1C7A16925D8E99D7D1BCA04A6ABA8E8327063B97FC3 +095EC36F6062A93AA99E39DEECFCB507BD677899A2F170F612785DE13B89C7FA +B32BAE429661C35EC5CA6F6916F6FAE1B03BCD6D1EB88DC99656BBC40DACBBEA +C5CBEA244B3A44EAD417B65554C8CCFD173CB9ADA94F5D55E802E032BE53F6AE +4C024EB9D647CBCD0D05F4CB0E49C7D1E9F573129B46E1168DA84DF1F7E9E657 +A1C37AD37489AA8509AE5B71C4183A5BC9726687C167702EAA26DC959B3553D0 +FEF8B04A46FEA60A7B66F83246725DB510C0D7F9A4C274BDF5BCB8EB9EB0A5A4 +52D7E328AE40F0E80F7C388EE93E434F2B6ECE185FE729F5C25F4169043CEC9A +42B0D432D25F97A3F4F2849F5E11B0F2D7AE49F4FE5C59C4181664F8938F9B7C +6DDF4EF92EA98AE49948AC5A70AAE737835C9DC33973AB817E1AD6C5DDF42BDD +5F5CE7EB9570DCBA106D45D2B31876F1C5BC94D2733E603D7DDC1AB7332E66BB +EA9A3A8E95B7372BCA6F841B22C2B6C914710373CC20009E07E417F709A540AC +78D58511DFB85F629AF125DB14480979C68AE774184EE8759064288C0E794D76 +E6F80729725D0A6ADC875D58D6657F0ABFCA16FD200C48A45028B4283E3008D2 +244706006EE511A84882C5CA0E307ED3A9A4F50450900684A655918269F1D146 +86656A3600C0391A4C6857F24B3ACCEE4E782FBDC0EB487A85A2B575364C905A +40E70F0866ACF299D231D624949692ABA887D56A0D94065A3FD6FB30E9EBC027 +755DC262C0912EAE5D330614DFC41F66B3B00461682C16EE71FFB95AC0670259 +8C58380A0ABB59BD43798091F979D6800E92EFE12F50B499589267198C9E6602 +5B4B6EBD6461F78D7F24E647F4FE4E4844460ADF4CFB5CF60B1FA0D42D02B836 +3615E35FD7E0E6866206485BE7C4BC920431799F14C89C17D4F82E7ACF1C012F +40BA05E3337D56EB9B56CF8444402109A9E3DF297369C6B9CFBBC781E17DEA3B +68886370468B45066C6D6158E16924079282177EF599F66ECA50BBC316E9935C +7C8047EB708F831FCD7EC7BAC3CFF9DF196CA7CD583F9F69A65676A69D957C31 +B98C1512D62AD24A9A860C34B9B5699BDBCFF4FAF504F3A6EE72F75F0AD14BEA +716C41BDC36A7B8213E98A57D120D5CD3E1009BC546EFFF690D73E026E7F32FD +D60ABD6DC5057B11 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTI10 +%!PS-AdobeFont-1.0: CMTI10 003.002 +%%Title: CMTI10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTI10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTI10 known{/CMTI10 findfont dup/UniqueID known{dup +/UniqueID get 5000828 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTI10 def +/FontBBox {-35 -250 1124 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTI10.) readonly def +/FullName (CMTI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 97 /a put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 103 /g put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 +5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 +8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 +EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C +02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D +46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A +4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57C5FD29DA32D34C95E +2AB2ADB3F60EEB0600C8ADE15A2380DE10AC5AAD585FBD13097B1A7E8E210D4A +EE96785449E07F0C8EBC2EC5EFBFD0897DFDC15E5BFAC9584D8DE95C5AB288CD +8AD8B9BEF0B8E5F887B3B0B331542FC8184DCCB753DB6ACEEF98B85756B988DF +CAF1AE0DBE7D37D5F44A2E760AAE3A5197C27B15E32275A64946C3E4D0476FD2 +7FDE148C788DD2106F7C825E270588AC05B57E625AB17BDD02306F9E5FC851DC +32A5A6EDC43C770A71419B2C0C8074EF3F222C8A2097CD81A91F333A521B3A09 +482A4FE1CB231CE344AD126AA284C3280AAC3AD162CF0EE241BFB4C8F20502FF +118507F5D1B5FD898571015E73E5CF2281085072E00D401F6F59761EEC3E8381 +1F26F75DB66C504AB6BABA87D121B1E7040A07AA2FE01F80DBC246CC03C4B2DC +C2A715980C52B7F96BC1A78FCC7F4F52EEED5F705E08FC1E5BBFCAD121FA88AA +8EBE58172C162AF409DBB0728F14923ED02A65EA24E5D52B6AD07777455A70A4 +61833D3789C719BA92E901232599767E423D5AD9C807670BE0E7B5CFF8256A20 +C7BF7214FFE0342809570F5966A2C43E784F35015D9040BA34FEAB6A6F089504 +3A40A9E9D711A2721D3F4998371430FB3C94BFC619559B97D49627BB630F4B70 +9D0A8FE4E916235335C3962F3CFDB04C4A3CF714DB5E260F4E66FFF2F27CEF2A +D4AA26BBCAED23B8BDC98F8F453BA27AD7758537561E766B82DC3032E92A9EB0 +125D98A22C5466AF069BF72A9BFA052A8628FEC6A6AD0B711DFFEDE3AA2D7CE8 +34EA487038EF50F953B8B4471CBA6FC3C53877EC1BC94582B1123EDF44B4056A +30F49394BDE22CDAD7F01951C7013D26979277D18EFA594E8F4F2B5E615187D9 +39E842EC28461B9ABA52020A127D2CB9002A673A435B13C10602EEFDBBA6BD49 +9DDEAB9E68D655443A5C2492BA061C1391A51592BA8C353A6F6A0708E8860184 +2B5D031D2CAB87D618E9F6F7A0BF3F66B3FD5A25BB91F7F1F5F99CFF56EFF4FF +0A35C55658001ED2E97B26C869292F6274D433A5443179DBB8EE987196306348 +3F9E87C6422AFFDD30080C9AC4EE7FE5E2DCBFEE4974331F4AAE479FD8806D4D +9C2B85FC69EB0453AD827A1E767E5C484BDFBF5C8D6E2B3C96298B390F22D757 +802643A79D5E29CF3AEDF0E12CFBECA4663444FC87F2027571DBA9ECF688BF28 +FF0DDB3AEDBA0FB28447CB4B5D5205F40C1E7A525FD7373392EEFFD910AC82D0 +98E71660A1B3227C4A2592F3E853CA4CDF64DF19A52582E167234F4036FAAAB9 +5446BE102DE2BF43E82F0112C2A20F15A3F92C6571AC761665A905362C4F8BDF +AC8705519C99862CD9C0D75113C4AB5FBB83C880E46B82715B5628890D9103AD +A2329638B95D93C4DECDC5E6C588C9D5183EE6FC28FAF9825F02DCA567306D93 +5440987A81B51EE7291107A08F201C609FEF91A8F0587E8B13D4BAF74A5A6815 +DE9E4441F46AF8E1DDDFA2D611C889614040B144A5EC064DEE4638C04EAB2E37 +4CA8F50FB8C4D65BB296DCCCD39F1F554CFBED96670A91F515CA10EF896874BC +8EF48C6447752C70FF5A06F928DB55586354076773BFF7E94C4C3A7A1C1F421B +A9B4E3936EC26E0C19BBBFC90F021E877F54B62108F6DD1C7F6D5B8E64FC9362 +E173F01BF2904B7E5A08B3543611562C2714099DE7D4FA330DB148B560A9601F +42A84452811CE213DCE782A0D7809CFD954D6BC1EBF2BA4D1B18F50FA8174C96 +3E0120E266AD5DDB40B3F6798AC28CDC5C3C4BC34583528F5B5DC8A222B80B59 +A3A93DC715D061EC6915E6E6E21A25425C25E8747C60F170D61047108826F96F +7830E220C108B441B6EA3198E33C49BAD8D43086E49F5A2BC7958A1A8CD011C4 +49045193394696EC3DDD0BE084E8F2E9F0B9496F035C0DEC1CE11409DF566428 +D50043CFF5CDD1092F6E0807E660B68163BCA738E8D98FC6EE3F713164CD204C +0BA84FFF4F33F47BC31750B448603D7ADB9AE92FA91AEBBBEC0DCD66980E6955 +CEB425ED07115B24E40F53B29B9D840842EAC691B4F591F866DF27556474B485 +1C6F53DD72499847109B16C7093984A6B8487D4F3870DD517945CD90E648C1BB +8A6861E540FCF9D75B984B5009B5CC760CBE297042C240DD624111670B703388 +6FE6FC0E89C6B4C88F51DFF3913D0CC1FB4770C8CBEADD4B86393605C0B6C468 +83CA5594754411B6FC331EF56D7CD6D247FAE42E966583C29239A8F862348D29 +60B177984B6B957E733DB4D275015691D91443BBB13C2DA96097A29733CDB284 +42F89C85A7A743338C9DD3BBC4EE53F695E5163E6E1ABE5791ABF100B198B9B2 +1C21E2FA2FB4AFE7F9BB2D381260CDD3A2CC05BF513AA1E80ED69FA27BC5ED5A +21445BF00BC2F997B356D94AF13736C6D3B0613EB6F4CD96A685FEB672661DCA +206105EDC3CA07900676EB2FAB37F48D2E8207BDE1463894DA3C5B1488AC1EE9 +D39DAF691648048F5D7A384B8927F8DA2BE3602669F71D80686E427F395134E7 +7ADCC611BA91AD4B7A0237213C60CF2C905359C90795230344FC3C50A22BD44B +55B2044792509F50F5C21F53D9F9E9F063ADBED3AB99E2613B23334FE8DF70B4 +6120F2EDF69F50BE793EE145B9FF9C73179DE640FC2ACEB5C6617F918CEEB762 +4CD81E665B2E544864D13230B058717B207D3CC5D6647D5343DB4D0356082392 +871EFFA896631A7E0D6477942B632074A9A4EF7B09D4701B1639BAAB4E03A40E +9B54A7A4F845CD63F88831EBFA4FB847847CB98F3455CB5957F2E0A0F5623645 +DBB5C5564C7F8B117D6E27E65C0F3EA81AE67B4AE4B201E7C4FB0A8364FE53F5 +41A7CE8F834C2C4B322809B353A5E63BBA7BF3B7DC1A85EA700BD287C2BD3FC8 +2832B0BB4695FC937FF5EF06FCD87DCE6DE793C2B1EE10E6450352C17726155F +220D550B1759E15AB2C1D5968E52C8080CD280E99D3CCC0E80C2EF8BBFD96001 +A226FEED7311EFB4B67F424B557A877379A15BCA54780F0CD2CCA00400B9B39D +981C6B552AFD2506D1B23618FA9AE6D8143CD7198A8482CB416CCE62B992347F +337D505A4078713BBD91E5535BD58EF0351EBDCD749CC24D4AD39F8CECD7D6C8 +139756680A4C03A58B3374CEC658D30160AE4863A3938A891BB59CBE02BB451B +1BA4B2B6E68AB61DEB85F95E3C909B8B66E220B9F18280161C279F10F7093CDC +100A53D542F071CC0A5AF834DC1D18738F5DD62A5573E884E1FFD22BD810828A +1EA47F8218C15A2E97CBC609927DA3CC2B802EA4A0D7EB57627C135E3B065905 +F97597D818A2C5CC6F328AD25AD11FA50F1E4FE637980B7474D6F85A521892FB +72989AABEBE02A2D0EFE88A6F67AC29F5D8DDFEDAAF465C439983C6B84389FF7 +A6434462BEB7B07DBE4BBA61ACD4A60C55B5C0AAE527DE381DFECA2E6BAFDC8D +310364ECB42CAFF72BA93C067B2F02D1CA7C34AE7CDC46787A0E234C8BE8A928 +7A6F3DDE0338FAD532A9886E8E3525B85DD39364AB03EC4C0DD25DC179CC1989 +1BE232E387E857C78332D834679195E10F1E7B87B7966DA3B2238F53D1E13FE2 +8F55ED6A92A750C7250C9B91E29796621E7E9520373214D7DA81B2875A986D33 +80382AFF6DE1F829F048E57664D9C4ACE91E4684A51023943A4964AB5657D610 +3A5405EFD4CFD1EBA684243E15093C9667797BB47617B66054EE02C41FFEC45C +C1BAE8AD56B00D323FCB1D2744F061FA16E161988741A319B1564E04BA210996 +4F9F02A3268CABE450D166A763F5284954564A1C86B76544C5F5ACDFE0D758DB +865A1CFCF9FE8CD5F9C3B2998C56468FD52DF8EE60C6935A3D221EAEC7714E3B +301371C7DDA0B03A2416238F2B47BAD3A2C5021C886DF51C695AF9C87A864B48 +3BB3FE0B355EED5454B59B25A0D8A1B8CBD356C24F64D9B55E16C30C011365C9 +1E0380753BA3EDC0868788D5F50B9353D0227BCEE1BE36998B2622C0759BD66B +E4444250589F9CEDE766D8B940770CB6B89503E925B35C00CBEC2873D2DC4A29 +0823FB7A3717B69A7DEDBAAECC067949932728E89BEECAA91DE3AF9BF070B9C0 +30EEFA8C0A55C8388CAA2F0515915C98E67FA095BB98967D14B0DCAFA9622E4E +2E0EBFC768D80585ACDF28D8A5C2B6EE2FE7AAF62FFB90F569F84A0903996DF0 +C1D5723366C436E4088F3E2BB9B47F9789052A71CF5C49908CDC1DDA194BFB89 +14D7E3D7D4D72A150FD6FFD8303E9DE5A97A71B808B8BDF2AE466F31BF5D7A4A +44F81230BBE2B456A221E2F72A8B59F8FEA8D31F8A005A5BD93B9F49CFDC3DCC +CE2B67090460F632271C7157BDC2F05BC2749FD562FC28682A616A52D1B67654 +DF78B7843A9EC26A7DE2EB168F874904C2915B97534B2D4D9F74A9573A771D34 +9F7BC855E8F794621BF6AD471BCC347E2DF5F620F5C209E33A4CBF1EA85AEA87 +4492A77342DD33EF615FF34037D660B713C908786D9022051B825226545827A3 +2AD1B05D654DB6E6D261B4E8AF0933AD1F0FCFC7201E1A7C1B4199F160C38676 +21ABA2DDF1CEB655B3EC3226E0B122976EEA998F7A5241F062E54AD1DFD6ED26 +47C99A439E0AE95415059179867CDD3F0FF751F3141309F40E00A6C7C28433E4 +F649BCD5DAA64177580E05C495EE7BCBCC5FBF104DAF360CC2711386655B26F9 +D349D887EEB32ADE595241560FD5924A1745A22E6A01DB9C285EF14596EBFF0F +03F36EB2E0A7C3864F819EF7B0855121292D49482F046A55CD7271FE03F02EA5 +886864D9D8EC22A68C23089EAEFFF03DED6484D8C341861EF8B6FD3C5BDF5AC8 +352DA4E13A1E30D0CB71E090E9CFB9AB2CAFD0CA7C34AE7D8E3B2EB4666834BD +9CCD1AC2108348AFEF6071796F4BB2FFA4A67ED917E76A109FA2DC2A30D744A0 +9AE653A748C1D18FB52595D84E87F1C1FB6B2F32667FE203262C66627AEFFED3 +92B23861E5EB238BB4EDCE09DAE1C65BAFC198CDD1B45D42CDF93E16BB82D35F +821E9E49067E966AFAB2AB52928F8DD6359984071FC37AA652FB834A09E5BD93 +3AFAE161140E74C6531E413E8FBBFC42BFE8A464B71EB1D8CAA93B33D7BCC3B0 +47C7EEFCD3E9FCF26FF9441DD9BDE68D77AD7251C06BBB9A2103049E8827CAF0 +F26BEF33F656A690235DEEC623CC519AFA82DE2AE16FB99F780FD7D8290DA40B +9B604AEF36B529FD184239E7D50561A07428D28E51B55546590A1AEAD4B7F2B1 +AB8C5B9022C1FA03E33F8F409B24911AB8BFCF6EF4A8E415263C789F89063E71 +C0910DC20347469380B7FC1EEB87D4CED7F4A361E58B61C91AFCABA35C03F978 +B9FB5257C31657EE48504C355CE893FE3C553274C641DBC4004F5D5B879CC5ED +D3F21F867F6DF054127067DE86189F0B59A1B90FDABCDFEE61423609D888EEFD +F4A1367129962110C651D9481CEDDB8C5C2576A59AED64E95F7ED042AEAE2F7E +81AC0C408E593DC30DCAC334EDE9EE27D932B98F040DDCD195D6155607DD2038 +970EB78221A94C52BD4F0EAC65F1FC10E5DAA93C17266F351669CAE56F42B68C +6D01E1EA03AE554D63CE76D800FDD9CFD89F80A241EAEFF7EDFA41794EA25CE7 +97BD5028464D2CD45B53834B4AEF8BF0B9E7C6ECDEACEC887E8790A47A93F668 +A9095E5FA1116A122C0E5B74E2226C654D3187C6CFD8807917820423DA3EC1DE +AA020EEEF2280C44A15209EE2F3FC1776875308CEAD38571E7BF889F287E4594 +971A83605E0B4169D4A23EE790515223DF8724054EDAD905F57918FC0BC64F96 +514B4BF7DC9BA79E763C22C977FB6146B10D26FEA1BAA7BAF21312F78D1625A7 +8E242D743471DB5821408AB786E4A7EA9D35E30E85533C617689F95758FB2C7C +392E759C299DCCE36689686DE0C4DCE32649493650BA194A6208C5EAB670B170 +3F2C70BF0EF0E3BE2FB0A79224FF4ECECD6BB3388C6D06867A0E5E3DB93C1B2F +464C23E44D3132E7D4086E3B59B1D13F49EB4772DEDF8EDC4F603217233FB7BE +C13C28648E9AA51D53F11FB896839F97AEDD8834BCA53CB0021AE91FD8E95E2E +F8A094093AF556B9639F508A401542B06821FF9DE1A745FE9AC5CACD5E8E1053 +911442FC15CA5333751ABFE2C617D38FA1DC332BFEF44AE569DC631C93EC54D6 +261583A695F5A392867A57F59B741EFCD2DCFECBC55D1EA5F2317601C9DFE9ED +D1EA466210FFA905A8F85BD58B98991BEA58DFD1CDED5C9B086D42CCE632DADA +147941917B879139E016B0DDEB8446BA017FC8EE5A354533D667B0835F5D027D +C2D580C16B80B3D05CC92C0465CAE077729F0A15B2DAFC89DCD349B3F81D0516 +C65526EB5C10E45A8A85D716EE35FB9AB201FD7C89ADE5AD925A174169DA20FB +61E96C73A143DF964C20589EF24A0FCFE6195317F2FA0D2249C0D8E649C3D9AD +FF13332EA2E4C9CD36D8443EC8F027B61CEF92C6A6B72DD4ACBACC16E429A9A3 +F5F29C1631360E32F8C1C93ACB22F810B86D2969A7480F486F62F8488BEEC74C +2C1AF13BB92BC578E8CD30BEA6BC8CB68ED730F54CED0167605FA76AD7B7E88C +7AE7688E598F91C471BD65A542E96D64B1EAF19FB4F1234308C48C2DC86E2193 +11ABDB4C6189C6F201627C693691A86DD07FF55C30FDB3F72381E09C6080FD7C +9182762E5001E30F52A216E0B71E4D2D4E2F3B20F95DF3A11FDB2D2B5B5FAA66 +C46226D5E0C77066349770514E5675550FAC9394FB27CD2C2F974F1FD58C04A3 +1EF53A8AB3B2202CCA1CEFA66228E1480A0709436C44BD3319C40CF888AE4692 +5DBBB52B15CF3A518F627F672135A24D5DB9B2EBEF04C860AECF231EBB5A3BF5 +6DCCD5E72FE4B6DD29E896691868A7DE4120AD06AC573F5608B8449B38E71CA0 +EB5CDA3F942482EA7973661170F81DC88D54DD5B92323F46F833DFA757107E9E +F62A47CC50FAA1B68ED535C3E0E1073532A05ED339C8D70B3B9864808ABACD23 +AA95E9FDA43D54C66A675FA074E0A5B8777D3C07850A09087F36852B5351F35D +8BC4DDFCA35CF29CD5E3DE118A741FAC4DED36847F2E2C6CFE08669301722D94 +376F540982958074E7F1383C409652F6C99DA39FE90B38221E75BC1ECB93ABF6 +B00F410A0C5651DB418566AB350FDA1789AFD88286AF3BCB42B98386F7BC144B +02DEB8940D20A6B3062F0C4244EABC50923390064F1D027A8BACC3DE45156E56 +4A942D1B87F1C4A76B0D4D6801AE792CCAE3009BF25368B31B6AD5476FBD3BFF +9759EF463EF5E78E10B7BF64005B2ABE0E8813950A08A1808587A98E0021D0DD +751AD515E8278F1A0759E85D8A084490BBB0F8206484AA36388B1013643D3198 +3509078847BDAE08E76FA5BF3E3A73C323CE093DCC148E3C02C2DE1E26C94D5A +40EC8308ECB02FF7DD04EC1005A2A0DC74D4E587F10A3EF349E828F69FD38962 +2F0C74D5DAB3ED6CC9F97008ACCE74C086A503948DEF1AAF58FC8BEC703CD360 +D32098A56AC776B1BD08442052A2A4EF6C8798F7CDC102AF1A2009657254762A +0793F79A39DCD6ADBAA5EC84A7ED6018BBE727E5D477893D84F157074B24C13E +8D4881C7DF8ADC13EBA0D89745EF93B7616EC5355600BB0D2B630AABA3CF2946 +AFFD0B2B724EF0F28393F2034B2E69DA5061426805353EB4D80E20739BC4C510 +6C45275B8261DCBA10DE1D104B12F46ACD230977EE7D7D1D35D2814139E38C4B +CA6937CCFA653349B1EF64A98457F7B4B5D8F2978F16ECCEF7054905863AA46E +DD524CB33459220C71E9EFA7845A3A760A507B3D3ABC525B35930B613710A13D +098832C58EBBC8B0CA6AD516E6385792C59220331D0922A1F6F838A8DE13C337 +900462F952EABBDC2EB1FBF94A66186C177501453CD3FE3582073DD86F04406B +41B6AEB440DA475E13240445D46726A6D45185D56BAB8807CEC8A8F7CE1AD149 +7CE2E1BB5DE4E5B9592241DD136479A65905FD0062C91DFF7349874BFEA5D9EA +2F610ADB9AE7757B2307A1BB9D6797D9F9C4844A59841C7C7682105E23A374BC +A91885E7410F56F60C29AB8B417E2D6092F8BB70A2DD5DEDD4BA1077D7CC62FD +EA43428C6F79C332342E15F75B08A1ED360B3511F823E75AD49BA7AE63B19238 +2AFE8FAC2715E2FDC895E95036D23127557837506A3B542B0E4651CE2B89C252 +31EE8ADC26E2C04E8E30A9CA12F066CE01953BE7867171FF6C7E834742C36C3B +58E74E4B482CB85FD4D24DB03D753F260A585D552CDC9E1941446F2F5B45FF24 +2DA4932B973139F328E7E92828B900BFD398B6F41DAA0D6861C66AA7F5E3299C +87A5925CE0E0F9E09AAE0792954A1F2C0AAA8288DEEFFE579E38A3CE8A943EB4 +55322A87C1634074EBEC25F724DC1BCC1BC10458CA6C4395659B0DB6B612C151 +557CC669D8DC37769E59A5AC6BF061C79FEE265DBB59520EB8FFEA273601D1E8 +2984B8AE31AE343F37D03E2BF97DC48AFE50BB6138C7B9F9B5E28672A37BD8F5 +8F8C98DC43DB22C6537028798198E2D3B0453ED72487267D653DD50F1BBBDA92 +833A987A95FC1F275B90B581B4BB62B6863A4CFAE37F715EDF3EA5A33679FEB6 +4847ABB4B3D170C275B9F1AC3156D731198DACE0B051674E85B758500AC9FBEE +ECC75EBBD85F8D62AAA328FB09C6526F853077AEF7EFBFC2B6A29D6D508B1E19 +EAFA4C67EEE44045B9F15B9762B3DDF5CE5C18B23A5C2F73A1F6DF7F8679AB78 +843AA41FD2A7DC02B45B729EB76C66A89F5F76E5C4A0C0563B1EC5E75D72EE35 +A7F1FC89216B60D82F6F2B8DBE85E4FF4D63712C689E696F60B52AB622C2A4F9 +37C380775EDB72638D3F81F61D8D74C76D813DDFFF35ABD9A502F2BC7FF65754 +2A8660A5A53E0CDC2E8A95B6E33CA153EB711DC796D313C8183D707D3F0E3EE8 +BA65E0FCE3F1C07F3D93F77056688B5496AE35A6BA0B59619DE78640A8C3F7D9 +7DC5E94894E1E63A7D80600B945B1CCA50F1B85F57673C6CE09EFC4E229D4635 +48AB466118D273BAF7C1B52A067A88C00EBFA7FCB378F1575BC0145F294E6F7F +8007602C6560476FA20BDB91831B22404DB1C4C167594B1216C25226D262FEC6 +F5D0DBAC4B8D743C669CFF2068CB9BCD2DAE8CD6EE1B33BBF7514C4941AFCDD6 +89B75F67339B25AB6E267BCCC5E2118879AACCECB5CC2865802BDB4D7581F5A0 +E81AB0F7AA143FDBE743E16D028E46BDA94AC2CBA77DBEFBFA32E462EBCDBDC5 +B86B63333A0C05C65D4B351948D03668F7A86A8A1388C4604675EA7384F3398E +49404AFCE19832C975A668FBDC29D06268085022982F01A2DA1DA8B8DD5F4584 +75F98D7606BD6A45A403CC026A4BD1AFA63E1BC1034C1F617E14A1EE9543BF7E +1ADB8019F7AFE089150EBFC613C414955363C43E0D82ACBB01251C070E7F1040 +602A58B2BF55094DF2BCD2689320899F987472681D0933A4BE78C2ED69D76E60 +2C437D4D3EA9C8D25588F1689224D92CDC65AC636325718AF7EA47946CFF07C2 +DC0FF0BE3642ABB0CC38BEB60E00B41D45DCEE44A71F11B99CC4CC22C5A0C62C +074F3C2FB093560B7FE9B3AAEAF3B563D1D646046174516991A196A915CE6918 +CEBF16946487E546C6E433A5C5B9FB7D5B97F2B4B202F892CF5121199EB48642 +4448B45EDB617EDB931969D53B9C200E954B4A6DA6617E3A56D72EF332FB941F +4694BAF21CAF8473EE2767CB5434E955C5A08DB04F67508AA1F5CFAE25FBC9B3 +9FA855CBF2DFBD04C656532230B8A2A0B33C7EC74BF3EB2877DA369035C976C2 +F3227355AE2E740152A344AC5E0CB3D04A1D4273A54A35BF8B1F247973158C4E +2ADCC0E93E456A8F099F28C99EE6497EDBAD4A0E7937FAD55FF114586FF56F02 +D7DE3994628E4816B2D15C8370B95E334D9D374A9C1B6C7A10E83874B380B6F2 +A527D6AE149DA8AEC229DF8964FD62D697D99C3CA805CDD28742348F462C2FA5 +6E83657F5587E0E9FBBD2540F4E14876CF5BE9A38270E56C85C0732DC781344A +A480D0BAD09DE7839C3CFF2BD09C9A9A80F985DB188B8C1689CC8A4AD620196D +06D17C44063A9CB2F30EDAE6DAE4FC7751BC8CB7D2B54CC5FED51A14354725A5 +5D3568B56A54EEFB5C20E38A336DD50BAFCB061B051A0AADB33DE07516535472 +379855FDFF2C07BC75FCE7E930062C334CE95B6B538CBC41B0322812E1E51679 +1716297E204395DA31ECBF6177CE515E88B4F4D61348CE6AAE02FD0F1D286114 +3BCA0B5199B0505D786AB3ED0CED56A180DA736C3EEEE8825A3BAADCE6A49117 +B0B754B2B53ACE67F02AEBC31A4665FF2B023F5ADFE660CC2E34967D5208BC6D +2F686AB71E897B3DFF0BEAB60E661F651F6BC46DC1FAB62EE9BD004B03358262 +32EFB3F4E4F7C13275442F3404888CF7FA12872A463CBBC52B993DFCC8CA0981 +991AE2D8738573A60531C13C0FC33A9309D9C99F3A68B7BB3EEB118E0943DE7B +5CFDCA5615AFA20AFB7467D2541ABE54E4DE0226A49A72C2DF120A6A1E9CD16B +143E9D3CEC3D6EACB409AAED738C066C9F8714E1D062AC775BD346019D2B86EB +21007D2847DC4F694FD547A5C1C3C8089E9F6DBE130C6EF07766D89A5BD25778 +27056E32DBF97F975EA2495B466D643625BDE7F55B35FA5FD47F2707F76A3D25 +9117398C915A3BB4B461972B136CE89DEA6304D5D99C043F3CBFAB9E1B68AB10 +D416CB8A4F7760D76F3750D41AB01151F36EC6E47ED148FC15FE7DB2C0AE91E4 +40222918FACD5EFE0F8A2093D487E9C7E840C25BFD2E49617FFED0B13490E86C +89A9DD5544A0CE6B49162B950CAA484227A5BA5C6AD796D57A7F8DF7DDBC1FEB +9CE33165B20539DE7DB2F0B4FAB376000013828B458F938375769B75DF7541E6 +21937987B397872B880D350D359A9183D1F9B530C3FDCE648262E1E10B8BA95A +D23B1EB3C38FC30A6A70A541A31E626427790AF8ED201B2F813DDD1AB47EA8C8 +370E1591073B6E128BA9B02116F28A929A0F34E1C12C091E4820C12FE47E31A8 +B56EC3E47D203D61DFFEF269A4EB9B7BEADE78B9506CEF4F200BE114A7669473 +4D16CCFDBBC2B8DF7AF87F60EEAF24BB9137E58CEF2F83F0E9116E9ADD2067DC +DB5C9E05440EA0DCE72F3C98B3E97D907B63DE8F2AB4F06A572EFA28A395B653 +DEF02B8BC01E79FDAC8528DCF05A1BC986C9133FE81B274ED656E8F54087F85E +9AE42FB250690B927A0378FAE0FC32602718E29AB9595A48B51E0914D9A5F6B0 +45CBD36D854AB5717CF8E645D7DDCE370D8B555B2DF0EB9E3CFEF436F4306065 +A8EDD52C19D9330F2518B1637D69A72DE1903D5C7D246A5DBB7D33AFBEEF9217 +1F8DFE2E5B3CF13AF8F74B728479B7E7D227FCF6BB618140E795916010E7A814 +F7CC8B76EA35BEF33551819D6EC75245FB5324775E1CAC860543BB7931404BE9 +D535D9DC60A9C43428E03CAAB2C5530DB97491A498BBC8A03361C0DD06828CFB +AC3E51B672D460BBE1FA0FADFFBD7B6528D96E0496A8F62C8E3D4AF463CE4D4C +3DEC985D05FF44FC710605EC1C7F2C77469E7C4DFB13DBD74DE4AB848D81DEA0 +B974766E14A6F2FAEC6BB1C0185D6079BFCA713481EF5872D53EBE1630DA0FCC +977B484D15B1B9BCE324E375FCA501D3C2EAAB0A366AF151DADB9A45EE0B7D07 +3F6F6D7B104411688787A811D525AE0273989C7EC61F4211B6E982C9A957617E +96933996835140D7F944DE6AEC922CC203C63798F0D617C1946047303B163B10 +2E9EC86E4AE909B7D5926F97BD05F6D4B81A5AB5F2CC682B02857AB89C9058D3 +4AB595E9EC0BD0AA10F4C35E33B6179A0EE971DC7739BFF1235C7669D098C848 +A8ACC9785237D6249D4DB97E3EFE29B4C2471A9475E1A9B1B238FBC5C11E6E67 +D3FFCE034BDAC6D8A9C679E06FC504375FE7C5C2CD713FA67A8A3CF2912A2A4E +AC61EF89F0D4BCCF3638857C2525E9666109A1D529DDB3A570ACC33718E43EF0 +62BCDD2A6259292D5581F0076287E1A676D1B971959A143CA314D558DA5337D7 +2241B07CA926C8FC0771D56585CE189318BADE9B63A4246A01DAF7B8A58899D6 +5D5E95F4E0E9D0DE0E7DC14675DE607204E0FFC429DAACFA6BC3732B0A3AAF09 +14D5B15F9972A0D4E5483CD19DDB3D4142994B6687D1096FE57725EE8342A3FD +62997C2DD51B51F4872C985D8C25827B40ECBA559450C7B275F6592704CA842A +B24F2F28E0A4D1B2BED9905C9D7D527B4A09C3E1F56C0B954F6B80308BDE6E2F +2CCA155B1E504D0CE5B00203A3DC21E281FB218340699D3D7246E16696EFBFF1 +C0D29066F8496F6E83FCC932AC2B66A12C91D27E7E7305C4B12B6F595F77664F +763EDF055907BFA90503B5C92F8B3B1D9F234BCE872AEACA16AA1FE701A4795D +93ABF4030B0169EF2084D46D96F011158139337D51822A3269827770ECC3B6C5 +A302C2884AFA7129DED8420B9E134EA54FAF797A324EC2310D777432FB630605 +AD3A28F2363D7B2FEA9528AB95C7B9B2DCEBDFA94D9391CC8893C9BC0B68D2D2 +7793B9F2DA30F6FA0045826999B0B8F8B103AC9F35A3174DCD3658A4C924377E +655B9A37532B3BE2109EBA9AF8CCD5105905934C28D9F8B82D413F1F8D844D1F +5F36F7540A97445D45D01C92CCB1C3DD1F11E3148E9FB14BB414CF383504298E +43F21314C75676E8B8F0DE47FE006DFDB857C015EEFBEB3795B27730693EC62D +B25EEAEF20F83E1B43C0E860024CBA717101F51049094FBAB4D0F991312106D0 +CF1C70EDBC10CAD125F46418D620849DDA9868A20DBA44126AAE63FB50CA16CC +6F8BBEAE9F660F9141F14162C2CB22AA9F0ACA1D977733E250C492CB0F281D0D +4104E440A2B60511BB701B6FD9B894909DE4D6399663896527DC894C0C99CD5F +0164897CD14A4E73C9B32EA4931A0D1B629C5F78DFC0EF737DB040458982F808 +56A5E2136FF134199B00782AA6B90D303CF3BD557A5127595F54155F0394B7EF +7B1320A078EBF18A81CF8B258345ABBC744858039176956A6A9FE480DE0197D6 +AEA79AD19158C9099DDB125F05A2D6591B9262788D04FC6C62AD3E1F15030EA4 +1B1EE0EC169C3B33FD21C55F75873D0CC4441A9ABFC267EE406E8F674636A1DC +1926B470845050D61E3B368731C0826CBD0C9D9652D87A166C3B72750F629ECE +42CE84FC05BED43AADEC7B2790E23983FFA6FE909AA195441DF31DE62A694AC5 +601ACB4E3FB6DF0D0672CEEBC1651885E7344B873A1CF9EF7E3712EEFAA5E329 +3FF7A2CC06427BBCFE91750070B65471F7F97AC3831F0234CB49C6E15C59C9BE +F528991410DDBEDE9AAFAD2DCE9060C3ED864CB1AFD6A46ED385A33918D90EDD +18476E09EA8BD621C5CEE1A171DF48BDC0E012A2038552DDE53D553DFE6B03B8 +1579FF629DA867302F75DDBB32899A26BE11B8F8575DC18D67922DEB40A3DDB4 +596879E4B817F39FCF678FCEB94B19C5AAF076D4440807A320AE1D2CAED5790E +3B2405A0C99736B7E56CAA78CDC63A3A62C462C9BE9FBEA067AEFB9F7045B6DE +DA819A42D2D28D9635B83F59DADB671D33A5AA6022FF8C406907A174EE9868E8 +302EE498ECF450911F8B4A06EC07B81468029A7E3CE34EF1AF35DBFD66B2E804 +26FAF5A3D3E0E41205F3584C5FEC21904297196C53A467EA1FE56E65B9D87A98 +2B8884E1105C47F9BFAA57AFDE233E09BAAF9C5A7DD05C45674A951CE1B2CDA0 +A176D473F1949221DEF2AA6E35FE72627DCD1B920B5B8CCC4E5BAAF3F97D8FFE +F15FC0B0D07E01B3A7DAC22DA34CED526708B049889CB600E61029D9C7D7AB85 +05E5C0D1D14CEB1248D8B889892B2A5B2F7C10AF3395A0EC02F9A3765FFDF0AC +17BF4202576D48FC88280A85495719114C0DA6D1B040C832D25C97B7C5A31D96 +E03F0E502FD0115D971936DB5A8808B9977D7107696041B997CF1C3CF3D2558B +05AEA679512B9CE6518DD10C408B83DC1EDACA0D0EA6434119AC08611CE1E2D8 +39A7354A2A24B2317A8C1C17E8E314BB6E0DFEC26AD1A43076625C96DBAF488B +4C76B2BA32DCDA9161B850B428D8EEA0C034E8C9FEC8BEDA74C552D78ABC253A +86AC5C8CCBE7658AE83374D417F1FCB5836AC25507A5B2B9FCF680880F72CCFC +43CC23A3019BBFB7E9FC6BBD00166F577BB3F1EB97BEE6368007D9A3671432F8 +F7754423350A5FCB3979D629AB52136FA3CF750E9A96A52F3E74D0DAF9249613 +21A2BF4FC21C9A8EF53AD911AFAA853340CE0E95D8096CDAFA28A1544233539B +4D1C0AF2B635BD2FDA2AE06485A42B94EC24CD6D08AD5FE186A4B330B7A7E2CF +7CAF7C929B2EC0AC0CF066F642B1FD77A6299F6FD50315A27A9E7F416D0A59DA +C5740A6AA35FB37ED7E2631784AB9427C71CACFD7F1BB8A08D466E40C5FEFE67 +4E81C0B6597B886B4E81BEFEE7501BD140C5F34653AB6443210E94B52B092D65 +0C86122ECF14BE14F3D21104698412DBA2B9186BE1F3EC2CC5721DCD12057E25 +1A95D75E1D173C301566B9CF19A092DB1F90793FCB1F0F6671C871E5EDDBB6D5 +2D054B41B59D69CB2C205F7E86C30778B4C254F6606F2BA759D08E4DBD800776 +69F14DAAB8A3BEF3A808EBD917970D254E6BCCDC98FC42C8ECAE8311822A18BD +765CF8F136485692B2B069359F11851F2AA9F9A14DB1EFBC34FCB46C0251458D +8C9FEFEA2723AD67668854A5A85E9E1831143D60194DDB8E8059344485F3B65D +FA047A29CC91CC45A3FDCA6677F836ABEC1C7A9029A0C7461DA9856C1D37908A +9992810D459F0598CC390135A481DD241E59B85938545ED728D332675BDB5857 +00DC0CED734A5D295D69C3657F8F32130CC0447B8D609D0AD9E97AF80FCFD766 +9018C9D1FC42DACFE999198F9D47A870CE7B48BCF539138B398662537EDA1E9D +2B7C7F9F75663CEA2960AB88B126A98CA16E3E8AC4F13706443D4F469F9D44F0 +002716FD449285518CD845A2E8BB824F2E03C5393E803A967955B7069AA8EF3A +2C49A16D753E5A34D7DB3688E5B5C116208AE555A23A13A91331E79541C56F74 +9A09E3A0123A38517511B9D4CD18F5230891AF7052C29E6B9E0AB664331CFEA3 +AC7A1BDDC53E9FE118307D548CBF22DC10017A3A3B606B9760CC286B6D05887F +357C778050E31D29D5ADACB352B2257234057B7ECC7384A0CE2097ACDB1981D2 +C9C4798FEA02362D04DBE745631DBF9DDBDD479603592BD898712A64FCB981F5 +B18423AC72E311461084CA85AF30F274D84468B319E675C8EE651A28F89D4DB9 +266E4513AE286EC25A6C5CEB8354C896C79EAE31B3D3E0D3ECB47526AFF2507F +0AD61CFD7C07B0D2513C2DB1EED8781C233EB06E4AE484D44A04E3B3AE2BF44B +40A6777DDB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMCSC10 +%!PS-AdobeFont-1.0: CMCSC10 003.002 +%%Title: CMCSC10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMCSC10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMCSC10 known{/CMCSC10 findfont dup/UniqueID known{dup +/UniqueID get 5087402 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMCSC10 def +/FontBBox {14 -250 1077 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMCSC10.) readonly def +/FullName (CMCSC10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 97 /a put +dup 99 /c put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 105 /i put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 115 /s put +dup 117 /u put +dup 120 /x put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BB89566A9BDEC70EB4F2 +048A6EB631F05C014D372103E37FC3FA317EBC9973565A638403DA02E48B7D31 +CFF6C241DC5CDB470561002FF46437C06EF93BC99352DF04393C661FFFBF4BA2 +0723ABD9B3E9CA9E63BA57EFDBAE684655CBBDBA15ADAE43E1A2C98A3CF060A3 +D16AF8FE3A49B50A24C20EEED716E49AF6013D4D38CD9CC41A91C17E4D04D79D +567E1EF49110AA9C34464E95D81A730ECEB2C9AF38FBA6B45E253288438B4CB3 +DC75B3A906D4357293BA41E59C35223A6C9CBD6FF5FC90C2D07CBB376C7320FF +435A6251822BFCBB612CE630EDF826C37E95F541C21B93FCE127591D5E38165E +2B58A34AAE37712BC58B63FFD70AB80F4F24612CFD2F1466BAAF3CA2BCB45148 +D0DEA0E9B8FBA4C4FF5B8B3CB02E461355051842BD1C94F41066B9B909DB83B1 +DCDCBEF7CD00A43E4C0B8191A29600CA197F0BA227FB8309BB539D2A620BAC70 +8A1AB2DFA51ADC9873B8E5582DCD3ED154E5D727D1665F99BD89883D69E6CC2F +DB3A57AEB612171A88E22F038461DE03FC357F771675E34E90D4D19B4B36891C +9D2333960400E97494F4FC4DBCE6A73C34A0409E433BBDC0AAAEBA7D3555066E +1CFBB4515C8B573C9B9DD12ED5B6ECEBE35AD0DDEA9DB004FC6CB540B5117B49 +59CABE5FD74C6F5B6482B42C20B5FF0467D1DBD7CED2CC651CA57852B6FBB402 +A6764DB342889132C911CAA713A7F2FDD8A5E849345D6C81025E02F5B8B682BA +90CC9B467FBC37362436EA6BF8EB62D784B01D5430147945BC09D1F49EE89F2E +3E2B8E6D439248A56F82F2E03EA5C7A922F2813BE6538A3A423BEBC55B345AFB +3B3C125306749E137C647D78028AE1FBF3E1A82C260132832A9668F454D39C41 +736717DED0A99F6B11F005F0E1D07FE84713AAB4C042FDC166AA146D7B5E9198 +E4F485BE5B135EA281FF1C1E616B5AAF02771F58C5840CB5A427FF9794F93E94 +17FD799C78AED1DC4810BCEF4C6C51D3C1504EA2C6F2B29805B7ECF97B5F637D +FE92E168CB9029E90404CB54FB312FC7AA8A9F2F524C03E61F03B1E31D4F061E +1677B39D5D30C9FD4673E1723F4AE3CCF38593AD6D7F61E9DF3C010E51F25085 +35D51105E1464BA146A78D7297D4D310AD91342A0BB942034A3EC0696B467367 +3E39D202D637E6B14D0EBCA6AD3CF22B07D4CA69C0FCBB6C93782B2F0DFC5AC1 +5D8A16CB5EDB671A0C1BA9D10F63CEAFCD0E06E42C730C8EF769CCFD57937245 +658F486036D37E8BDDE5670A212FB488A8753322A5B170C9662750AA958C0BBD +8E97D8239D2A08B30416504DEEC4E506013E037C91785C674F8A6A44E23FEE6F +CCC00CC5E4D355B0871FDB8ECD64F70EE32449BB5D6F84F8C8AA2D5B1A489BA9 +D7FF2DBAA8D0B84054E93D64D3E77850A3724824914A0F821EEC3D605DD851A7 +606936B8B9E24D6E932E16C448140FE94DD96C75AECB73850035ED9C04A1D93C +64B21E7D4657E030483EC5C3554AEF8BE4D0FE5B9743B875340B09E01273DAE8 +F256C50A1A8F2E0417440A8BB0173F59E11523E1CEF2593A4AC5AF2167627B00 +C5EA97D125EB8A4BD4C372877ABF10F5B7B149D73787E0834BFB3084E9508DF7 +072DD71637019599252059738D4D6BC57A9358E4B14F6AF9C4B31DB8E25C29B3 +7A15F9953BD73ACDE5F0445A5DC406BB4635FAE51C1D8202AE31730E6F355317 +1DC197DB0B6177307C60E5D38F4487363EE051B2E609A52BC4D45B14B6558B6B +5E1618748794B8340752CDBE7756C068975B559615D4CD5A97CE30BAA7B2B1A3 +2FEF2E055232B24FD8A21BECDE1B6A479A28EC80AE2CD16DB50B30B4A6CFCF06 +491C7CD5AC29FB964D4846415233947522676DEABDA0D9535F8507D33693930C +B4E4240A02B0CE7EA288516B8A6EF908D7F8BAF9012D052C6AC96D9F8F6ADB07 +8984F3559C5E7E3022A957982155FC9CD599C74E18328D3AB46F9DD15D1C4C3F +9B93ADB4489BA02CFCF57DE6270F3AD2F8597BE71786510EF08142F430EE5568 +4F9DDB792B7C46B6135E341DBBF062FBC50FABA80CD4A384157BAE57CBEA9781 +AA4416323265168AC097DE7E30A0D4750143A4FCE70A863A31876A8FA5327C3E +36E89589E363AA2B1A6E8B09F5AEB8FFFD0396067173465B6503383DE517A6EA +88C0FC08578398C2A721E5AEB29F4AC9BC990A50CD87BD35A11F9E81F68E7B85 +5E5B95A4F9A5D30379EF90D78E1E466DEF867BAEFC4F5ED2C762BFF099C1C2B3 +5E0DA1C2FB33BE1379413CDDB1EE6BB3A495331F72F2FAEB8152E8AD5FD334A8 +AAB0082A71D5574B618EA8D487B8FAF1B445F3395B1E21224F5492A0E06F5152 +7726835C900E2E52BE3B7B654183AEDEC68053DD0AF19EF6DBC10B6FC08EC7D0 +CC0E2C8FAF8C9A4C21FB7C34E074BBA4EE64226BEC8C928A784C1BEE35B72EC8 +E9295240B29DDC2539CD118BAC38DB3917D14CD33AB45FE47E827F2A2B193AFF +53C5396C52CEA4F43F06AC2D08C74CC85D608CBA267175EC31311EE25AB48DD9 +FE811B411AE426C9FC0B6044D1EBF130231623F1566CEA4D1C06D8032FD9808A +94479C842BC41B675CF6B90113BD681F8D43F51D5016D80EDC11D7640FB950D4 +E709A46184406ED90D0892A4CD9062938A8205697A200DBE1F38EB166EFEA0EC +4FCB45CDAF82EA103DD6FDD03D146F3E42EDA6496064DB3F4FC1C5280C9E604B +D5EBCA08BF2AAC90156C11EF68137DC76502EBF216F3AF3EE30DD2676D218428 +F41C655093F8B530FCA378B5769F262A6FDB4B66B83F18F050E77227E28D71F4 +5F4425CB8D51B3DAE872CD86D7804F870BC564A6DA1CA13EDB00D131CE4F6460 +7021661B99612629DCC20C85CF155EDC5111E015A77B0B82A8FC1EBB374B7EF2 +361419BA93B857D5C9944BB5B4AEDD86ABCC261542077FE09701C96370168579 +5F89D5AAA08D700E2643E88C2FB8D1D56D37AAA9744872E7C050B4CE046B47A7 +83F224FA9FD311C955EFBF173042C8FC66524135F579B1397828870D5C9DC71F +8615FADE2A1CFAEA90F732B6C266E2F3048FC43EDA7A6B6D98E9DB793CF457B3 +F5877E7A055C92B0246FEA8C72B3B3456F93BF36E2651D32CD614C3AECC0B4BC +F824C8363E593A6458D37408FC5B09883B280005DD24123E2D4B1B85F4113327 +EEDD9186A4AF2CD6439B46C5C168C125CA80F9EE9E68906620EE126CFBF26E15 +B269838A54224EDCFE2A373EB750D4829BFA410DE5F1541E428BB1E024AF496D +F5F1C151F5A645C8622F2EF9088D57A2811868A8A8BFCDBFCE3ACB8463AC35B4 +8B6F44E1C1232805842F56FA468F81FF37D5D55B81CA56058558544C142EB3BE +07CFB1F75DECB1E48C14D6AFDD455989AA6FFE8B8DC54F462B3C20E31D270BCE +8E68E2B43A6625AC7E9792704FAAD6CE8BBE0B341DA7189EBB3E9D5375B27FD4 +12506D5BCA50AEDC6955E6C3C7BAA84BACAF7ABDF3A270C7734EC3C6EC22793B +E67B0E288F99699D38DA8B79F2D21DD97945FBDDD132A8F0BF947950D3C0B4AA +EB7B2C435AFE54489E1930610311D718AC610C21A644F34CB2D1959B3066F39B +EADEAB5CFC6AF4D191D86B02402B00D1C5262707861C5308730579795EB53207 +A291A27A8B5C4DAE0A87A0C6A260026CA3CB620E1002E066A515D7990F3DEA29 +0FAC962E0B82B7A6C86B1EDC54007822BAECED673FAAEF88C8109777EB79A53F +AF3C58546974F2F56E70E9B5CB59ACB5C27CB01895557B2D82134D7F02029B24 +3331621F38E68717F5CB68A8892D0B9C0A8ED4F8BB56E80505170D44C6856128 +2DED0254ADA4875CF56B4D97372AAE730D4C77A2940DC8C178274DF88A9EE037 +215C6FE7B9D481EE4DE809B124C0270782411ACCCF89906A8B143D0BA8B2CEDE +E9B90465C3E57A4FD9AD2702323450256ABD09A1F8C26F08480317C08B75B720 +70A161C99715A35A94DD5C9647ED0F8A5337B774C8E54F9653AC859485A1FED5 +37B725A7E4BA58711CBCDA6054E34CBD8E9F9460179DA7DBD243D81A1531FDDE +BF2BD425BD9DBE75EAA333B1F5793669A215549A774597E6ADA16D323FE5601A +EDA41092730009A99BF5B5AAE281844A6BF3292D4D4EDE36B4FD8BCAEB6EB72F +AC5D3CD53D0D621CA9EA8D254FDCB2B5161EE9E80B266563F669805A3A15271A +0753983004A1ECC7FBADF62AFEA4DAB49A178C231759857DB910668BDB07CB3F +7E8EC24901863088B3231EE3FA563924032C91CA9D68DB398F9BD9AC0C651EC8 +9051C9F709CD784F3FF5951DECD7E869ACC34B83AECDB011E6594347855EE7F5 +28811F744A4BD70D4E9077EA7EC19FFCF612689F12B34332857AE41F13E6D16A +962DB9B6AAAC167B9FBDF0068EA13412F318384134B29F3F0C399F1973A3564E +F9C3C39B5BDD4C98D81A6CB476E565860B50704BD65ABD630A5F1372F2D826F3 +3AD47C08B8AD3176A170C369EF3CEEB190134006D6135C5B8CCDBE1C11FFF1EC +3F6D8C46E15C4F5EB9ED9F31A129594D542D40DC3815CD075A0DBB648D868AF5 +15A05C4BDB28BF23653A3AD96CF6AFC065DCCCB23D5D9A945F8CBB539DD3BFA8 +DB8F1FBF9B6F25B41EB4309995CA3D5D6ABD70CBB4A2F0C6364E5439AD1045FF +72F6B45A30BD3A548CFAADDCC6C15D46F6D783D3E520215751DC98335A4ED512 +D7D19235CDF911CC69F3CF4365B678EBF3E87C456A4E77339C74930083445588 +462529C22A96A28C5CE87AFA0C981F26CAED5A1C8DBCDDA612624DBE0373F026 +465185A4D8C73CCD8D71EE97116F8F7D341B87FD78F9CCB9FBDA2A7799711607 +6BBA855AE9D5C505870DC85FDFAAA130A351D56AADBFBD6A7D52055E3200F8B7 +8AE9A00092B55DEA8BDE224B4BA7FD4A191CB1FFC4CB995FEE1AC2883AB69E1A +AFFC09AB5B9AE311A030A5BA05E2213F9BBF016C8FA80689C069314D91274B20 +53FCC65C7D7B3A7504887525BFFA060304931672A078BCD7F269595686310E34 +E1ECA868899BC402D17EC36CE40D5041D7CEDA77F7764C9D98793F5334F574DF +E93CB10A5E8ADAE95CE63D2339557091B4B4911A4987CF21B7F1DBADBC2DD605 +8EB72473C1F2EABCC44E0D0339EECB55DA74085606C3F89D57ACFBF5755A5395 +CA8D4BD47E4EE8D8B882D3AB31A1F0C62E74654C7E041E4FF2693A38A9796064 +46526B0A37E6B5BF8E48E80EDEF81E34DA8F6CC9025936A4D0E6D709D61B7B5C +AB550397117F3F9D2F5A542A64DEA8E1178F7337124D6B56BA92F659AAD694D7 +391028731E01284BFEA635314A8DA8DF7A34EA3B6B2F8803BE6DCB423A9E8015 +55EBD90EBAE8A00298B3B6B1C02BA516AF528122C1F2B07EF69F5466C2C36643 +0D665D6561705509B7582D8301AF3C32E2F3B9433E3E04D62117C7E8A368BDE1 +0D4DAA1C415B2A6573116D2A169AFEF700A83F55D88813585E89C94C07802BA8 +3AE8F9BC3CDBFD9C2E35D062B1FD6E79E1EF104FC70B0AB09D12CA027F33F85A +22F0ECBB4AD55FE8C616B82C46CE69A600E4F767BD7A9C5F9B37A3196B038384 +5DEF76A8884425FE598A63AEB19FA698C2AF7CAA4983CEC789268E22BA051EE0 +20A40633D22D8F707626ED30E8273EAAD1C065F0B2E1718B5AC853ABE09330C3 +B0082A71D557169BC1559B6D285A3499D41C4CCF1F74884EC3917EB9C574371E +AFE8578DDCA459B8D22C0188A8D150437B05FB92022C95EB6FBCC954216B5FED +CBC7C90B9A1F061376A9840FB64390A6BA99CFC8279A86A730C6DBFD14C53C4B +7277D676BD42203677E9ABEEC8C97E13DAA626474513B06F8734DD784F2FBBB9 +B3B448B8E8221E380AB4A86D3A683B86A54129519D50DD4FE63B30954D805CED +A9A5D9A39C58B65B08E1C19555E927C6DBF7FD07252B2B57F62B905D6B488201 +213D106A41033B26FFBAC2E616DA6ADA6D560BADF10E68872806CFD6F6E19D7B +57CF1F7A030A7BAD374F16A977E0ECB8742D034ADAF9C247DA19C8AEA74EF6CE +DAFD6B1DC562FD3B77E4D008BDE4D8C7FCA9895DA1AC9EAA01C32A0DA712B082 +9438E77230D38FC4153E1711417B918BA6CC03203A5FF082AF880F48518D8271 +C1121E4F1386B30A7F1BC6F10EA98443F8A65C867A109336B808BC9A8E2A75AC +F950835AA84B56F59DA4C8A18859C3B68F6B6DE09A6675F639EA9107BDB67B0F +54EBC564BC2D781B61C14363A54956BA78A2BB89C9F966C94EEFC29EE9F4E23E +C0BF750144DC289F0DEE1F8A25BB52E54F656FAFEE4BD2DA57E1306BBE648051 +1D0CFD6A23A3DF082E3CF13197BF1B7FB22B2CD427BB78F455C9634DF989DC90 +7BB2AE247B1C99AB2062855B2948341B0F857ACD750B59E370A6698C6A1F5287 +72A4A9628A592E313956C242DF8277EDD2F1FDFB07CDC104275FFBF796D7518A +DF49FF3CDEC3BDFF1D290C382F244DF18005ECDABF0C5C2C64EEC4383E2E07DC +5C82587C071E59B46B7BEF31D268F39D9B12D534344FBA515E9DE8F166FAD1E2 +7D1558967AAAD3829D3F7EC6938D20E5379F414532976ABA844D97A5E9078901 +EAE4D0ED1F4C7EE7A2D80D891A5013D6409A38ACFA497F5A169EB7F9F4890DC4 +62FA6A89EA48267331F086992B9CA9305E16611E6AEE67DCDD588A25D37F45B1 +0DE75C802EE021E574B64B3969DE2E5061ED9364B646C38D4BBA86802CA6338A +94E135D2256920EBFB1AA22D9E90C7D16853F0DF9F2D942748EE540E4FCE63C6 +5380D7AB4ADD6CB00FE8F7867E4862D8DB432F28331428CC350CDF7F447A65ED +D7683ECA35A22ADD06E9FE6BAF060913AEEE7B2B8EE4798E437698CC9EB2428E +74CE73F84D0D2292DE709D71FFF8901C3505370E6F1D4E28E6B7372492C65A88 +159371B1D60D77CEC93B272B6C5394EE1D2EF9969DB2838B8E128553879A1BA5 +2884B0A596E8FC3D1E648B7E26A4AC57DF09B9CE09B2F91D8CA618CA52AB3DBD +D005A56A420366069B73146A6F58E88BA49671A1AB7C2070C3D42AA770285143 +40AE7D7868C0E1993506B07C086AD7D4F28CE2D15853FC5FBCBF9425D8012B9E +DB6E1E5002517659C8DA69DCEACA94F368537668843D281FC11782F1C5F71977 +CA215349EE6F20565DE3D8D8212A40E1227A4B22965FA64A0B02C62BFDE97E6F +C3C54FED4057EF9D258C42D7440C78C5E0CC58A40DD74ECED4152F70A93CE71A +1B3A57C46F74A6D27BF98C97CCD31A8EA487260F224A3E40F52C65490AB4098A +7B9EEB54A5A415C8C88568F7D9EFE74BBB785FA18AA27D9201F28BBC477A20A5 +D1307AA78EB8C7CAD409AB64B29E4115E45F5FADDCC80CA74B296C4265A40614 +37F2ACD8386AC0202D6FDB6711E8CB06442F209D781E940ADDD6D881D4F8E874 +357C533115923B90138FFE31D3577C6AAE60D768970FAAB682CD0DCA3E9A9A68 +6393E4B772691C1013ADFFC90C508D51B02D2518ADCC7E79F7DE5DF9D18B8435 +6129064DD1A3995E5A6F45D78287CC10A0EAFBF47223494C5EA934B1BC2F7C53 +686C5880303F9E3ADC8B100D441D944686E1FD811C646C6DD0224F6CF55FA87F +D132EF50450879A25242A18683BD6D0266F8F333F3768D1952B0F32AA75106D8 +EC0AB703F287E847CB91FFB88CD9DA174B49171822BDE34621CF41EA772230A6 +3088F8D19CF2364A329162D39E166AC728B267758341630B00398D64538FCC4D +E3E6CF103794C29AEF7F7E56970F6B1ABA87DC8D23E280EDC77556593D02DFF3 +154883CFE4EF04E07E7539A4750FA1CF1A994E99B656E728D140C83AE1F196AD +9F049188A4184C84556C0476BE46DDA8ED86888DDA3065C5091D99EEEAC43092 +40B97AE327215024ACC0134CBE91FD761C26A48EDFF9028DA28222985FAED7B6 +A1CC891D07185666E34BEFBBF77C6C32B88FF3F1046E4EB2CD942E70746DDCDE +002E74BA03A2B15E0529E61DCAC207A71F61C89D81B3C53C5B458EAC70ADFC54 +810310CB04E1A21FFBC5DE2429EC0989A3F2B6AE4290A005FBE736750956765D +637B7CABF7F9A593D9FF6C322895835C0007A78771D1404671122F9CF898AB24 +1A5648EF8C40B27FD537612C4CBC6E584FBD058DBD4F0A00C63A79077826D3F1 +859589B221F7F82DBE392601B0A89142648EB40BCD943E382FC7758A10F978FF +6DD9C3C1D284C5642C812DBF29A75A50BF63F788CBEA5883DC1544ABB49289EE +2C99CB03C1BA72C7320904C7EC94736825A793D5629EABFCEFAB8D28B6F23858 +89A6967942A943FAB5E5B26B8567CC9606DE60329C6D890843F700FC1F60656A +38164ED7976AD47A8E54940B9E340D61353AAD260C9273D45772AEC8E9F4F045 +9CC576D152757AF3B74DFB9B6962001EA9FF7F62C2E36F71D9B76BB99DA7631F +774795B8CD1E08480153496DE5E08A1F4BEA681D0C1D6336A49A222B0537ABD9 +75A3A9D27D0B71B8913E9355F8E56C5FB3E14B9D5ACC4F87339FF9D9039ADEEC +660B5CEF75E7C1772D4A3A4D0C8976A165766D9DBD0CA8132D17E5149AE716A9 +2E255277FB5294A96194C462C74AAB251A36941768EDB3EC6DC2C481393ABA6C +8BC2F3AB0BF5A6E5619BE16DF43BB099C6CEA5044ABACC419174664232E97B29 +ED32362D219AF109E5D8CA751EB1F9F31BDD08C93AE018E5269AC327FEC67D99 +588CA80F068AEB94A7B943BAD5EC8D89C0B8D153B4345E77A5AD9B4522208A33 +DA92CDF765B44123C6EBAA06D629EB9E8D0FDD29BFD60EB582CB369474767FE4 +C0947F27DCFE0C8BD3CF5131E706E02ED136DBCE6363CB5CA637E08C3D832037 +5AAA88B746B6D915EE72D7B458C55598DA6284F362D2DBF06C51DB50A9FFFB5E +EBFD69D8D06AB0A6DF2D03F6E14FF290B1A1531109E43892B82B29395910021F +A6EA74B8420A14FC189741ECF67F81686BD3C5559DAF75DF9FEF3346CCC35AC5 +37A1E30C2602945974A2359EE3183A1AA568978F7732C35BE2B9224C27161748 +515E5899B0387F0640DE1D712F390A8A026FC5C5A893E98F46B418B7B32BEF07 +AD0EEA87737D929180B2BE697D0DFD46CF307E4FF76BC03492E66633F1357848 +AA5A594EB8CC5913E76602C9CF8B7428F67965D5BAAA29BD6C978EF6B22B0BEF +4203B223443554971EFE558FD2F51D01B35D2194A1F6820293385CF12DC1ED73 +79EA6082A30796D5EB72A67C5DB42A01F18CCBFEBE2F10B091C43C2CBACD8914 +D665B340281C1EBF92249FBDAA577CB7769974B669DA0B74E822EE5DCF3A32D8 +9C6714D8C82CE9BF3F16E6336094BC55381E73A96D45B7A70AE00F9CB8348E08 +2A64E4B40B3BD0A653B423C5D3C1ECB62F5E05393FB8C9B0C44AB26F6BF796BF +5B51601913014ED708B97731A5642351ECD0F6CA9C06832E0BCD0055E9BA51CB +7242CD34AF0B75F3594AF9235C42B974074665C5B6C934B08E5C7F55638E7DB5 +312BC541A8000E69A92ED6C63AA6485A50DFAA1DCF9B0DDAD23C43DF22F3000C +0CBF6F8F64F37BDF8F8DF321FD8F42C3FF774A388F9C033572B177A493814ECC +BE19595AD285F11763857603EAE0D6AED509225CACBC49351E6BF1457BD11490 +EDA1C3DD6DE8C7036464CF80FE562CDA51ED2EB92BBC79252FA79EAFE5E6BD4F +DC16AB83B2C902A9027BA4AE30ABADFF6D513BEA850FF35416E76FE62D8E88DC +69F0C60921B33BA59FA3EDC8F532B47FF2A5E5680BEFCDAEA4474DFA2F8FD68F +74B5837A22984A7534A5321B83459E436AE4C498702EA14A77D3F78DAEA47BA0 +1BE6CFAD95132683BCE0601F3EDDEFF5207FD5FF3CC9093ABD946CC7C1076DB9 +4DAF08C682269CEE980159541D92FFE484B7440E5AC58D7707BAE579605D1EB6 +42C396807AA13B3ACEDBF3A465CBD56F076FA9319E43907B6522904F92483537 +6102700CEAA52EE916B80AA4C5F8C98C9AC9557F97784F075D37A83649D632F5 +82A519507162012A671F3B4DBAC454D920606E9C87CADCAA1172A04E445A28A7 +0FA9545E5FFD15302664B5C2C4F479C8C760C2A015F5F5CB51EC6C0260154D37 +4A65B01E58B458ED0FEBBE74884C9DF7D50770153FB498E94F65475A5EA6A687 +543DEA3156D3E5CEE23923120DF4D561D2C082F1F3BFC5039A1DFC1C9C3A328E +6F879AB979F2C177FBA357FD63F8CC21E8AF632D6B01A3AC3EA7DE91C17B8120 +42E78A1AA2E04581B1C434A8147DBE81A87C73782DAF4BD5F309280FEA22DBAF +586AF386182364E45D7DEAFFA74E338E875B64B13CFC909B30E074D777D347ED +3A58A82D5F6A6E913054F9FABFDD9ABD8BBF54DC3480F3A90965A0081092714B +D77604CC7275050DBCCC800BCD8E2BA540B18CB07AF27D66F8887A571685600F +3FF8C7A4966A8CF8CB25DE0495CD4E048999ECE6579AFA82D1644FE160E2D3F0 +EE7CE89045332B172425D7D1443E8DD9043A12042ADD7EC106CB4DAAEAB310E5 +85F93869A1C519DC0E3CF8F4C05030F0BF7054C5859A74ECE7D6FC5644C5B84A +F3EDF0C4B2DCDD0D193599CB3CA00464A90AB55674F884001EC896726A9B374B +3A73AECDCBE06895E87FCE6267091C6CED0E779DEC36D8CC35184E00247AB90C +37161FFEE7CABFD7499859042093BCAE22D6B811FD16EFBC8AAE6283881C12CA +98E0792640063169F76B18EF543AFE7951E82EDB1DB9597F2F9C959B69943379 +CC7F5BDBD1BAFF7C77AD8D504D5F17E1B7DFFC515AC237748D33FB6B9D7DD903 +2F3E9768290A90A5FC5EA516A94C1885B17676D33CE4124CED1359E473305B02 +03C28731C0FC52B18FC14360C9494FF2A86AEE929E4022ACB78C02ADD6174FD0 +D35105BB00643F6560A9CCBB3E5CE2F79F0EB9BA774D27DC476867C991598380 +F77CC0444500CF43DAB8D729B31EA5A3184F178F82622A8B711A9CA6A770971C +521C44969E814B44D8E1927C283E6A38B78D7C258630730EA463FEEEAB263838 +2A517BA176D1C137AAE7430532FFB0FFCA8BF110DECB42B1A7A9457A9ECCABFA +D6CC11CD925518857AAA8498CEF35377CF92FEA77C09E6AE25DB2D09F1E355BD +7F7F5C72A76315F3C2B6BEA1AF7BA5D0E8000778A0FB2C60FF677ADBA9156A11 +A5B0B7AE92DB368571C040FD7A29C3DF384CCC29A0E9F40FA385630D23AC1E97 +C15C06848761CC7D19D208BC115A6A2933056BCEB3717CE2488E86D0B0D6D276 +22B2FF1E77FA719372BE62A5B6E10D3DFCA57DE70AE16C57718B86C58B6A7F3D +C6DD45D7559F9A0ED8889E707FE7622997F2D573F7688621245E0FB3D34A08C6 +40B72F4BDA0394CBF90735B9E6B3928AD56F50FEF9A5DA8B195008164EC03424 +7F5317FB8157C33F6903FD6D4B4728F82F1B02046DA16F4285DF088E08A136FD +1366494E3F5AEBED4B48B3B9072BC811A700940FF4B2A51C0434ABF225B37BBF +E4AB11F394332D66393420D4B843CAB6AAD9C32418CFE6A2A1260BF430E61176 +4B1762E3C9F1727BA47AAE4C7589E7099A56F5E1CB6BD64C0C8D026ED60EAFBC +BAD1476E98F5F12ED94BDB1E4B0D8FE9E36CF40DA6F5B2E1BC41EF5F7CB49825 +EA5058FF7C49C5FA11F9F9F575AB4D8237FFC2573F94B695CBE9BC44A1BB26DD +C6E55627BA16E5197CADA519CC7302DBE77F1FE4CF68C558D8F6E264 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.0: CMMI10 003.002 +%%Title: CMMI10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup +/UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMMI10 def +/FontBBox {-32 -250 1048 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2 +1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C +7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B +0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085 +EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37 +404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133 +78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF +A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE +88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4 +C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC +BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88 +98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760 +E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44 +143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3 +981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490 +88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285 +4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683 +FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F +347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F +FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB +C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04 +B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733 +F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA +29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66 +36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12 +048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0 +80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C +9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B +75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E +4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC +74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B +D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355 +E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097 +EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D +543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883 +710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6 +EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F +7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93 +03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2 +01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89 +500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F +F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208 +AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE +1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915 +85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C +4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1 +6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F +55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18 +085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02 +BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951 +2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D +CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E +BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E +D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1 +991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125 +6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754 +E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80 +E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1 +B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3 +4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65 +1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB +B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7 +8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA +FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6 +AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E +BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051 +E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD +38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3 +7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751 +2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27 +DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D +22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6 +8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB +44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90 +D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A +42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF +C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E +0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE +66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6 +E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1 +6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E +1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10 +B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B +897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E +EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40 +A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3 +F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA +A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126 +2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6 +51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3 +598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F +87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE +178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6 +4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78 +7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6 +AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6 +3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379 +337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547 +C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5 +DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA +7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD +6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC +98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355 +821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4 +C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886 +7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6 +B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16 +A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325 +23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF +C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3 +969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10 +3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B +9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725 +1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239 +B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966 +95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7 +FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE +44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986 +FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4 +E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA +633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D +6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F +FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD +375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2 +6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7 +EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C +E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D +F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156 +DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891 +D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538 +D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4 +9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B +9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6 +B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0 +D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF +8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93 +FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26 +B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F +00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50 +909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49 +5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF +7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA +BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0 +C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1 +BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37 +BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D +4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075 +94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1 +F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9 +E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA +92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0 +63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A +CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271 +B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9 +5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E +86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0 +AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180 +3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC +35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD +155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580 +AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255 +E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F +226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496 +9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B +8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B +919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE +A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7 +9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0 +523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7 +88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D +2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF +AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66 +B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D916672480464F7E22 +CA6E431FE38D3FC019BDD229E064B72C545C61C6EA55984565CCA88ACB01F744 +3B4593CC8944C70F30925FB48A16342CC26D444F54CA15E5A624C4A2DAA2AEF8 +404145BBA339F2A2D6FC2F3ECE54387761CA1213C8D56FF96E37C6147CA44B84 +262EA87E7CC10D931E6B5B80D7F09813498497AA84ACB4AC69BC6C8481ED2953 +084F560D7B1CF90555E69BD2AF7C5D944E8E3506165014652462BE1BC81CA341 +E1B0725159D36DA0FFF3577D1DEBC5D91AE683FB0384 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMMI12 +%!PS-AdobeFont-1.0: CMMI12 003.002 +%%Title: CMMI12 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI12. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup +/UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMMI12 def +/FontBBox {-31 -250 1026 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI12.) readonly def +/FullName (CMMI12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE +882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3 +2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A +7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541 +0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69 +987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7 +609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC +182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A +CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A +1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE +C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D +3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6 +D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E +E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200 +761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24 +8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F +68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D +10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4 +262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6 +922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16 +56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26 +32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA +7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460 +7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A +46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD +754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF +88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F +CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A +7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760 +8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0 +BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B +CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25 +8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B +D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300 +135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A +C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812 +1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86 +07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39 +14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D +7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D +2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D +639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3 +D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F +90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948 +10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E +1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E +8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC +D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9 +1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33 +9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875 +EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE +DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3 +60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8 +FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D +203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608 +FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09 +DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F +2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D +244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077 +31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B +724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8 +F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7 +D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA +AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907 +CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF +01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D +CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA +287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605 +8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9 +9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1 +6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5 +7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C +192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA +AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4 +A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9 +50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67 +A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912 +3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF +CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6 +5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96 +8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE +084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7 +92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2 +AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27 +97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF +92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5 +7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824 +5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199 +13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76 +6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1 +5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5 +6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83 +F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E +A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4 +7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A +9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817 +E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962 +AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD +F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8 +0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003 +1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31 +7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E +38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8 +5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F +3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B +B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85 +15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B +AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674 +6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6 +CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322 +EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82 +A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D +806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4 +461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1 +4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361 +9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C +172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6 +69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E +ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690 +356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0 +E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78 +7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C +B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A +31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF +EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7 +98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30 +C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61 +AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208 +E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900 +76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40 +8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573 +CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7 +761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A +2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138 +89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60 +D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF +C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485 +D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8 +B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39 +AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F +D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3 +866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD +207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73 +756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7 +60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD +A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A +1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4 +A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048 +C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3 +03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321 +1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B +97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE +D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8 +4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF +94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97 +201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7 +9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000 +CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7 +29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939 +4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED +66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31 +14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53 +84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74 +6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12 +49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C +224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5 +5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4 +A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498 +1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D +5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6 +40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C +E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B +C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FA96583CF3F1519CD +CF08806F40ACD7BB5C960F21E9DA7FB3C72CBA0801ADE83DF738A4EC94F2977D +2B95A166BA4AE28CAD1E37FBBF49D342CDB4DF615E2C5F3076313AC517C350DE +710F5D52DE31DF69864D29DABF14234DF13904BA4333B0D714EEA55CDD79DE45 +FF5D64259C877191547076B1C7684CD252C0337BD9DF66CDC5DBAA4F3102F2E8 +FE48385C55727B80D11F3BE0B7568AA9356FB2B180A6B1392D620DED02F0B736 +5F4399FB9D32DFBC8ED942AD311C82250DA8BFE98D65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.0: CMSY10 003.002 +%%Title: CMSY10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSY10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup +/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSY10 def +/FontBBox {-29 -960 1116 775 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 13 /circlecopyrt put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 +7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 +DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 +511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 +1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD +028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 +1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 +3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 +91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 +E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A +11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 +C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 +D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 +B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 +93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F +10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D +7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF +B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B +491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB +F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 +019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 +915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 +356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 +5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D +9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 +3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 +FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 +720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 +D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 +BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 +7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 +DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 +AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 +A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E +0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 +AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 +CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 +0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD +5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B +5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F +E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB +54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 +E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F +A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 +4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 +4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 +038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 +B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 +5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC +B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 +A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD +2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D +CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 +455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE +FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 +16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C +16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F +483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 +67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 +3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 +1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 +93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA +051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B +8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 +8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 +6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 +06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 +84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 +D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 +DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB +0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD +8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC +C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 +754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 +1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 +CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 +1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F +153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 +905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 +617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 +8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A +98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 +53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B +888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D +052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A +CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 +A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F +07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 +B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 +10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 +CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D +3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 +D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F +849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 +648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE +84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA +2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD +2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 +9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 +B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B +D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 +135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE +EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 +C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 +7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 +4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 +9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 +050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 +3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 +C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 +843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 +CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B +B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 +3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 +19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 +FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 +17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 +8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B +CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 +F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 +1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E +4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 +2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 +9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 +E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB +8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB +BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 +04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 +C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 +ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C +4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 +84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 +C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 +09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 +D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 +56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF +035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB +FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 +CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 +B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A +F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD +CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B +0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C +B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 +33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 +4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D +F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E +2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A +CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 +88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 +17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 +55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A +A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 +2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 +406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 +AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B +60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 +C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 +5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 +822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E +94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 +D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA +343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE +894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 +DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 +DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F +8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 +A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA +DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 +E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 +DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC +4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 +5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 +02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 +88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A +60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E +71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52 +9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016 +A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44 +AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829 +F1795501020D5FF0AD25584C1D47BE08ED6CE96278050BA67680A3B973613647 +A93FAEC756FC253B3693FA2D6491B276EF45751EFB306961788E7C15297A5822 +AFC5A2DABD0DBBFF0BE135267EA6B9D1B4E4760ED14895FFE1F8C3F564830001 +EFA901B8442BD2D98561BAB9A0FD939E0F856E4D2EB04A9A4496704109B8A84C +EA06AB0999427B3B1BE776004AE906D0F22159C051D88CF573A0255D99B56781 +CF326CD11919AA40B096769CD6D0ADF3ACEC7957621084ACF21AF1F265416628 +86B67FCBDE9370D4F5C6F5CC67EBB0A2727E074090DBCA459AFA1A4778AED4C9 +AE5400775223E684BFCB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +TeXDict begin 40258431 52099146 1000 600 600 (readline.dvi) +@start /Fa 197[21 58[{}1 74.7198 /CMMI9 rf /Fb 133[34 +41 41 55 41 43 30 30 30 41 43 38 43 64 21 41 1[21 43 +38 23 34 43 34 43 38 39[38 38 38 38 38 38 38 38 38 38 +2[26 21 30[43 43 12[{}39 74.7198 /CMR9 rf /Fc 134[39 +39 2[39 39 39 39 2[39 39 39 39 2[39 39 1[39 39 39 2[39 +19[39 27[39 39 2[39 45[{}20 74.7198 /CMSLTT10 rf /Fd +167[62 3[60 46 2[57 1[62 76 52 1[43 1[62 65 54 1[63 60 +67[{}13 83.022 /CMR10 rf /Fe 129[39 39 39 39 39 39 39 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 +39 39 39 39 39 39 39 1[39 39 39 1[39 39 39 39 39 39 39 +39 39 39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 +39 39 39 39 39 39 39 3[39 1[39 39 39 39 39 39 39 39 39 +39 39 39 39 39 39 39 1[39 39 39 33[{}86 74.7198 /CMTT9 +rf /Ff 133[44 53 53 72 53 55 39 39 39 53 55 50 55 83 +28 53 1[28 55 50 30 44 55 44 55 50 20[62 77 1[36 2[65 +68 22[28 1[28 1[50 28[55 55 12[{}35 99.6264 /CMSL10 rf +/Fg 214[35 35 40[{}2 90.9091 /CMSS10 rf /Fh 133[52 52 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 1[52 52 52 +52 52 52 52 52 52 1[52 18[52 52 1[52 2[52 52 9[52 16[52 +42[{}33 99.6264 /CMTT10 rf /Fi 134[65 65 89 65 68 48 +48 50 1[68 61 68 102 34 65 1[34 68 61 37 56 68 55 68 +60 7[93 1[127 93 94 85 68 92 3[96 116 74 96 1[46 96 1[77 +81 1[89 87 93 7[61 61 61 61 61 61 61 61 61 61 1[34 46[{}52 +109.091 /CMBX12 rf /Fj 133[40 48 48 66 48 51 35 36 36 +48 51 45 51 76 25 48 1[25 51 45 28 40 51 40 51 45 9[93 +1[68 66 51 67 1[62 71 68 83 57 71 1[33 68 1[59 62 69 +66 64 68 15[45 45 2[30 2[45 28[51 51 53 11[{}51 90.9091 +/CMSL10 rf /Fk 134[44 1[60 42 49 30 37 38 1[46 46 51 +74 23 42 1[28 1[42 1[42 46 42 1[46 84[51 12[{}20 90.9091 +/CMTI10 rf /Fl 134[48 48 48 48 48 48 48 48 48 48 48 48 +48 48 48 48 48 1[48 48 48 48 48 48 48 1[48 2[48 14[48 +48 1[48 1[48 2[48 48 48 17[48 48 2[48 5[48 39[{}37 90.9091 +/CMSLTT10 rf /Fm 135[56 2[56 1[42 2[51 58 56 4[27 1[58 +49 51 1[54 1[56 97[{}12 90.9091 /CMCSC10 rf /Fn 197[25 +58[{}1 90.9091 /CMMI10 rf /Fo 197[33 58[{}1 119.552 /CMMI12 +rf /Fp 135[85 117 1[90 63 64 66 1[90 81 90 134 45 2[45 +90 81 49 74 90 72 90 78 10[122 124 112 1[120 1[110 1[126 +1[97 2[60 1[127 101 106 124 117 1[122 14[81 81 49[{}36 +143.462 /CMBX12 rf /Fq 242[91 13[{}1 90.9091 /CMSY10 +rf /Fr 134[71 71 97 71 75 52 53 55 1[75 67 75 112 37 +2[37 75 67 41 61 75 60 75 65 7[102 1[139 102 103 94 75 +100 101 92 101 105 128 81 105 1[50 105 106 85 88 103 +97 96 102 6[37 67 67 67 67 67 67 67 67 67 67 1[37 1[37 +44[{}58 119.552 /CMBX12 rf /Fs 129[48 48 48 48 48 48 +48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 +48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 +48 48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 48 48 +48 48 48 48 48 48 48 48 48 1[48 48 1[48 48 48 48 48 48 +48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 33[{}91 +90.9091 /CMTT10 rf /Ft 131[91 45 40 48 48 66 48 51 35 +36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51 +45 25 2[25 45 25 56 68 68 93 68 68 66 51 67 71 62 71 +68 83 57 71 47 33 68 71 59 62 69 66 64 68 71 4[25 25 +45 45 45 45 45 45 45 45 45 45 45 25 30 25 2[35 35 25 +2[45 1[45 19[76 51 51 53 11[{}84 90.9091 /CMR10 rf /Fu +134[102 6[79 3[108 1[54 2[54 3[88 108 1[108 94 11[149 +2[144 3[151 1[116 4[152 71[{}14 172.154 /CMBX12 rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: Letter +/setpagedevice where +{ pop << /PageSize [612 792] >> setpagedevice } +{ /letter where { pop letter } if } +ifelse +%%EndPaperSize + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 150 1318 a Fu(GNU)65 b(Readline)g(Library)p +150 1418 3600 34 v 1873 1515 a Ft(Edition)30 b(8.2,)i(for)e +Fs(Readline)e(Library)h Ft(V)-8 b(ersion)31 b(8.2.)3118 +1623 y(Septem)m(b)s(er)f(2022)150 4927 y Fr(Chet)45 b(Ramey)-11 +b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150 +5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F) +-11 b(oundation)p 150 5141 3600 17 v eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 150 4413 a Ft(This)21 b(man)m(ual)g(describ)s(es) +g(the)g(GNU)h(Readline)g(Library)f(\(v)m(ersion)h(8.2,)i(19)e(Septem)m +(b)s(er)f(2022\),)26 b(a)21 b(library)150 4523 y(whic)m(h)39 +b(aids)g(in)g(the)g(consistency)h(of)g(user)e(in)m(terface)j(across)f +(discrete)g(programs)e(whic)m(h)h(pro)m(vide)h(a)150 +4633 y(command)30 b(line)h(in)m(terface.)150 4767 y(Cop)m(yrigh)m(t)602 +4764 y(c)577 4767 y Fq(\015)f Ft(1988{2022)35 b(F)-8 +b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 +4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h(to)g(cop)m(y)-8 +b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s(cumen)m(t)f +(under)f(the)390 5011 y(terms)25 b(of)h(the)f(GNU)h(F)-8 +b(ree)27 b(Do)s(cumen)m(tation)g(License,)g(V)-8 b(ersion)26 +b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion)390 5121 y(published)43 +b(b)m(y)h(the)h(F)-8 b(ree)46 b(Soft)m(w)m(are)g(F)-8 +b(oundation;)53 b(with)44 b(no)g(In)m(v)-5 b(arian)m(t)46 +b(Sections,)j(no)390 5230 y(F)-8 b(ron)m(t-Co)m(v)m(er)31 +b(T)-8 b(exts,)30 b(and)f(no)f(Bac)m(k-Co)m(v)m(er)k(T)-8 +b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390 +5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8 +b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end +%%Page: -1 3 +TeXDict begin -1 2 bop 3725 -116 a Ft(i)150 299 y Fp(T)-13 +b(able)53 b(of)h(Con)l(ten)l(ts)150 649 y Fr(1)135 b(Command)45 +b(Line)g(Editing)26 b Fo(:)20 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)39 +b Fr(1)275 786 y Ft(1.1)92 b(In)m(tro)s(duction)30 b(to)h(Line)f +(Editing)17 b Fn(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)h(:)f(:)g(:)31 b Ft(1)275 896 y(1.2)92 b(Readline)31 +b(In)m(teraction)19 b Fn(:)e(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)32 +b Ft(1)399 1005 y(1.2.1)93 b(Readline)31 b(Bare)g(Essen)m(tials)18 +b Fn(:)e(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)31 b Ft(1)399 1115 y(1.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)i +(Commands)18 b Fn(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32 +b Ft(2)399 1225 y(1.2.3)93 b(Readline)31 b(Killing)g(Commands)10 +b Fn(:)k(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 +b Ft(2)399 1334 y(1.2.4)93 b(Readline)31 b(Argumen)m(ts)22 +b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)36 b Ft(3)399 1444 y(1.2.5)93 b(Searc)m(hing)31 +b(for)f(Commands)f(in)h(the)h(History)20 b Fn(:)c(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)33 +b Ft(3)275 1553 y(1.3)92 b(Readline)31 b(Init)f(File)13 +b Fn(:)k(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)27 +b Ft(4)399 1663 y(1.3.1)93 b(Readline)31 b(Init)f(File)i(Syn)m(tax)26 +b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +39 b Ft(4)399 1773 y(1.3.2)93 b(Conditional)31 b(Init)f(Constructs)16 +b Fn(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)29 +b Ft(13)399 1882 y(1.3.3)93 b(Sample)30 b(Init)g(File)22 +b Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35 b Ft(14)275 1992 y(1.4)92 +b(Bindable)30 b(Readline)h(Commands)22 b Fn(:)15 b(:)g(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)35 b Ft(17)399 2101 +y(1.4.1)93 b(Commands)29 b(F)-8 b(or)31 b(Mo)m(ving)18 +b Fn(:)f(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)31 b Ft(17)399 2211 y(1.4.2)93 b(Commands)29 b(F)-8 +b(or)31 b(Manipulating)g(The)f(History)f Fn(:)15 b(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Ft(18)399 +2320 y(1.4.3)93 b(Commands)29 b(F)-8 b(or)31 b(Changing)f(T)-8 +b(ext)12 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)25 +b Ft(19)399 2430 y(1.4.4)93 b(Killing)31 b(And)e(Y)-8 +b(anking)13 b Fn(:)k(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Ft(21)399 2540 y(1.4.5)93 +b(Sp)s(ecifying)30 b(Numeric)g(Argumen)m(ts)e Fn(:)15 +b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Ft(22)399 2649 +y(1.4.6)93 b(Letting)31 b(Readline)g(T)m(yp)s(e)f(F)-8 +b(or)31 b(Y)-8 b(ou)22 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35 +b Ft(22)399 2759 y(1.4.7)93 b(Keyb)s(oard)29 b(Macros)11 +b Fn(:)17 b(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)24 b Ft(23)399 2868 y(1.4.8)93 +b(Some)30 b(Miscellaneous)j(Commands)16 b Fn(:)e(:)h(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)29 b Ft(23)275 2978 y(1.5)92 b(Readline)31 +b(vi)f(Mo)s(de)10 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 +b Ft(25)150 3229 y Fr(2)135 b(Programming)46 b(with)f(GNU)g(Readline)37 +b Fo(:)19 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)48 +b Fr(26)275 3366 y Ft(2.1)92 b(Basic)31 b(Beha)m(vior)23 +b Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)36 +b Ft(26)275 3475 y(2.2)92 b(Custom)29 b(F)-8 b(unctions)19 +b Fn(:)d(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)32 b Ft(27)399 +3585 y(2.2.1)93 b(Readline)31 b(T)m(yp)s(edefs)17 b Fn(:)e(:)g(:)g(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)30 b Ft(28)399 3694 y(2.2.2)93 b(W)-8 b(riting)31 +b(a)g(New)g(F)-8 b(unction)24 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)37 b Ft(28)275 3804 y(2.3)92 +b(Readline)31 b(V)-8 b(ariables)11 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)h(:)f(:)24 b Ft(29)275 3914 y(2.4)92 b(Readline)31 +b(Con)m(v)m(enience)g(F)-8 b(unctions)22 b Fn(:)16 b(:)g(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)35 b Ft(34)399 4023 y(2.4.1)93 +b(Naming)31 b(a)g(F)-8 b(unction)21 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)34 +b Ft(34)399 4133 y(2.4.2)93 b(Selecting)32 b(a)e(Keymap)9 +b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)g(:)h(:)22 b Ft(35)399 4242 y(2.4.3)93 b(Binding)30 +b(Keys)15 b Fn(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)28 +b Ft(36)399 4352 y(2.4.4)93 b(Asso)s(ciating)32 b(F)-8 +b(unction)31 b(Names)g(and)e(Bindings)d Fn(:)16 b(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)39 b Ft(38)399 +4462 y(2.4.5)93 b(Allo)m(wing)32 b(Undoing)26 b Fn(:)16 +b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)40 b Ft(39)399 4571 y(2.4.6)93 b(Redispla)m(y)10 +b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)23 +b Ft(40)399 4681 y(2.4.7)93 b(Mo)s(difying)30 b(T)-8 +b(ext)16 b Fn(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Ft(41)399 +4790 y(2.4.8)93 b(Character)31 b(Input)22 b Fn(:)13 b(:)j(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)35 b Ft(42)399 4900 y(2.4.9)93 b(T)-8 b(erminal)30 +b(Managemen)m(t)17 b Fn(:)h(:)d(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)30 b Ft(43)399 5010 y(2.4.10)93 +b(Utilit)m(y)33 b(F)-8 b(unctions)24 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)36 +b Ft(43)399 5119 y(2.4.11)93 b(Miscellaneous)33 b(F)-8 +b(unctions)23 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)36 b Ft(45)399 5229 y(2.4.12)93 b(Alternate)32 +b(In)m(terface)27 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Ft(46)399 5338 +y(2.4.13)93 b(A)31 b(Readline)g(Example)12 b Fn(:)j(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)25 +b Ft(46)p eop end +%%Page: -2 4 +TeXDict begin -2 3 bop 3699 -116 a Ft(ii)399 83 y(2.4.14)93 +b(Alternate)32 b(In)m(terface)g(Example)18 b Fn(:)e(:)f(:)h(:)f(:)g(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)31 b Ft(48)275 193 y(2.5)92 b(Readline)31 +b(Signal)f(Handling)18 b Fn(:)e(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)31 b Ft(50)275 302 +y(2.6)92 b(Custom)29 b(Completers)e Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)40 b Ft(53)399 412 y(2.6.1)93 b(Ho)m(w)31 b(Completing)g(W)-8 +b(orks)11 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)24 b Ft(53)399 521 y(2.6.2)93 b(Completion)31 +b(F)-8 b(unctions)28 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)40 b Ft(54)399 631 y(2.6.3)93 +b(Completion)31 b(V)-8 b(ariables)18 b Fn(:)e(:)g(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b +Ft(55)399 741 y(2.6.4)93 b(A)30 b(Short)g(Completion)h(Example)15 +b Fn(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)28 b +Ft(60)150 991 y Fr(App)t(endix)44 b(A)119 b(GNU)39 b(F)-11 +b(ree)38 b(Do)t(cumen)l(tation)i(License)25 b Fo(:)20 +b(:)32 b Fr(70)150 1269 y(Concept)45 b(Index)36 b Fo(:)19 +b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) +h(:)49 b Fr(78)150 1548 y(F)-11 b(unction)44 b(and)h(V)-11 +b(ariable)45 b(Index)20 b Fo(:)g(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fr(79)p +eop end +%%Page: 1 5 +TeXDict begin 1 4 bop 3705 -116 a Ft(1)150 299 y Fp(1)80 +b(Command)54 b(Line)f(Editing)150 527 y Ft(This)30 b(c)m(hapter)h +(describ)s(es)e(the)i(basic)g(features)f(of)h(the)f Fm(gnu)g +Ft(command)h(line)f(editing)h(in)m(terface.)150 766 y +Fr(1.1)68 b(In)l(tro)t(duction)45 b(to)g(Line)h(Editing)150 +925 y Ft(The)30 b(follo)m(wing)i(paragraphs)d(describ)s(e)h(the)h +(notation)g(used)f(to)h(represen)m(t)f(k)m(eystrok)m(es.)275 +1058 y(The)35 b(text)i Fl(C-k)f Ft(is)g(read)g(as)h(`Con)m(trol-K')g +(and)f(describ)s(es)f(the)h(c)m(haracter)i(pro)s(duced)d(when)g(the)h +Fs(k)150 1168 y Ft(k)m(ey)31 b(is)g(pressed)e(while)h(the)h(Con)m(trol) +g(k)m(ey)g(is)g(depressed.)275 1301 y(The)g(text)i Fl(M-k)e +Ft(is)h(read)f(as)i(`Meta-K')g(and)f(describ)s(es)f(the)h(c)m(haracter) +h(pro)s(duced)e(when)f(the)i(Meta)150 1411 y(k)m(ey)i(\(if)f(y)m(ou)h +(ha)m(v)m(e)g(one\))g(is)f(depressed,)g(and)f(the)h Fs(k)g +Ft(k)m(ey)h(is)f(pressed.)48 b(The)32 b(Meta)j(k)m(ey)e(is)h(lab)s +(eled)f Fs(ALT)150 1521 y Ft(on)c(man)m(y)h(k)m(eyb)s(oards.)40 +b(On)29 b(k)m(eyb)s(oards)g(with)h(t)m(w)m(o)h(k)m(eys)f(lab)s(eled)g +Fs(ALT)e Ft(\(usually)i(to)g(either)g(side)g(of)g(the)150 +1630 y(space)h(bar\),)f(the)g Fs(ALT)f Ft(on)h(the)g(left)h(side)f(is)g +(generally)h(set)f(to)h(w)m(ork)f(as)g(a)h(Meta)g(k)m(ey)-8 +b(.)42 b(The)29 b Fs(ALT)g Ft(k)m(ey)i(on)150 1740 y(the)c(righ)m(t)h +(ma)m(y)g(also)g(b)s(e)f(con\014gured)f(to)i(w)m(ork)f(as)h(a)f(Meta)i +(k)m(ey)f(or)f(ma)m(y)h(b)s(e)e(con\014gured)h(as)g(some)h(other)150 +1849 y(mo)s(di\014er,)i(suc)m(h)g(as)g(a)h(Comp)s(ose)f(k)m(ey)h(for)f +(t)m(yping)h(accen)m(ted)h(c)m(haracters.)275 1983 y(If)23 +b(y)m(ou)i(do)f(not)h(ha)m(v)m(e)h(a)f(Meta)g(or)g Fs(ALT)e +Ft(k)m(ey)-8 b(,)27 b(or)e(another)f(k)m(ey)i(w)m(orking)e(as)h(a)g +(Meta)h(k)m(ey)-8 b(,)27 b(the)d(iden)m(tical)150 2092 +y(k)m(eystrok)m(e)30 b(can)f(b)s(e)f(generated)h(b)m(y)g(t)m(yping)g +Fs(ESC)e Fk(\014rst)p Ft(,)j(and)e(then)g(t)m(yping)h +Fs(k)p Ft(.)40 b(Either)28 b(pro)s(cess)g(is)g(kno)m(wn)150 +2202 y(as)j Fj(metafying)39 b Ft(the)30 b Fs(k)g Ft(k)m(ey)-8 +b(.)275 2335 y(The)39 b(text)j Fl(M-C-k)d Ft(is)h(read)g(as)h +(`Meta-Con)m(trol-k')j(and)39 b(describ)s(es)h(the)g(c)m(haracter)i +(pro)s(duced)d(b)m(y)150 2445 y Fj(metafying)g Fl(C-k)p +Ft(.)275 2578 y(In)c(addition,)j(sev)m(eral)f(k)m(eys)g(ha)m(v)m(e)g +(their)f(o)m(wn)g(names.)58 b(Sp)s(eci\014cally)-8 b(,)38 +b Fs(DEL)p Ft(,)f Fs(ESC)p Ft(,)g Fs(LFD)p Ft(,)g Fs(SPC)p +Ft(,)g Fs(RET)p Ft(,)150 2688 y(and)d Fs(TAB)f Ft(all)j(stand)e(for)g +(themselv)m(es)i(when)d(seen)i(in)f(this)g(text,)j(or)d(in)h(an)f(init) +h(\014le)f(\(see)i(Section)f(1.3)150 2797 y([Readline)c(Init)e(File],)j +(page)e(4\).)41 b(If)29 b(y)m(our)h(k)m(eyb)s(oard)f(lac)m(ks)i(a)f +Fs(LFD)f Ft(k)m(ey)-8 b(,)31 b(t)m(yping)g Fs(C-j)d Ft(will)i(pro)s +(duce)f(the)150 2907 y(desired)h(c)m(haracter.)42 b(The)30 +b Fs(RET)g Ft(k)m(ey)h(ma)m(y)g(b)s(e)e(lab)s(eled)i +Fs(Return)e Ft(or)h Fs(Enter)f Ft(on)h(some)h(k)m(eyb)s(oards.)150 +3145 y Fr(1.2)68 b(Readline)47 b(In)l(teraction)150 3305 +y Ft(Often)32 b(during)g(an)g(in)m(teractiv)m(e)j(session)e(y)m(ou)g(t) +m(yp)s(e)g(in)f(a)h(long)g(line)g(of)f(text,)j(only)d(to)i(notice)g +(that)f(the)150 3414 y(\014rst)f(w)m(ord)g(on)g(the)g(line)h(is)g +(missp)s(elled.)46 b(The)32 b(Readline)h(library)f(giv)m(es)h(y)m(ou)g +(a)g(set)g(of)f(commands)g(for)150 3524 y(manipulating)e(the)g(text)h +(as)f(y)m(ou)g(t)m(yp)s(e)g(it)g(in,)g(allo)m(wing)h(y)m(ou)f(to)h +(just)e(\014x)g(y)m(our)h(t)m(yp)s(o,)g(and)g(not)g(forcing)150 +3634 y(y)m(ou)e(to)h(ret)m(yp)s(e)g(the)f(ma)5 b(jorit)m(y)29 +b(of)f(the)h(line.)40 b(Using)28 b(these)h(editing)g(commands,)f(y)m +(ou)h(mo)m(v)m(e)g(the)g(cursor)150 3743 y(to)35 b(the)f(place)i(that)e +(needs)g(correction,)j(and)d(delete)h(or)f(insert)h(the)f(text)h(of)g +(the)f(corrections.)54 b(Then,)150 3853 y(when)24 b(y)m(ou)h(are)g +(satis\014ed)g(with)g(the)g(line,)i(y)m(ou)e(simply)f(press)g +Fs(RET)p Ft(.)39 b(Y)-8 b(ou)25 b(do)g(not)g(ha)m(v)m(e)h(to)g(b)s(e)e +(at)h(the)h(end)150 3962 y(of)33 b(the)h(line)g(to)g(press)e +Fs(RET)p Ft(;)i(the)g(en)m(tire)g(line)f(is)h(accepted)g(regardless)g +(of)f(the)h(lo)s(cation)h(of)e(the)h(cursor)150 4072 +y(within)c(the)g(line.)150 4269 y Fi(1.2.1)63 b(Readline)40 +b(Bare)h(Essen)m(tials)150 4416 y Ft(In)31 b(order)h(to)h(en)m(ter)g(c) +m(haracters)g(in)m(to)g(the)g(line,)g(simply)e(t)m(yp)s(e)i(them.)46 +b(The)31 b(t)m(yp)s(ed)h(c)m(haracter)i(app)s(ears)150 +4525 y(where)e(the)h(cursor)e(w)m(as,)j(and)e(then)g(the)h(cursor)e(mo) +m(v)m(es)j(one)f(space)g(to)g(the)g(righ)m(t.)47 b(If)32 +b(y)m(ou)h(mist)m(yp)s(e)g(a)150 4635 y(c)m(haracter,)f(y)m(ou)f(can)g +(use)f(y)m(our)g(erase)h(c)m(haracter)h(to)f(bac)m(k)g(up)f(and)f +(delete)j(the)f(mist)m(yp)s(ed)e(c)m(haracter.)275 4768 +y(Sometimes)i(y)m(ou)g(ma)m(y)h(mist)m(yp)s(e)e(a)i(c)m(haracter,)g +(and)e(not)i(notice)g(the)f(error)f(un)m(til)h(y)m(ou)g(ha)m(v)m(e)h(t) +m(yp)s(ed)150 4878 y(sev)m(eral)e(other)f(c)m(haracters.)42 +b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h +Fl(C-b)d Ft(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150 +4987 y(then)f(correct)i(y)m(our)e(mistak)m(e.)42 b(Afterw)m(ards,)31 +b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)g +(with)f Fl(C-f)p Ft(.)275 5121 y(When)i(y)m(ou)h(add)f(text)h(in)f(the) +h(middle)f(of)h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m +(haracters)h(to)g(the)e(righ)m(t)150 5230 y(of)d(the)g(cursor)f(are)h +(`pushed)e(o)m(v)m(er')j(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h +(that)f(y)m(ou)g(ha)m(v)m(e)h(inserted.)40 b(Lik)m(ewise,)150 +5340 y(when)d(y)m(ou)g(delete)i(text)g(b)s(ehind)c(the)j(cursor,)h(c)m +(haracters)g(to)f(the)g(righ)m(t)g(of)g(the)g(cursor)e(are)i(`pulled)p +eop end +%%Page: 2 6 +TeXDict begin 2 5 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(2)150 299 y(bac)m(k')24 +b(to)f(\014ll)g(in)f(the)h(blank)f(space)i(created)f(b)m(y)g(the)g +(remo)m(v)-5 b(al)24 b(of)f(the)g(text.)39 b(A)23 b(list)g(of)g(the)g +(bare)f(essen)m(tials)150 408 y(for)30 b(editing)h(the)g(text)g(of)g +(an)f(input)f(line)i(follo)m(ws.)150 571 y Fl(C-b)336 +b Ft(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m(haracter.)150 +732 y Fl(C-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(one)h(c)m(haracter.) +150 893 y Fs(DEL)e Ft(or)i Fs(Backspace)630 1003 y Ft(Delete)i(the)d(c) +m(haracter)i(to)f(the)g(left)g(of)f(the)h(cursor.)150 +1164 y Fl(C-d)336 b Ft(Delete)33 b(the)d(c)m(haracter)i(underneath)d +(the)i(cursor.)150 1325 y(Prin)m(ting)g(c)m(haracters)630 +1435 y(Insert)f(the)g(c)m(haracter)i(in)m(to)g(the)e(line)h(at)g(the)g +(cursor.)150 1596 y Fl(C-_)e Ft(or)i Fl(C-x)e(C-u)630 +1706 y Ft(Undo)k(the)h(last)g(editing)g(command.)50 b(Y)-8 +b(ou)34 b(can)f(undo)g(all)h(the)f(w)m(a)m(y)i(bac)m(k)f(to)g(an)g +(empt)m(y)630 1815 y(line.)150 1977 y(\(Dep)s(ending)c(on)g(y)m(our)g +(con\014guration,)h(the)f Fs(Backspace)d Ft(k)m(ey)k(migh)m(t)g(b)s(e)e +(set)i(to)g(delete)g(the)f(c)m(haracter)150 2087 y(to)h(the)f(left)h +(of)f(the)g(cursor)f(and)h(the)g Fs(DEL)f Ft(k)m(ey)i(set)g(to)f +(delete)i(the)e(c)m(haracter)h(underneath)e(the)h(cursor,)150 +2196 y(lik)m(e)i Fl(C-d)p Ft(,)d(rather)i(than)f(the)g(c)m(haracter)i +(to)f(the)g(left)g(of)g(the)f(cursor.\))150 2398 y Fi(1.2.2)63 +b(Readline)40 b(Mo)m(v)m(emen)m(t)h(Commands)150 2545 +y Ft(The)27 b(ab)s(o)m(v)m(e)i(table)g(describ)s(es)e(the)g(most)i +(basic)f(k)m(eystrok)m(es)h(that)f(y)m(ou)g(need)g(in)f(order)g(to)i +(do)e(editing)i(of)150 2654 y(the)k(input)f(line.)49 +b(F)-8 b(or)34 b(y)m(our)f(con)m(v)m(enience,)j(man)m(y)d(other)g +(commands)f(ha)m(v)m(e)j(b)s(een)d(added)g(in)h(addition)150 +2764 y(to)j Fl(C-b)p Ft(,)f Fl(C-f)p Ft(,)g Fl(C-d)p +Ft(,)h(and)e Fs(DEL)p Ft(.)54 b(Here)35 b(are)g(some)h(commands)e(for)h +(mo)m(ving)h(more)f(rapidly)f(ab)s(out)h(the)150 2873 +y(line.)150 3035 y Fl(C-a)336 b Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h +(of)g(the)f(line.)150 3197 y Fl(C-e)336 b Ft(Mo)m(v)m(e)32 +b(to)g(the)e(end)g(of)g(the)h(line.)150 3358 y Fl(M-f)336 +b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m(ord,)f(where)g(a)h(w)m(ord)f +(is)g(comp)s(osed)g(of)h(letters)h(and)d(digits.)150 +3519 y Fl(M-b)336 b Ft(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)g(w)m(ord.) +150 3680 y Fl(C-l)336 b Ft(Clear)31 b(the)f(screen,)h(reprin)m(ting)f +(the)h(curren)m(t)f(line)h(at)g(the)f(top.)275 3843 y(Notice)c(ho)m(w)f +Fl(C-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m(haracter,)j(while)d +Fl(M-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m(ord.)39 +b(It)24 b(is)h(a)g(lo)s(ose)150 3952 y(con)m(v)m(en)m(tion)32 +b(that)f(con)m(trol)g(k)m(eystrok)m(es)h(op)s(erate)e(on)g(c)m +(haracters)h(while)f(meta)h(k)m(eystrok)m(es)h(op)s(erate)e(on)150 +4062 y(w)m(ords.)150 4263 y Fi(1.2.3)63 b(Readline)40 +b(Killing)i(Commands)150 4410 y Fj(Killing)35 b Ft(text)28 +b(means)e(to)h(delete)h(the)f(text)g(from)g(the)f(line,)i(but)e(to)h +(sa)m(v)m(e)h(it)g(a)m(w)m(a)m(y)g(for)e(later)i(use,)f(usually)150 +4519 y(b)m(y)g Fj(y)m(anking)35 b Ft(\(re-inserting\))28 +b(it)g(bac)m(k)f(in)m(to)h(the)f(line.)40 b(\(`Cut')27 +b(and)g(`paste')h(are)f(more)g(recen)m(t)h(jargon)f(for)150 +4629 y(`kill')32 b(and)d(`y)m(ank'.\))275 4765 y(If)g(the)i +(description)f(for)g(a)h(command)f(sa)m(ys)g(that)h(it)g(`kills')g +(text,)h(then)e(y)m(ou)g(can)h(b)s(e)e(sure)h(that)h(y)m(ou)150 +4875 y(can)g(get)g(the)g(text)g(bac)m(k)g(in)f(a)h(di\013eren)m(t)g +(\(or)g(the)f(same\))h(place)h(later.)275 5011 y(When)23 +b(y)m(ou)g(use)g(a)h(kill)g(command,)g(the)g(text)g(is)f(sa)m(v)m(ed)i +(in)e(a)g Fj(kill-ring)p Ft(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h +(consecutiv)m(e)150 5121 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g +(killed)h(text)g(together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)f +(bac)m(k,)h(y)m(ou)g(get)g(it)f(all.)43 b(The)150 5230 +y(kill)33 b(ring)f(is)g(not)h(line)g(sp)s(eci\014c;)g(the)g(text)g +(that)g(y)m(ou)g(killed)f(on)h(a)f(previously)g(t)m(yp)s(ed)h(line)f +(is)h(a)m(v)-5 b(ailable)150 5340 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac) +m(k)g(later,)h(when)d(y)m(ou)i(are)g(t)m(yping)f(another)h(line.)p +eop end +%%Page: 3 7 +TeXDict begin 3 6 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(3)275 299 y(Here)30 +b(is)h(the)f(list)h(of)g(commands)f(for)g(killing)h(text.)150 +456 y Fl(C-k)336 b Ft(Kill)31 b(the)f(text)i(from)e(the)g(curren)m(t)g +(cursor)g(p)s(osition)h(to)g(the)f(end)g(of)g(the)h(line.)150 +614 y Fl(M-d)336 b Ft(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g +(of)h(the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m +(ords,)g(to)g(the)630 723 y(end)j(of)g(the)h(next)f(w)m(ord.)41 +b(W)-8 b(ord)30 b(b)s(oundaries)f(are)i(the)g(same)f(as)h(those)g(used) +f(b)m(y)g Fl(M-f)p Ft(.)150 881 y Fl(M-DEL)240 b Ft(Kill)34 +b(from)f(the)g(cursor)g(to)h(the)g(start)g(of)g(the)f(curren)m(t)g(w)m +(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m(ords,)g(to)630 +991 y(the)28 b(start)g(of)g(the)g(previous)f(w)m(ord.)39 +b(W)-8 b(ord)28 b(b)s(oundaries)e(are)i(the)g(same)g(as)g(those)g(used) +f(b)m(y)630 1100 y Fl(M-b)p Ft(.)150 1258 y Fl(C-w)336 +b Ft(Kill)35 b(from)g(the)g(cursor)f(to)i(the)f(previous)g(whitespace.) +55 b(This)34 b(is)h(di\013eren)m(t)h(than)e Fl(M-DEL)630 +1367 y Ft(b)s(ecause)c(the)h(w)m(ord)f(b)s(oundaries)f(di\013er.)275 +1525 y(Here)42 b(is)f(ho)m(w)h(to)g Fj(y)m(ank)47 b Ft(the)42 +b(text)g(bac)m(k)h(in)m(to)f(the)g(line.)74 b(Y)-8 b(anking)43 +b(means)e(to)h(cop)m(y)h(the)e(most-)150 1634 y(recen)m(tly-killed)33 +b(text)e(from)f(the)g(kill)i(bu\013er.)150 1792 y Fl(C-y)336 +b Ft(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h(killed)f(text)g(bac)m +(k)g(in)m(to)h(the)e(bu\013er)g(at)h(the)f(cursor.)150 +1949 y Fl(M-y)336 b Ft(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h +(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h +(the)g(prior)630 2059 y(command)30 b(is)h Fl(C-y)e Ft(or)h +Fl(M-y)p Ft(.)150 2256 y Fi(1.2.4)63 b(Readline)40 b(Argumen)m(ts)150 +2403 y Ft(Y)-8 b(ou)40 b(can)f(pass)g(n)m(umeric)f(argumen)m(ts)i(to)f +(Readline)h(commands.)67 b(Sometimes)39 b(the)g(argumen)m(t)h(acts)150 +2513 y(as)g(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)f(it)h(is)f(the)g +Fk(sign)47 b Ft(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m +(t.)71 b(If)40 b(y)m(ou)150 2622 y(pass)33 b(a)h(negativ)m(e)i(argumen) +m(t)e(to)g(a)g(command)f(whic)m(h)g(normally)h(acts)g(in)f(a)h(forw)m +(ard)f(direction,)i(that)150 2732 y(command)g(will)h(act)g(in)f(a)h +(bac)m(kw)m(ard)f(direction.)57 b(F)-8 b(or)36 b(example,)h(to)f(kill)g +(text)g(bac)m(k)g(to)g(the)g(start)g(of)150 2842 y(the)31 +b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Fs(M--)f(C-k)p +Ft('.)275 2975 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g +(argumen)m(ts)h(to)g(a)f(command)g(is)g(to)h(t)m(yp)s(e)f(meta)i +(digits)e(b)s(efore)150 3085 y(the)j(command.)42 b(If)30 +b(the)h(\014rst)f(`digit')i(t)m(yp)s(ed)f(is)g(a)g(min)m(us)f(sign)h +(\(`)p Fs(-)p Ft('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150 +3194 y(will)39 b(b)s(e)e(negativ)m(e.)66 b(Once)38 b(y)m(ou)h(ha)m(v)m +(e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)g(to)f(get)i(the)e(argumen)m(t)h +(started,)i(y)m(ou)150 3304 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)f +(of)h(the)g(digits,)h(and)f(then)f(the)h(command.)40 +b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fl(C-d)150 +3414 y Ft(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f +(t)m(yp)s(e)h(`)p Fs(M-1)29 b(0)h(C-d)p Ft(',)39 b(whic)m(h)e(will)h +(delete)h(the)e(next)h(ten)150 3523 y(c)m(haracters)32 +b(on)e(the)h(input)e(line.)150 3720 y Fi(1.2.5)63 b(Searc)m(hing)40 +b(for)i(Commands)g(in)f(the)g(History)150 3867 y Ft(Readline)22 +b(pro)m(vides)f(commands)g(for)g(searc)m(hing)h(through)f(the)g +(command)h(history)f(for)g(lines)g(con)m(taining)150 +3977 y(a)31 b(sp)s(eci\014ed)e(string.)41 b(There)30 +b(are)h(t)m(w)m(o)g(searc)m(h)g(mo)s(des:)41 b Fj(incremen)m(tal)35 +b Ft(and)30 b Fj(non-incremen)m(tal)p Ft(.)275 4111 y(Incremen)m(tal)c +(searc)m(hes)h(b)s(egin)e(b)s(efore)g(the)h(user)f(has)h(\014nished)e +(t)m(yping)i(the)g(searc)m(h)g(string.)39 b(As)26 b(eac)m(h)150 +4220 y(c)m(haracter)37 b(of)e(the)h(searc)m(h)g(string)f(is)h(t)m(yp)s +(ed,)g(Readline)g(displa)m(ys)g(the)f(next)h(en)m(try)g(from)e(the)i +(history)150 4330 y(matc)m(hing)25 b(the)f(string)g(t)m(yp)s(ed)g(so)g +(far.)39 b(An)23 b(incremen)m(tal)j(searc)m(h)e(requires)g(only)g(as)g +(man)m(y)g(c)m(haracters)i(as)150 4439 y(needed)i(to)i(\014nd)d(the)i +(desired)f(history)h(en)m(try)-8 b(.)41 b(T)-8 b(o)29 +b(searc)m(h)h(bac)m(kw)m(ard)f(in)f(the)h(history)g(for)f(a)i +(particular)150 4549 y(string,)g(t)m(yp)s(e)f Fl(C-r)p +Ft(.)40 b(T)m(yping)29 b Fl(C-s)g Ft(searc)m(hes)h(forw)m(ard)f +(through)g(the)g(history)-8 b(.)41 b(The)29 b(c)m(haracters)i(presen)m +(t)150 4658 y(in)38 b(the)g(v)-5 b(alue)38 b(of)g(the)g +Fs(isearch-terminators)33 b Ft(v)-5 b(ariable)39 b(are)f(used)f(to)i +(terminate)g(an)f(incremen)m(tal)150 4768 y(searc)m(h.)71 +b(If)40 b(that)h(v)-5 b(ariable)41 b(has)f(not)h(b)s(een)e(assigned)i +(a)f(v)-5 b(alue,)44 b(the)c Fs(ESC)g Ft(and)f Fl(C-J)h +Ft(c)m(haracters)i(will)150 4878 y(terminate)h(an)g(incremen)m(tal)g +(searc)m(h.)78 b Fl(C-g)41 b Ft(will)i(ab)s(ort)f(an)g(incremen)m(tal)i +(searc)m(h)f(and)f(restore)h(the)150 4987 y(original)30 +b(line.)41 b(When)28 b(the)h(searc)m(h)h(is)f(terminated,)h(the)f +(history)g(en)m(try)g(con)m(taining)h(the)f(searc)m(h)h(string)150 +5097 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275 5230 +y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)g(en)m(tries)g(in)e(the)h +(history)g(list,)h(t)m(yp)s(e)g Fl(C-r)e Ft(or)h Fl(C-s)f +Ft(as)h(appropriate.)43 b(This)150 5340 y(will)26 b(searc)m(h)h(bac)m +(kw)m(ard)g(or)f(forw)m(ard)g(in)f(the)i(history)f(for)g(the)g(next)g +(en)m(try)h(matc)m(hing)g(the)f(searc)m(h)h(string)p +eop end +%%Page: 4 8 +TeXDict begin 4 7 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(4)150 299 y(t)m(yp)s(ed)37 +b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i(sequence)f(b)s(ound)e(to) +i(a)g(Readline)h(command)e(will)h(terminate)h(the)150 +408 y(searc)m(h)26 b(and)f(execute)i(that)f(command.)39 +b(F)-8 b(or)26 b(instance,)h(a)f Fs(RET)f Ft(will)g(terminate)i(the)f +(searc)m(h)g(and)e(accept)150 518 y(the)30 b(line,)g(thereb)m(y)f +(executing)i(the)e(command)g(from)g(the)h(history)f(list.)41 +b(A)29 b(mo)m(v)m(emen)m(t)j(command)d(will)150 628 y(terminate)i(the)g +(searc)m(h,)g(mak)m(e)h(the)e(last)h(line)g(found)e(the)i(curren)m(t)f +(line,)h(and)f(b)s(egin)g(editing.)275 777 y(Readline)35 +b(remem)m(b)s(ers)f(the)h(last)h(incremen)m(tal)g(searc)m(h)f(string.) +54 b(If)34 b(t)m(w)m(o)j Fl(C-r)p Ft(s)c(are)i(t)m(yp)s(ed)g(without) +150 886 y(an)m(y)i(in)m(terv)m(ening)g(c)m(haracters)h(de\014ning)e(a)h +(new)f(searc)m(h)h(string,)h(an)m(y)f(remem)m(b)s(ered)e(searc)m(h)i +(string)g(is)150 996 y(used.)275 1145 y(Non-incremen)m(tal)48 +b(searc)m(hes)g(read)e(the)h(en)m(tire)h(searc)m(h)f(string)g(b)s +(efore)f(starting)h(to)h(searc)m(h)f(for)150 1255 y(matc)m(hing)d +(history)e(lines.)78 b(The)42 b(searc)m(h)h(string)g(ma)m(y)g(b)s(e)f +(t)m(yp)s(ed)g(b)m(y)g(the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150 +1364 y(con)m(ten)m(ts)32 b(of)f(the)f(curren)m(t)g(line.)150 +1627 y Fr(1.3)68 b(Readline)47 b(Init)e(File)150 1786 +y Ft(Although)f(the)g(Readline)g(library)f(comes)i(with)e(a)h(set)h(of) +f(Emacs-lik)m(e)h(k)m(eybindings)f(installed)g(b)m(y)150 +1896 y(default,)26 b(it)g(is)e(p)s(ossible)h(to)g(use)f(a)i(di\013eren) +m(t)f(set)g(of)g(k)m(eybindings.)38 b(An)m(y)25 b(user)f(can)h +(customize)h(programs)150 2005 y(that)39 b(use)g(Readline)g(b)m(y)f +(putting)h(commands)f(in)g(an)h Fj(inputrc)k Ft(\014le,)e(con)m(v)m(en) +m(tionally)h(in)c(their)h(home)150 2115 y(directory)-8 +b(.)39 b(The)23 b(name)h(of)f(this)h(\014le)f(is)g(tak)m(en)i(from)e +(the)g(v)-5 b(alue)24 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5 +b(ariable)25 b Fs(INPUTRC)p Ft(.)150 2224 y(If)30 b(that)g(v)-5 +b(ariable)31 b(is)f(unset,)g(the)h(default)f(is)g Fs(~/.inputrc)p +Ft(.)38 b(If)30 b(that)g(\014le)h(do)s(es)e(not)i(exist)g(or)f(cannot)h +(b)s(e)150 2334 y(read,)g(the)f(ultimate)i(default)e(is)h +Fs(/etc/inputrc)p Ft(.)275 2483 y(When)e(a)h(program)f(whic)m(h)h(uses) +f(the)h(Readline)g(library)f(starts)h(up,)f(the)h(init)g(\014le)f(is)h +(read,)g(and)f(the)150 2593 y(k)m(ey)i(bindings)e(are)i(set.)275 +2742 y(In)26 b(addition,)i(the)f Fs(C-x)i(C-r)d Ft(command)h(re-reads)g +(this)f(init)h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m +(hanges)150 2851 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g +(it.)150 3065 y Fi(1.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)150 +3212 y Ft(There)f(are)i(only)f(a)g(few)g(basic)g(constructs)h(allo)m(w) +m(ed)h(in)d(the)h(Readline)h(init)f(\014le.)73 b(Blank)41 +b(lines)h(are)150 3322 y(ignored.)72 b(Lines)41 b(b)s(eginning)f(with)h +(a)g(`)p Fs(#)p Ft(')g(are)h(commen)m(ts.)73 b(Lines)41 +b(b)s(eginning)f(with)g(a)i(`)p Fs($)p Ft(')f(indicate)150 +3431 y(conditional)i(constructs)e(\(see)i(Section)f(1.3.2)h +([Conditional)f(Init)f(Constructs],)j(page)f(13\).)74 +b(Other)150 3541 y(lines)31 b(denote)g(v)-5 b(ariable)31 +b(settings)g(and)f(k)m(ey)h(bindings.)150 3722 y(V)-8 +b(ariable)32 b(Settings)630 3832 y(Y)-8 b(ou)41 b(can)g(mo)s(dify)e +(the)i(run-time)f(b)s(eha)m(vior)g(of)h(Readline)g(b)m(y)f(altering)h +(the)g(v)-5 b(alues)41 b(of)630 3941 y(v)-5 b(ariables)34 +b(in)f(Readline)i(using)e(the)g Fs(set)g Ft(command)g(within)g(the)h +(init)g(\014le.)50 b(The)33 b(syn)m(tax)630 4051 y(is)d(simple:)870 +4193 y Fs(set)47 b Fl(variable)e(value)630 4335 y Ft(Here,)29 +b(for)e(example,)h(is)g(ho)m(w)f(to)h(c)m(hange)g(from)f(the)g(default) +h(Emacs-lik)m(e)h(k)m(ey)f(binding)e(to)630 4444 y(use)k +Fs(vi)g Ft(line)h(editing)g(commands:)870 4586 y Fs(set)47 +b(editing-mode)d(vi)630 4728 y Ft(V)-8 b(ariable)36 b(names)f(and)g(v) +-5 b(alues,)36 b(where)f(appropriate,)h(are)g(recognized)g(without)f +(regard)630 4837 y(to)c(case.)42 b(Unrecognized)31 b(v)-5 +b(ariable)31 b(names)g(are)f(ignored.)630 4979 y(Bo)s(olean)c(v)-5 +b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f(set)i(to)g(on)f(or)g +(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the)g(v)-5 +b(alue)26 b(is)630 5089 y(n)m(ull)e(or)g(empt)m(y)-8 +b(,)27 b Fj(on)d Ft(\(case-insensitiv)m(e\),)29 b(or)24 +b(1.)39 b(An)m(y)25 b(other)f(v)-5 b(alue)25 b(results)f(in)g(the)g(v) +-5 b(ariable)630 5198 y(b)s(eing)30 b(set)h(to)g(o\013.)630 +5340 y(A)f(great)i(deal)f(of)g(run-time)f(b)s(eha)m(vior)g(is)g(c)m +(hangeable)j(with)d(the)g(follo)m(wing)i(v)-5 b(ariables.)p +eop end +%%Page: 5 9 +TeXDict begin 5 8 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(5)630 299 y Fs +(active-region-start-colo)o(r)1110 408 y Ft(A)27 b(string)f(v)-5 +b(ariable)27 b(that)g(con)m(trols)h(the)f(text)g(color)h(and)e(bac)m +(kground)g(when)1110 518 y(displa)m(ying)50 b(the)f(text)h(in)f(the)h +(activ)m(e)h(region)f(\(see)g(the)g(description)f(of)1110 +628 y Fs(enable-active-region)25 b Ft(b)s(elo)m(w\).)43 +b(This)30 b(string)h(m)m(ust)f(not)h(tak)m(e)i(up)d(an)m(y)1110 +737 y(ph)m(ysical)25 b(c)m(haracter)h(p)s(ositions)f(on)g(the)f(displa) +m(y)-8 b(,)27 b(so)e(it)g(should)f(consist)h(only)1110 +847 y(of)37 b(terminal)g(escap)s(e)g(sequences.)61 b(It)36 +b(is)h(output)g(to)g(the)g(terminal)g(b)s(efore)1110 +956 y(displa)m(ying)h(the)f(text)i(in)e(the)h(activ)m(e)h(region.)63 +b(This)37 b(v)-5 b(ariable)38 b(is)f(reset)h(to)1110 +1066 y(the)29 b(default)g(v)-5 b(alue)29 b(whenev)m(er)f(the)h +(terminal)g(t)m(yp)s(e)g(c)m(hanges.)41 b(The)28 b(default)1110 +1176 y(v)-5 b(alue)30 b(is)f(the)g(string)g(that)h(puts)e(the)i +(terminal)f(in)g(standout)g(mo)s(de,)g(as)h(ob-)1110 +1285 y(tained)40 b(from)f(the)h(terminal's)g(terminfo)g(description.)68 +b(A)40 b(sample)f(v)-5 b(alue)1110 1395 y(migh)m(t)31 +b(b)s(e)f(`)p Fs(\\e[01;33m)p Ft('.)630 1570 y Fs +(active-region-end-color)1110 1680 y Ft(A)48 b(string)g(v)-5 +b(ariable)48 b(that)h Fs(")p Ft(undo)s(es)p Fs(")d Ft(the)i(e\013ects)h +(of)f Fs(active-region-)1110 1789 y(start-color)36 b +Ft(and)i(restores)h Fs(")p Ft(normal)p Fs(")f Ft(terminal)h(displa)m(y) +g(app)s(earance)1110 1899 y(after)26 b(displa)m(ying)h(text)f(in)g(the) +g(activ)m(e)i(region.)40 b(This)25 b(string)h(m)m(ust)f(not)h(tak)m(e) +1110 2008 y(up)e(an)m(y)h(ph)m(ysical)h(c)m(haracter)h(p)s(ositions)d +(on)h(the)h(displa)m(y)-8 b(,)27 b(so)e(it)g(should)f(con-)1110 +2118 y(sist)29 b(only)h(of)f(terminal)h(escap)s(e)f(sequences.)41 +b(It)29 b(is)g(output)g(to)h(the)f(terminal)1110 2228 +y(after)36 b(displa)m(ying)g(the)g(text)h(in)e(the)h(activ)m(e)i +(region.)58 b(This)34 b(v)-5 b(ariable)37 b(is)f(re-)1110 +2337 y(set)e(to)g(the)g(default)g(v)-5 b(alue)34 b(whenev)m(er)f(the)h +(terminal)g(t)m(yp)s(e)f(c)m(hanges.)51 b(The)1110 2447 +y(default)38 b(v)-5 b(alue)39 b(is)f(the)h(string)f(that)h(restores)f +(the)h(terminal)f(from)g(stand-)1110 2556 y(out)30 b(mo)s(de,)f(as)g +(obtained)h(from)f(the)g(terminal's)h(terminfo)f(description.)41 +b(A)1110 2666 y(sample)31 b(v)-5 b(alue)30 b(migh)m(t)h(b)s(e)f(`)p +Fs(\\e[0m)p Ft('.)630 2841 y Fs(bell-style)1110 2951 +y Ft(Con)m(trols)44 b(what)g(happ)s(ens)e(when)h(Readline)i(w)m(an)m +(ts)f(to)h(ring)e(the)h(termi-)1110 3061 y(nal)37 b(b)s(ell.)61 +b(If)37 b(set)h(to)g(`)p Fs(none)p Ft(',)g(Readline)g(nev)m(er)g(rings) +e(the)i(b)s(ell.)61 b(If)36 b(set)i(to)1110 3170 y(`)p +Fs(visible)p Ft(',)32 b(Readline)i(uses)f(a)g(visible)g(b)s(ell)g(if)g +(one)g(is)g(a)m(v)-5 b(ailable.)51 b(If)33 b(set)g(to)1110 +3280 y(`)p Fs(audible)p Ft(')j(\(the)i(default\),)i(Readline)e +(attempts)g(to)h(ring)e(the)g(terminal's)1110 3389 y(b)s(ell.)630 +3565 y Fs(bind-tty-special-chars)1110 3674 y Ft(If)e(set)g(to)h(`)p +Fs(on)p Ft(')f(\(the)g(default\),)i(Readline)f(attempts)g(to)g(bind)d +(the)i(con)m(trol)1110 3784 y(c)m(haracters)30 b(treated)g(sp)s +(ecially)g(b)m(y)f(the)g(k)m(ernel's)h(terminal)f(driv)m(er)g(to)h +(their)1110 3893 y(Readline)h(equiv)-5 b(alen)m(ts.)630 +4069 y Fs(blink-matching-paren)1110 4178 y Ft(If)36 b(set)g(to)h(`)p +Fs(on)p Ft(',)h(Readline)f(attempts)g(to)g(brie\015y)e(mo)m(v)m(e)j +(the)f(cursor)e(to)i(an)1110 4288 y(op)s(ening)k(paren)m(thesis)h(when) +f(a)h(closing)h(paren)m(thesis)e(is)h(inserted.)74 b(The)1110 +4398 y(default)31 b(is)f(`)p Fs(off)p Ft('.)630 4573 +y Fs(colored-completion-prefi)o(x)1110 4682 y Ft(If)f(set)h(to)g(`)p +Fs(on)p Ft(',)g(when)e(listing)i(completions,)h(Readline)f(displa)m(ys) +g(the)f(com-)1110 4792 y(mon)c(pre\014x)f(of)i(the)f(set)h(of)g(p)s +(ossible)f(completions)h(using)f(a)h(di\013eren)m(t)g(color.)1110 +4902 y(The)f(color)h(de\014nitions)f(are)h(tak)m(en)g(from)f(the)g(v)-5 +b(alue)26 b(of)g(the)f Fs(LS_COLORS)e Ft(en-)1110 5011 +y(vironmen)m(t)34 b(v)-5 b(ariable.)50 b(If)33 b(there)h(is)g(a)f +(color)i(de\014nition)e(in)g Fs(LS_COLORS)e Ft(for)1110 +5121 y(the)22 b(custom)g(su\016x)f(`)p Fs(readline-colored-complet)o +(ion)o(-pre)o(fix)p Ft(',)c(Read-)1110 5230 y(line)24 +b(uses)e(this)i(color)g(for)f(the)h(common)f(pre\014x)f(instead)i(of)f +(its)h(default.)38 b(The)1110 5340 y(default)31 b(is)f(`)p +Fs(off)p Ft('.)p eop end +%%Page: 6 10 +TeXDict begin 6 9 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(6)630 299 y Fs(colored-stats)1110 +408 y Ft(If)26 b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)f(displa)m(ys) +g(p)s(ossible)f(completions)h(using)f(di\013eren)m(t)1110 +518 y(colors)40 b(to)g(indicate)g(their)f(\014le)h(t)m(yp)s(e.)67 +b(The)38 b(color)j(de\014nitions)d(are)i(tak)m(en)1110 +628 y(from)24 b(the)h(v)-5 b(alue)25 b(of)g(the)g Fs(LS_COLORS)d +Ft(en)m(vironmen)m(t)j(v)-5 b(ariable.)40 b(The)24 b(default)1110 +737 y(is)30 b(`)p Fs(off)p Ft('.)630 925 y Fs(comment-begin)1110 +1035 y Ft(The)62 b(string)g(to)h(insert)f(at)h(the)g(b)s(eginning)e(of) +h(the)h(line)f(when)g(the)1110 1144 y Fs(insert-comment)26 +b Ft(command)31 b(is)f(executed.)42 b(The)30 b(default)g(v)-5 +b(alue)31 b(is)f Fs("#")p Ft(.)630 1332 y Fs(completion-display-width) +1110 1442 y Ft(The)41 b(n)m(um)m(b)s(er)f(of)i(screen)g(columns)f(used) +g(to)h(displa)m(y)g(p)s(ossible)f(matc)m(hes)1110 1551 +y(when)28 b(p)s(erforming)g(completion.)41 b(The)29 b(v)-5 +b(alue)29 b(is)g(ignored)g(if)g(it)h(is)f(less)g(than)1110 +1661 y(0)e(or)f(greater)h(than)f(the)g(terminal)h(screen)f(width.)39 +b(A)26 b(v)-5 b(alue)27 b(of)f(0)h(will)f(cause)1110 +1771 y(matc)m(hes)32 b(to)f(b)s(e)e(displa)m(y)m(ed)i(one)g(p)s(er)e +(line.)41 b(The)30 b(default)h(v)-5 b(alue)31 b(is)f(-1.)630 +1958 y Fs(completion-ignore-case)1110 2068 y Ft(If)d(set)h(to)g(`)p +Fs(on)p Ft(',)g(Readline)g(p)s(erforms)e(\014lename)h(matc)m(hing)i +(and)e(completion)1110 2178 y(in)j(a)h(case-insensitiv)m(e)i(fashion.) +40 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p Fs(off)p +Ft('.)630 2365 y Fs(completion-map-case)1110 2475 y Ft(If)22 +b(set)g(to)h(`)p Fs(on)p Ft(',)h(and)e Fj(completion-ignore-case)31 +b Ft(is)22 b(enabled,)i(Readline)f(treats)1110 2585 y(h)m(yphens)29 +b(\(`)p Fs(-)p Ft('\))j(and)e(underscores)g(\(`)p Fs(_)p +Ft('\))i(as)f(equiv)-5 b(alen)m(t)32 b(when)e(p)s(erforming)1110 +2694 y(case-insensitiv)m(e)47 b(\014lename)e(matc)m(hing)g(and)f +(completion.)85 b(The)44 b(default)1110 2804 y(v)-5 b(alue)31 +b(is)f(`)p Fs(off)p Ft('.)630 2992 y Fs(completion-prefix-displa)o +(y-le)o(ngth)1110 3101 y Ft(The)h(length)g(in)g(c)m(haracters)i(of)f +(the)f(common)h(pre\014x)e(of)h(a)h(list)g(of)f(p)s(ossible)1110 +3211 y(completions)g(that)f(is)g(displa)m(y)m(ed)g(without)g(mo)s +(di\014cation.)41 b(When)29 b(set)h(to)h(a)1110 3320 +y(v)-5 b(alue)26 b(greater)h(than)e(zero,)j(common)e(pre\014xes)e +(longer)j(than)e(this)g(v)-5 b(alue)27 b(are)1110 3430 +y(replaced)k(with)f(an)g(ellipsis)h(when)e(displa)m(ying)i(p)s(ossible) +f(completions.)630 3618 y Fs(completion-query-items)1110 +3727 y Ft(The)c(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h +(that)g(determines)f(when)f(the)i(user)1110 3837 y(is)43 +b(ask)m(ed)g(whether)f(the)g(list)h(of)g(p)s(ossibilities)g(should)f(b) +s(e)g(displa)m(y)m(ed.)77 b(If)1110 3947 y(the)29 b(n)m(um)m(b)s(er)f +(of)h(p)s(ossible)g(completions)h(is)f(greater)h(than)f(or)g(equal)g +(to)h(this)1110 4056 y(v)-5 b(alue,)45 b(Readline)e(will)f(ask)g +(whether)f(or)h(not)g(the)g(user)f(wishes)g(to)i(view)1110 +4166 y(them;)33 b(otherwise,)f(they)g(are)g(simply)g(listed.)45 +b(This)31 b(v)-5 b(ariable)33 b(m)m(ust)e(b)s(e)g(set)1110 +4275 y(to)43 b(an)e(in)m(teger)j(v)-5 b(alue)42 b(greater)h(than)f(or)g +(equal)g(to)h(zero.)76 b(A)42 b(zero)g(v)-5 b(alue)1110 +4385 y(means)40 b(Readline)h(should)f(nev)m(er)g(ask;)46 +b(negativ)m(e)d(v)-5 b(alues)41 b(are)f(treated)i(as)1110 +4495 y(zero.)g(The)29 b(default)i(limit)g(is)g Fs(100)p +Ft(.)630 4682 y Fs(convert-meta)1110 4792 y Ft(If)22 +b(set)g(to)h(`)p Fs(on)p Ft(',)h(Readline)f(will)f(con)m(v)m(ert)i(c)m +(haracters)f(with)f(the)g(eigh)m(th)h(bit)f(set)1110 +4902 y(to)33 b(an)e Fm(asci)r(i)h Ft(k)m(ey)h(sequence)f(b)m(y)g +(stripping)f(the)h(eigh)m(th)h(bit)f(and)f(pre\014xing)1110 +5011 y(an)24 b Fs(ESC)g Ft(c)m(haracter,)j(con)m(v)m(erting)f(them)f +(to)g(a)g(meta-pre\014xed)f(k)m(ey)h(sequence.)1110 5121 +y(The)i(default)h(v)-5 b(alue)28 b(is)f(`)p Fs(on)p Ft(',)i(but)d(will) +i(b)s(e)f(set)h(to)g(`)p Fs(off)p Ft(')g(if)f(the)h(lo)s(cale)h(is)f +(one)1110 5230 y(that)21 b(con)m(tains)h(eigh)m(t-bit)h(c)m(haracters.) +39 b(This)20 b(v)-5 b(ariable)21 b(is)g(dep)s(enden)m(t)f(on)h(the)1110 +5340 y Fs(LC_CTYPE)26 b Ft(lo)s(cale)31 b(category)-8 +b(,)31 b(and)d(ma)m(y)h(c)m(hange)h(if)e(the)h(lo)s(cale)h(is)f(c)m +(hanged.)p eop end +%%Page: 7 11 +TeXDict begin 7 10 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(7)630 299 y Fs(disable-completion) +1110 408 y Ft(If)36 b(set)h(to)h(`)p Fs(On)p Ft(',)g(Readline)f(will)g +(inhibit)f(w)m(ord)h(completion.)60 b(Completion)1110 +518 y(c)m(haracters)28 b(will)e(b)s(e)f(inserted)h(in)m(to)h(the)g +(line)f(as)g(if)g(they)h(had)e(b)s(een)g(mapp)s(ed)1110 +628 y(to)31 b Fs(self-insert)p Ft(.)38 b(The)30 b(default)g(is)h(`)p +Fs(off)p Ft('.)630 774 y Fs(echo-control-characters)1110 +883 y Ft(When)f(set)h(to)g(`)p Fs(on)p Ft(',)f(on)g(op)s(erating)h +(systems)f(that)h(indicate)g(they)g(supp)s(ort)1110 993 +y(it,)e(Readline)g(ec)m(ho)s(es)g(a)f(c)m(haracter)i(corresp)s(onding)d +(to)i(a)f(signal)h(generated)1110 1103 y(from)h(the)g(k)m(eyb)s(oard.) +41 b(The)30 b(default)g(is)h(`)p Fs(on)p Ft('.)630 1249 +y Fs(editing-mode)1110 1358 y Ft(The)d Fs(editing-mode)e +Ft(v)-5 b(ariable)29 b(con)m(trols)h(whic)m(h)e(default)h(set)h(of)e(k) +m(ey)i(bind-)1110 1468 y(ings)25 b(is)g(used.)38 b(By)26 +b(default,)g(Readline)g(starts)f(up)f(in)h(Emacs)g(editing)h(mo)s(de,) +1110 1577 y(where)j(the)g(k)m(eystrok)m(es)i(are)e(most)h(similar)f(to) +h(Emacs.)40 b(This)29 b(v)-5 b(ariable)30 b(can)1110 +1687 y(b)s(e)g(set)h(to)g(either)g(`)p Fs(emacs)p Ft(')e(or)h(`)p +Fs(vi)p Ft('.)630 1833 y Fs(emacs-mode-string)1110 1943 +y Ft(If)j(the)h Fj(sho)m(w-mo)s(de-in-prompt)h Ft(v)-5 +b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110 +2052 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f +(of)h(the)f(primary)f(prompt)g(when)1110 2162 y(emacs)g(editing)h(mo)s +(de)e(is)h(activ)m(e.)40 b(The)21 b(v)-5 b(alue)22 b(is)g(expanded)f +(lik)m(e)h(a)h(k)m(ey)f(bind-)1110 2271 y(ing,)27 b(so)f(the)f +(standard)g(set)h(of)f(meta-)i(and)e(con)m(trol)i(pre\014xes)d(and)h +(bac)m(kslash)1110 2381 y(escap)s(e)f(sequences)h(is)e(a)m(v)-5 +b(ailable.)41 b(Use)25 b(the)f(`)p Fs(\\1)p Ft(')f(and)h(`)p +Fs(\\2)p Ft(')g(escap)s(es)g(to)g(b)s(egin)1110 2491 +y(and)37 b(end)g(sequences)h(of)f(non-prin)m(ting)h(c)m(haracters,)j +(whic)m(h)c(can)h(b)s(e)f(used)1110 2600 y(to)h(em)m(b)s(ed)f(a)g +(terminal)h(con)m(trol)h(sequence)f(in)m(to)g(the)f(mo)s(de)g(string.) +61 b(The)1110 2710 y(default)31 b(is)f(`)p Fs(@)p Ft('.)630 +2856 y Fs(enable-active-region)1110 2966 y Ft(The)46 +b Fj(p)s(oin)m(t)j Ft(is)e(the)g(curren)m(t)f(cursor)g(p)s(osition,)52 +b(and)46 b Fj(mark)52 b Ft(refers)46 b(to)i(a)1110 3075 +y(sa)m(v)m(ed)37 b(cursor)f(p)s(osition)g(\(see)i(Section)f(1.4.1)h +([Commands)d(F)-8 b(or)37 b(Mo)m(ving],)1110 3185 y(page)25 +b(17\).)40 b(The)24 b(text)h(b)s(et)m(w)m(een)g(the)g(p)s(oin)m(t)f +(and)g(mark)g(is)g(referred)g(to)h(as)g(the)1110 3294 +y Fj(region)p Ft(.)62 b(When)37 b(this)g(v)-5 b(ariable)38 +b(is)f(set)h(to)g(`)p Fs(On)p Ft(',)h(Readline)f(allo)m(ws)g(certain) +1110 3404 y(commands)f(to)h(designate)h(the)e(region)h(as)g +Fj(activ)m(e)p Ft(.)64 b(When)37 b(the)h(region)g(is)1110 +3513 y(activ)m(e,)43 b(Readline)38 b(highligh)m(ts)h(the)g(text)g(in)e +(the)i(region)g(using)e(the)h(v)-5 b(alue)1110 3623 y(of)35 +b(the)g Fs(active-region-start-color)p Ft(,)30 b(whic)m(h)35 +b(defaults)g(to)h(the)f(string)1110 3733 y(that)23 b(enables)f(the)g +(terminal's)h(standout)e(mo)s(de.)38 b(The)21 b(activ)m(e)k(region)d +(sho)m(ws)1110 3842 y(the)32 b(text)h(inserted)f(b)m(y)g(brac)m(k)m +(eted-paste)i(and)e(an)m(y)g(matc)m(hing)h(text)g(found)1110 +3952 y(b)m(y)f(incremen)m(tal)i(and)e(non-incremen)m(tal)i(history)e +(searc)m(hes.)48 b(The)32 b(default)1110 4061 y(is)e(`)p +Fs(On)p Ft('.)630 4208 y Fs(enable-bracketed-paste)1110 +4317 y Ft(When)36 b(set)h(to)g(`)p Fs(On)p Ft(',)h(Readline)f +(con\014gures)f(the)h(terminal)f(to)i(insert)e(eac)m(h)1110 +4427 y(paste)27 b(in)m(to)g(the)f(editing)h(bu\013er)e(as)h(a)h(single) +g(string)f(of)g(c)m(haracters,)j(instead)1110 4536 y(of)d(treating)i +(eac)m(h)g(c)m(haracter)f(as)g(if)f(it)h(had)f(b)s(een)f(read)i(from)e +(the)i(k)m(eyb)s(oard.)1110 4646 y(This)36 b(is)h(called)h(putting)f +(the)h(terminal)f(in)m(to)h Fj(brac)m(k)m(eted)h(paste)e(mo)s(de)5 +b Ft(;)40 b(it)1110 4756 y(prev)m(en)m(ts)30 b(Readline)h(from)e +(executing)i(an)m(y)f(editing)h(commands)e(b)s(ound)f(to)1110 +4865 y(k)m(ey)j(sequences)g(app)s(earing)f(in)g(the)g(pasted)h(text.)42 +b(The)29 b(default)i(is)f(`)p Fs(On)p Ft('.)630 5011 +y Fs(enable-keypad)1110 5121 y Ft(When)23 b(set)h(to)g(`)p +Fs(on)p Ft(',)h(Readline)f(will)g(try)f(to)h(enable)g(the)f +(application)i(k)m(eypad)1110 5230 y(when)h(it)h(is)f(called.)41 +b(Some)27 b(systems)f(need)h(this)f(to)h(enable)g(the)g(arro)m(w)g(k)m +(eys.)1110 5340 y(The)j(default)g(is)h(`)p Fs(off)p Ft('.)p +eop end +%%Page: 8 12 +TeXDict begin 8 11 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(8)630 299 y Fs(enable-meta-key) +1110 408 y Ft(When)40 b(set)g(to)g(`)p Fs(on)p Ft(',)j(Readline)d(will) +g(try)g(to)g(enable)g(an)m(y)g(meta)h(mo)s(di\014er)1110 +518 y(k)m(ey)i(the)e(terminal)i(claims)f(to)h(supp)s(ort)d(when)h(it)h +(is)g(called.)76 b(On)41 b(man)m(y)1110 628 y(terminals,)c(the)e(meta)h +(k)m(ey)g(is)f(used)g(to)h(send)e(eigh)m(t-bit)j(c)m(haracters.)56 +b(The)1110 737 y(default)31 b(is)f(`)p Fs(on)p Ft('.)630 +894 y Fs(expand-tilde)1110 1003 y Ft(If)d(set)h(to)h(`)p +Fs(on)p Ft(',)f(tilde)g(expansion)g(is)f(p)s(erformed)f(when)h +(Readline)h(attempts)1110 1113 y(w)m(ord)i(completion.)42 +b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)630 1270 +y Fs(history-preserve-point)1110 1379 y Ft(If)41 b(set)h(to)h(`)p +Fs(on)p Ft(',)i(the)c(history)h(co)s(de)g(attempts)h(to)f(place)h(the)f +(p)s(oin)m(t)f(\(the)1110 1489 y(curren)m(t)35 b(cursor)g(p)s +(osition\))g(at)h(the)g(same)f(lo)s(cation)i(on)e(eac)m(h)h(history)g +(line)1110 1598 y(retriev)m(ed)h(with)f Fs(previous-history)c +Ft(or)37 b Fs(next-history)p Ft(.)55 b(The)36 b(default)1110 +1708 y(is)30 b(`)p Fs(off)p Ft('.)630 1864 y Fs(history-size)1110 +1974 y Ft(Set)39 b(the)g(maxim)m(um)g(n)m(um)m(b)s(er)f(of)h(history)g +(en)m(tries)h(sa)m(v)m(ed)g(in)f(the)g(history)1110 2084 +y(list.)51 b(If)34 b(set)g(to)h(zero,)g(an)m(y)f(existing)h(history)f +(en)m(tries)g(are)g(deleted)h(and)e(no)1110 2193 y(new)e(en)m(tries)i +(are)f(sa)m(v)m(ed.)46 b(If)31 b(set)h(to)h(a)f(v)-5 +b(alue)32 b(less)g(than)f(zero,)i(the)f(n)m(um)m(b)s(er)1110 +2303 y(of)f(history)f(en)m(tries)h(is)g(not)g(limited.)42 +b(By)30 b(default,)h(the)g(n)m(um)m(b)s(er)e(of)i(history)1110 +2412 y(en)m(tries)j(is)f(not)g(limited.)49 b(If)32 b(an)h(attempt)h(is) +f(made)g(to)h(set)f Fj(history-size)39 b Ft(to)1110 2522 +y(a)34 b(non-n)m(umeric)f(v)-5 b(alue,)34 b(the)g(maxim)m(um)f(n)m(um)m +(b)s(er)f(of)h(history)h(en)m(tries)g(will)1110 2632 +y(b)s(e)c(set)h(to)g(500.)630 2788 y Fs(horizontal-scroll-mode)1110 +2898 y Ft(This)k(v)-5 b(ariable)37 b(can)f(b)s(e)f(set)h(to)h(either)f +(`)p Fs(on)p Ft(')g(or)g(`)p Fs(off)p Ft('.)57 b(Setting)36 +b(it)g(to)h(`)p Fs(on)p Ft(')1110 3007 y(means)26 b(that)h(the)f(text)h +(of)g(the)f(lines)g(b)s(eing)g(edited)h(will)f(scroll)h(horizon)m +(tally)1110 3117 y(on)32 b(a)g(single)g(screen)g(line)g(when)e(they)i +(are)g(longer)h(than)e(the)h(width)f(of)h(the)1110 3226 +y(screen,)c(instead)g(of)f(wrapping)f(on)m(to)i(a)g(new)e(screen)i +(line.)40 b(This)26 b(v)-5 b(ariable)28 b(is)1110 3336 +y(automatically)k(set)e(to)g(`)p Fs(on)p Ft(')f(for)g(terminals)g(of)h +(heigh)m(t)g(1.)41 b(By)29 b(default,)h(this)1110 3446 +y(v)-5 b(ariable)31 b(is)g(set)f(to)i(`)p Fs(off)p Ft('.)630 +3602 y Fs(input-meta)1110 3712 y Ft(If)f(set)g(to)h(`)p +Fs(on)p Ft(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it) +i(will)f(not)h(clear)1110 3821 y(the)40 b(eigh)m(th)g(bit)g(in)f(the)h +(c)m(haracters)h(it)f(reads\),)j(regardless)c(of)h(what)g(the)1110 +3931 y(terminal)k(claims)h(it)f(can)g(supp)s(ort.)79 +b(The)44 b(default)g(v)-5 b(alue)44 b(is)g(`)p Fs(off)p +Ft(',)j(but)1110 4041 y(Readline)24 b(will)h(set)f(it)g(to)h(`)p +Fs(on)p Ft(')e(if)h(the)g(lo)s(cale)i(con)m(tains)f(eigh)m(t-bit)g(c)m +(haracters.)1110 4150 y(The)k(name)g Fs(meta-flag)e Ft(is)i(a)h(synon)m +(ym)f(for)g(this)g(v)-5 b(ariable.)42 b(This)28 b(v)-5 +b(ariable)1110 4260 y(is)35 b(dep)s(enden)m(t)f(on)h(the)g +Fs(LC_CTYPE)e Ft(lo)s(cale)k(category)-8 b(,)39 b(and)34 +b(ma)m(y)i(c)m(hange)g(if)1110 4369 y(the)31 b(lo)s(cale)h(is)e(c)m +(hanged.)630 4526 y Fs(isearch-terminators)1110 4635 +y Ft(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e(terminate)j +(an)f(incremen)m(tal)1110 4745 y(searc)m(h)25 b(without)g(subsequen)m +(tly)g(executing)h(the)f(c)m(haracter)h(as)f(a)g(command)1110 +4855 y(\(see)45 b(Section)h(1.2.5)g([Searc)m(hing],)j(page)d(3\).)84 +b(If)44 b(this)g(v)-5 b(ariable)45 b(has)g(not)1110 4964 +y(b)s(een)35 b(giv)m(en)h(a)g(v)-5 b(alue,)37 b(the)f(c)m(haracters)h +Fs(ESC)d Ft(and)h Fl(C-J)g Ft(will)h(terminate)g(an)1110 +5074 y(incremen)m(tal)c(searc)m(h.)630 5230 y Fs(keymap)192 +b Ft(Sets)64 b(Readline's)i(idea)f(of)f(the)h(curren)m(t)f(k)m(eymap)h +(for)f(k)m(ey)h(binding)1110 5340 y(commands.)71 b(Built-in)41 +b Fs(keymap)e Ft(names)h(are)h Fs(emacs)p Ft(,)h Fs(emacs-standard)p +Ft(,)p eop end +%%Page: 9 13 +TeXDict begin 9 12 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(9)1110 299 y Fs(emacs-meta)p +Ft(,)99 b Fs(emacs-ctlx)p Ft(,)f Fs(vi)p Ft(,)j Fs(vi-move)p +Ft(,)f Fs(vi-command)p Ft(,)f(and)1110 408 y Fs(vi-insert)p +Ft(.)81 b Fs(vi)44 b Ft(is)h(equiv)-5 b(alen)m(t)46 b(to)g +Fs(vi-command)c Ft(\()p Fs(vi-move)h Ft(is)i(also)h(a)1110 +518 y(synon)m(ym\);)41 b Fs(emacs)c Ft(is)h(equiv)-5 +b(alen)m(t)39 b(to)f Fs(emacs-standard)p Ft(.)59 b(Applications)1110 +628 y(ma)m(y)32 b(add)e(additional)i(names.)43 b(The)30 +b(default)h(v)-5 b(alue)32 b(is)f Fs(emacs)p Ft(.)41 +b(The)30 b(v)-5 b(alue)1110 737 y(of)31 b(the)f Fs(editing-mode)d +Ft(v)-5 b(ariable)31 b(also)h(a\013ects)f(the)g(default)g(k)m(eymap.) +630 909 y Fs(keyseq-timeout)1110 1019 y Ft(Sp)s(eci\014es)25 +b(the)g(duration)g(Readline)h(will)g(w)m(ait)g(for)g(a)f(c)m(haracter)i +(when)e(read-)1110 1129 y(ing)30 b(an)g(am)m(biguous)g(k)m(ey)h +(sequence)f(\(one)g(that)h(can)f(form)g(a)g(complete)h(k)m(ey)1110 +1238 y(sequence)j(using)e(the)i(input)e(read)h(so)g(far,)h(or)g(can)f +(tak)m(e)i(additional)f(input)1110 1348 y(to)g(complete)g(a)f(longer)h +(k)m(ey)f(sequence\).)49 b(If)33 b(no)f(input)g(is)h(receiv)m(ed)h +(within)1110 1457 y(the)43 b(timeout,)48 b(Readline)43 +b(will)g(use)g(the)g(shorter)g(but)f(complete)j(k)m(ey)e(se-)1110 +1567 y(quence.)c(Readline)26 b(uses)f(this)h(v)-5 b(alue)26 +b(to)g(determine)g(whether)f(or)g(not)h(input)1110 1677 +y(is)31 b(a)m(v)-5 b(ailable)33 b(on)d(the)h(curren)m(t)f(input)g +(source)h(\()p Fs(rl_instream)d Ft(b)m(y)i(default\).)1110 +1786 y(The)25 b(v)-5 b(alue)26 b(is)f(sp)s(eci\014ed)f(in)h +(milliseconds,)j(so)d(a)h(v)-5 b(alue)26 b(of)f(1000)i(means)e(that) +1110 1896 y(Readline)e(will)g(w)m(ait)g(one)g(second)f(for)g +(additional)i(input.)37 b(If)22 b(this)g(v)-5 b(ariable)23 +b(is)1110 2005 y(set)28 b(to)h(a)f(v)-5 b(alue)29 b(less)f(than)g(or)f +(equal)i(to)f(zero,)i(or)e(to)g(a)h(non-n)m(umeric)e(v)-5 +b(alue,)1110 2115 y(Readline)30 b(will)f(w)m(ait)i(un)m(til)e(another)h +(k)m(ey)g(is)f(pressed)g(to)h(decide)f(whic)m(h)g(k)m(ey)1110 +2225 y(sequence)i(to)g(complete.)42 b(The)30 b(default)g(v)-5 +b(alue)31 b(is)g Fs(500)p Ft(.)630 2397 y Fs(mark-directories)1110 +2506 y Ft(If)38 b(set)g(to)h(`)p Fs(on)p Ft(',)i(completed)e(directory) +f(names)g(ha)m(v)m(e)i(a)e(slash)g(app)s(ended.)1110 +2616 y(The)30 b(default)g(is)h(`)p Fs(on)p Ft('.)630 +2788 y Fs(mark-modified-lines)1110 2898 y Ft(This)k(v)-5 +b(ariable,)38 b(when)d(set)h(to)h(`)p Fs(on)p Ft(',)g(causes)g +(Readline)f(to)h(displa)m(y)f(an)f(as-)1110 3007 y(terisk)f(\(`)p +Fs(*)p Ft('\))h(at)f(the)g(start)g(of)g(history)g(lines)g(whic)m(h)f +(ha)m(v)m(e)i(b)s(een)e(mo)s(di\014ed.)1110 3117 y(This)d(v)-5 +b(ariable)31 b(is)f(`)p Fs(off)p Ft(')g(b)m(y)g(default.)630 +3289 y Fs(mark-symlinked-directori)o(es)1110 3399 y Ft(If)59 +b(set)h(to)g(`)p Fs(on)p Ft(',)67 b(completed)60 b(names)f(whic)m(h)g +(are)h(sym)m(b)s(olic)g(links)f(to)1110 3508 y(directories)71 +b(ha)m(v)m(e)f(a)g(slash)f(app)s(ended)f(\(sub)5 b(ject)70 +b(to)g(the)g(v)-5 b(alue)70 b(of)1110 3618 y Fs(mark-directories)p +Ft(\).)37 b(The)30 b(default)g(is)g(`)p Fs(off)p Ft('.)630 +3790 y Fs(match-hidden-files)1110 3900 y Ft(This)21 b(v)-5 +b(ariable,)25 b(when)d(set)g(to)h(`)p Fs(on)p Ft(',)h(causes)f +(Readline)g(to)g(matc)m(h)g(\014les)f(whose)1110 4009 +y(names)44 b(b)s(egin)g(with)g(a)g(`)p Fs(.)p Ft(')g(\(hidden)f +(\014les\))i(when)e(p)s(erforming)g(\014lename)1110 4119 +y(completion.)75 b(If)41 b(set)g(to)h(`)p Fs(off)p Ft(',)i(the)e +(leading)g(`)p Fs(.)p Ft(')f(m)m(ust)g(b)s(e)g(supplied)f(b)m(y)1110 +4228 y(the)34 b(user)g(in)g(the)g(\014lename)g(to)h(b)s(e)f(completed.) +53 b(This)33 b(v)-5 b(ariable)35 b(is)f(`)p Fs(on)p Ft(')g(b)m(y)1110 +4338 y(default.)630 4510 y Fs(menu-complete-display-pr)o(efix)1110 +4620 y Ft(If)f(set)h(to)g(`)p Fs(on)p Ft(',)h(men)m(u)e(completion)i +(displa)m(ys)e(the)h(common)g(pre\014x)e(of)i(the)1110 +4729 y(list)k(of)g(p)s(ossible)f(completions)i(\(whic)m(h)e(ma)m(y)h(b) +s(e)f(empt)m(y\))i(b)s(efore)e(cycling)1110 4839 y(through)30 +b(the)g(list.)42 b(The)29 b(default)i(is)f(`)p Fs(off)p +Ft('.)630 5011 y Fs(output-meta)1110 5121 y Ft(If)35 +b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)f(will)g(displa)m(y)f(c)m +(haracters)i(with)e(the)h(eigh)m(th)g(bit)1110 5230 y(set)h(directly)g +(rather)f(than)g(as)h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59 +b(The)1110 5340 y(default)26 b(is)f(`)p Fs(off)p Ft(',)i(but)e +(Readline)h(will)g(set)g(it)g(to)h(`)p Fs(on)p Ft(')e(if)h(the)f(lo)s +(cale)j(con)m(tains)p eop end +%%Page: 10 14 +TeXDict begin 10 13 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(10)1110 299 y(eigh)m(t-bit)38 +b(c)m(haracters.)61 b(This)36 b(v)-5 b(ariable)37 b(is)g(dep)s(enden)m +(t)e(on)h(the)h Fs(LC_CTYPE)1110 408 y Ft(lo)s(cale)32 +b(category)-8 b(,)33 b(and)d(ma)m(y)h(c)m(hange)g(if)g(the)f(lo)s(cale) +i(is)f(c)m(hanged.)630 581 y Fs(page-completions)1110 +690 y Ft(If)i(set)i(to)f(`)p Fs(on)p Ft(',)h(Readline)g(uses)e(an)h(in) +m(ternal)h Fs(more)p Ft(-lik)m(e)f(pager)g(to)h(displa)m(y)1110 +800 y(a)e(screenful)f(of)g(p)s(ossible)g(completions)i(at)f(a)g(time.) +47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Fs(on)p Ft(')1110 +909 y(b)m(y)e(default.)630 1082 y Fs(print-completions-horizo)o(ntal)o +(ly)1110 1191 y Ft(If)23 b(set)i(to)g(`)p Fs(on)p Ft(',)g(Readline)g +(will)f(displa)m(y)g(completions)h(with)f(matc)m(hes)h(sorted)1110 +1301 y(horizon)m(tally)45 b(in)e(alphab)s(etical)i(order,)i(rather)c +(than)g(do)m(wn)g(the)h(screen.)1110 1410 y(The)30 b(default)g(is)h(`)p +Fs(off)p Ft('.)630 1583 y Fs(revert-all-at-newline)1110 +1692 y Ft(If)e(set)h(to)g(`)p Fs(on)p Ft(',)g(Readline)g(will)g(undo)f +(all)h(c)m(hanges)h(to)f(history)g(lines)f(b)s(efore)1110 +1802 y(returning)f(when)f Fs(accept-line)f Ft(is)j(executed.)41 +b(By)29 b(default,)g(history)g(lines)1110 1911 y(ma)m(y)42 +b(b)s(e)g(mo)s(di\014ed)e(and)h(retain)i(individual)e(undo)g(lists)h +(across)g(calls)h(to)1110 2021 y Fs(readline\(\))p Ft(.)38 +b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)630 2193 +y Fs(show-all-if-ambiguous)1110 2303 y Ft(This)e(alters)i(the)f +(default)g(b)s(eha)m(vior)g(of)g(the)h(completion)g(functions.)40 +b(If)29 b(set)1110 2412 y(to)f(`)p Fs(on)p Ft(',)g(w)m(ords)f(whic)m(h) +g(ha)m(v)m(e)i(more)f(than)f(one)h(p)s(ossible)f(completion)h(cause) +1110 2522 y(the)39 b(matc)m(hes)h(to)g(b)s(e)e(listed)h(immediately)i +(instead)e(of)g(ringing)g(the)g(b)s(ell.)1110 2632 y(The)30 +b(default)g(v)-5 b(alue)31 b(is)g(`)p Fs(off)p Ft('.)630 +2804 y Fs(show-all-if-unmodified)1110 2913 y Ft(This)38 +b(alters)h(the)g(default)g(b)s(eha)m(vior)g(of)f(the)h(completion)h +(functions)e(in)h(a)1110 3023 y(fashion)25 b(similar)h(to)g +Fj(sho)m(w-all-if-am)m(biguous)p Ft(.)41 b(If)25 b(set)h(to)h(`)p +Fs(on)p Ft(',)f(w)m(ords)f(whic)m(h)1110 3133 y(ha)m(v)m(e)32 +b(more)f(than)f(one)i(p)s(ossible)e(completion)i(without)f(an)m(y)g(p)s +(ossible)f(par-)1110 3242 y(tial)43 b(completion)h(\(the)f(p)s(ossible) +f(completions)h(don't)f(share)g(a)h(common)1110 3352 +y(pre\014x\))30 b(cause)g(the)h(matc)m(hes)g(to)g(b)s(e)f(listed)g +(immediately)i(instead)e(of)h(ring-)1110 3461 y(ing)g(the)f(b)s(ell.)41 +b(The)30 b(default)g(v)-5 b(alue)31 b(is)f(`)p Fs(off)p +Ft('.)630 3634 y Fs(show-mode-in-prompt)1110 3743 y Ft(If)24 +b(set)h(to)g(`)p Fs(on)p Ft(',)g(add)f(a)h(string)f(to)h(the)f(b)s +(eginning)g(of)g(the)h(prompt)e(indicating)1110 3853 +y(the)33 b(editing)h(mo)s(de:)46 b(emacs,)35 b(vi)e(command,)h(or)f(vi) +h(insertion.)49 b(The)32 b(mo)s(de)1110 3962 y(strings)45 +b(are)h(user-settable)g(\(e.g.,)51 b Fj(emacs-mo)s(de-string)8 +b Ft(\).)87 b(The)45 b(default)1110 4072 y(v)-5 b(alue)31 +b(is)f(`)p Fs(off)p Ft('.)630 4244 y Fs(skip-completed-text)1110 +4354 y Ft(If)i(set)i(to)f(`)p Fs(on)p Ft(',)h(this)f(alters)g(the)g +(default)g(completion)h(b)s(eha)m(vior)f(when)f(in-)1110 +4463 y(serting)d(a)h(single)g(matc)m(h)f(in)m(to)h(the)g(line.)40 +b(It's)30 b(only)f(activ)m(e)i(when)d(p)s(erform-)1110 +4573 y(ing)k(completion)i(in)e(the)g(middle)g(of)g(a)h(w)m(ord.)46 +b(If)32 b(enabled,)g(Readline)h(do)s(es)1110 4682 y(not)41 +b(insert)f(c)m(haracters)i(from)e(the)h(completion)h(that)f(matc)m(h)g +(c)m(haracters)1110 4792 y(after)c(p)s(oin)m(t)g(in)g(the)g(w)m(ord)f +(b)s(eing)g(completed,)k(so)d(p)s(ortions)f(of)h(the)g(w)m(ord)1110 +4902 y(follo)m(wing)c(the)f(cursor)f(are)h(not)g(duplicated.)45 +b(F)-8 b(or)32 b(instance,)h(if)f(this)f(is)h(en-)1110 +5011 y(abled,)43 b(attempting)f(completion)g(when)d(the)i(cursor)f(is)g +(after)h(the)g(`)p Fs(e)p Ft(')f(in)1110 5121 y(`)p Fs(Makefile)p +Ft(')c(will)i(result)f(in)g(`)p Fs(Makefile)p Ft(')f(rather)h(than)h(`) +p Fs(Makefilefile)p Ft(',)1110 5230 y(assuming)d(there)g(is)h(a)f +(single)h(p)s(ossible)f(completion.)56 b(The)35 b(default)g(v)-5 +b(alue)1110 5340 y(is)30 b(`)p Fs(off)p Ft('.)p eop end +%%Page: 11 15 +TeXDict begin 11 14 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(11)630 299 y Fs +(vi-cmd-mode-string)1110 408 y Ft(If)33 b(the)h Fj(sho)m(w-mo)s +(de-in-prompt)h Ft(v)-5 b(ariable)35 b(is)e(enabled,)i(this)f(string)f +(is)h(dis-)1110 518 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g +(last)h(line)f(of)h(the)f(primary)f(prompt)g(when)1110 +628 y(vi)32 b(editing)h(mo)s(de)f(is)g(activ)m(e)j(and)c(in)h(command)g +(mo)s(de.)46 b(The)31 b(v)-5 b(alue)33 b(is)f(ex-)1110 +737 y(panded)26 b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f +(standard)f(set)h(of)g(meta-)h(and)e(con)m(trol)1110 +847 y(pre\014xes)34 b(and)g(bac)m(kslash)i(escap)s(e)g(sequences)f(is)g +(a)m(v)-5 b(ailable.)57 b(Use)35 b(the)g(`)p Fs(\\1)p +Ft(')1110 956 y(and)23 b(`)p Fs(\\2)p Ft(')h(escap)s(es)h(to)f(b)s +(egin)g(and)f(end)g(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110 +1066 y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a) +h(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 1176 +y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p +Fs(\(cmd\))p Ft('.)630 1340 y Fs(vi-ins-mode-string)1110 +1450 y Ft(If)j(the)h Fj(sho)m(w-mo)s(de-in-prompt)h Ft(v)-5 +b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110 +1559 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f +(of)h(the)f(primary)f(prompt)g(when)1110 1669 y(vi)35 +b(editing)h(mo)s(de)e(is)i(activ)m(e)h(and)d(in)h(insertion)g(mo)s(de.) +54 b(The)35 b(v)-5 b(alue)35 b(is)g(ex-)1110 1778 y(panded)26 +b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f(standard)f(set)h(of)g +(meta-)h(and)e(con)m(trol)1110 1888 y(pre\014xes)34 b(and)g(bac)m +(kslash)i(escap)s(e)g(sequences)f(is)g(a)m(v)-5 b(ailable.)57 +b(Use)35 b(the)g(`)p Fs(\\1)p Ft(')1110 1998 y(and)23 +b(`)p Fs(\\2)p Ft(')h(escap)s(es)h(to)f(b)s(egin)g(and)f(end)g +(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110 2107 +y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a)h +(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 2217 +y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p +Fs(\(ins\))p Ft('.)630 2381 y Fs(visible-stats)1110 2491 +y Ft(If)h(set)i(to)f(`)p Fs(on)p Ft(',)h(a)f(c)m(haracter)i(denoting)e +(a)g(\014le's)g(t)m(yp)s(e)g(is)g(app)s(ended)e(to)j(the)1110 +2600 y(\014lename)e(when)e(listing)i(p)s(ossible)f(completions.)42 +b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)150 2765 +y(Key)f(Bindings)630 2874 y(The)41 b(syn)m(tax)i(for)f(con)m(trolling)h +(k)m(ey)g(bindings)e(in)h(the)g(init)g(\014le)g(is)g(simple.)75 +b(First)43 b(y)m(ou)630 2984 y(need)27 b(to)i(\014nd)d(the)i(name)f(of) +h(the)g(command)f(that)i(y)m(ou)f(w)m(an)m(t)g(to)g(c)m(hange.)41 +b(The)27 b(follo)m(wing)630 3093 y(sections)37 b(con)m(tain)g(tables)g +(of)f(the)g(command)f(name,)j(the)e(default)g(k)m(eybinding,)h(if)f(an) +m(y)-8 b(,)630 3203 y(and)30 b(a)h(short)f(description)g(of)h(what)f +(the)g(command)h(do)s(es.)630 3340 y(Once)36 b(y)m(ou)g(kno)m(w)g(the)g +(name)g(of)g(the)g(command,)h(simply)f(place)h(on)e(a)i(line)f(in)g +(the)g(init)630 3450 y(\014le)e(the)g(name)f(of)h(the)g(k)m(ey)g(y)m +(ou)g(wish)f(to)h(bind)f(the)h(command)f(to,)i(a)f(colon,)i(and)d(then) +630 3559 y(the)f(name)h(of)f(the)g(command.)46 b(There)32 +b(can)g(b)s(e)g(no)g(space)g(b)s(et)m(w)m(een)h(the)f(k)m(ey)h(name)g +(and)630 3669 y(the)41 b(colon)h({)f(that)g(will)g(b)s(e)g(in)m +(terpreted)g(as)g(part)f(of)h(the)g(k)m(ey)h(name.)72 +b(The)40 b(name)h(of)630 3778 y(the)35 b(k)m(ey)g(can)g(b)s(e)f +(expressed)f(in)i(di\013eren)m(t)g(w)m(a)m(ys,)h(dep)s(ending)d(on)h +(what)h(y)m(ou)g(\014nd)e(most)630 3888 y(comfortable.)630 +4025 y(In)g(addition)h(to)g(command)g(names,)g(Readline)g(allo)m(ws)h +(k)m(eys)g(to)f(b)s(e)f(b)s(ound)f(to)i(a)g(string)630 +4134 y(that)d(is)f(inserted)h(when)e(the)i(k)m(ey)g(is)f(pressed)g(\(a) +h Fj(macro)5 b Ft(\).)630 4299 y Fj(k)m(eyname)g Ft(:)42 +b Fj(function-name)35 b Ft(or)c Fj(macro)1110 4408 y(k)m(eyname)k +Ft(is)29 b(the)f(name)h(of)g(a)g(k)m(ey)h(sp)s(elled)e(out)h(in)g +(English.)39 b(F)-8 b(or)30 b(example:)1350 4545 y Fs(Control-u:)45 +b(universal-argument)1350 4655 y(Meta-Rubout:)f(backward-kill-word)1350 +4765 y(Control-o:)h(">)i(output")1110 4902 y Ft(In)94 +b(the)g(example)h(ab)s(o)m(v)m(e,)112 b Fl(C-u)94 b Ft(is)g(b)s(ound)f +(to)i(the)f(function)1110 5011 y Fs(universal-argument)p +Ft(,)124 b Fl(M-DEL)107 b Ft(is)i(b)s(ound)e(to)j(the)f(function)1110 +5121 y Fs(backward-kill-word)p Ft(,)75 b(and)69 b Fl(C-o)g +Ft(is)h(b)s(ound)e(to)j(run)d(the)i(macro)1110 5230 y(expressed)45 +b(on)h(the)g(righ)m(t)g(hand)e(side)i(\(that)h(is,)i(to)e(insert)e(the) +h(text)h(`)p Fs(>)1110 5340 y(output)p Ft(')29 b(in)m(to)i(the)g +(line\).)p eop end +%%Page: 12 16 +TeXDict begin 12 15 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(12)1110 299 y(A)62 +b(n)m(um)m(b)s(er)e(of)i(sym)m(b)s(olic)h(c)m(haracter)g(names)f(are)g +(recognized)h(while)1110 408 y(pro)s(cessing)40 b(this)f(k)m(ey)i +(binding)e(syn)m(tax:)60 b Fj(DEL)p Ft(,)42 b Fj(ESC)p +Ft(,)g Fj(ESCAPE)p Ft(,)f Fj(LFD)p Ft(,)1110 518 y Fj(NEWLINE)p +Ft(,)31 b Fj(RET)p Ft(,)f Fj(RETURN)p Ft(,)g Fj(R)m(UBOUT)p +Ft(,)h Fj(SP)-8 b(A)m(CE)p Ft(,)31 b Fj(SPC)p Ft(,)e(and)h +Fj(T)-8 b(AB)p Ft(.)630 677 y Fs(")p Fj(k)m(eyseq)r Fs(")p +Ft(:)41 b Fj(function-name)36 b Ft(or)30 b Fj(macro)1110 +787 y(k)m(eyseq)k Ft(di\013ers)d(from)f Fj(k)m(eyname)37 +b Ft(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f(denoting)g(an)g(en-)1110 +896 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s(e)f(sp)s(eci\014ed,)h(b)m(y) +f(placing)i(the)f(k)m(ey)g(sequence)g(in)1110 1006 y(double)29 +b(quotes.)41 b(Some)29 b Fm(gnu)h Ft(Emacs)f(st)m(yle)i(k)m(ey)f(escap) +s(es)g(can)g(b)s(e)f(used,)g(as)1110 1115 y(in)k(the)h(follo)m(wing)i +(example,)f(but)e(the)h(sp)s(ecial)h(c)m(haracter)g(names)f(are)g(not) +1110 1225 y(recognized.)1350 1359 y Fs("\\C-u":)46 b +(universal-argument)1350 1469 y("\\C-x\\C-r":)f(re-read-init-file)1350 +1578 y("\\e[11~":)g("Function)h(Key)g(1")1110 1713 y +Ft(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74 b Fl(C-u)64 +b Ft(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110 +1822 y Fs(universal-argument)39 b Ft(\(just)k(as)h(it)g(w)m(as)g(in)g +(the)f(\014rst)g(example\),)49 b(`)p Fl(C-x)1110 1932 +y(C-r)p Ft(')30 b(is)g(b)s(ound)e(to)j(the)g(function)f +Fs(re-read-init-file)p Ft(,)c(and)j(`)p Fs(ESC)h([)g(1)g(1)1110 +2041 y(~)p Ft(')g(is)h(b)s(ound)d(to)j(insert)f(the)h(text)g(`)p +Fs(Function)e(Key)g(1)p Ft('.)630 2200 y(The)g(follo)m(wing)i +Fm(gnu)f Ft(Emacs)g(st)m(yle)h(escap)s(e)f(sequences)g(are)g(a)m(v)-5 +b(ailable)32 b(when)d(sp)s(ecifying)630 2310 y(k)m(ey)i(sequences:)630 +2469 y Fl(\\C-)336 b Ft(con)m(trol)32 b(pre\014x)630 +2628 y Fl(\\M-)336 b Ft(meta)31 b(pre\014x)630 2787 y +Fl(\\e)384 b Ft(an)30 b(escap)s(e)h(c)m(haracter)630 +2945 y Fl(\\\\)384 b Ft(bac)m(kslash)630 3104 y Fl(\\)p +Fs(")g(")p Ft(,)30 b(a)h(double)f(quotation)i(mark)630 +3263 y Fl(\\')384 b Fs(')p Ft(,)30 b(a)h(single)g(quote)g(or)f(ap)s +(ostrophe)630 3422 y(In)d(addition)h(to)g(the)g Fm(gnu)f +Ft(Emacs)h(st)m(yle)h(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g +(bac)m(kslash)630 3532 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)630 +3691 y Fs(\\a)384 b Ft(alert)31 b(\(b)s(ell\))630 3850 +y Fs(\\b)384 b Ft(bac)m(kspace)630 4008 y Fs(\\d)g Ft(delete)630 +4167 y Fs(\\f)g Ft(form)30 b(feed)630 4326 y Fs(\\n)384 +b Ft(newline)630 4485 y Fs(\\r)g Ft(carriage)32 b(return)630 +4644 y Fs(\\t)384 b Ft(horizon)m(tal)32 b(tab)630 4803 +y Fs(\\v)384 b Ft(v)m(ertical)32 b(tab)630 4962 y Fs(\\)p +Fl(nnn)288 b Ft(the)35 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5 +b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5 b(alue)35 b Fj(nnn)e +Ft(\(one)i(to)1110 5071 y(three)c(digits\))630 5230 y +Fs(\\x)p Fl(HH)288 b Ft(the)38 b(eigh)m(t-bit)i(c)m(haracter)g(whose)e +(v)-5 b(alue)39 b(is)f(the)h(hexadecimal)g(v)-5 b(alue)39 +b Fj(HH)1110 5340 y Ft(\(one)31 b(or)f(t)m(w)m(o)i(hex)e(digits\))p +eop end +%%Page: 13 17 +TeXDict begin 13 16 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(13)630 299 y(When)37 +b(en)m(tering)h(the)g(text)g(of)g(a)g(macro,)i(single)e(or)f(double)g +(quotes)h(m)m(ust)f(b)s(e)g(used)f(to)630 408 y(indicate)23 +b(a)e(macro)h(de\014nition.)38 b(Unquoted)21 b(text)i(is)e(assumed)g +(to)h(b)s(e)f(a)h(function)f(name.)38 b(In)630 518 y(the)22 +b(macro)f(b)s(o)s(dy)-8 b(,)23 b(the)e(bac)m(kslash)h(escap)s(es)g +(describ)s(ed)e(ab)s(o)m(v)m(e)j(are)e(expanded.)37 b(Bac)m(kslash)630 +628 y(will)j(quote)h(an)m(y)f(other)g(c)m(haracter)i(in)d(the)i(macro)f +(text,)k(including)39 b(`)p Fs(")p Ft(')h(and)g(`)p Fs(')p +Ft('.)69 b(F)-8 b(or)630 737 y(example,)28 b(the)e(follo)m(wing)h +(binding)d(will)i(mak)m(e)h(`)p Fl(C-x)j Fs(\\)p Ft(')c(insert)f(a)h +(single)h(`)p Fs(\\)p Ft(')f(in)m(to)g(the)g(line:)870 +873 y Fs("\\C-x\\\\":)45 b("\\\\")150 1073 y Fi(1.3.2)63 +b(Conditional)41 b(Init)g(Constructs)150 1220 y Ft(Readline)c(implemen) +m(ts)g(a)h(facilit)m(y)g(similar)f(in)g(spirit)f(to)i(the)f +(conditional)h(compilation)g(features)f(of)150 1330 y(the)31 +b(C)f(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)g(bindings)d(and) +h(v)-5 b(ariable)32 b(settings)f(to)h(b)s(e)e(p)s(erformed)f(as)i(the) +150 1440 y(result)f(of)h(tests.)41 b(There)30 b(are)h(four)f(parser)f +(directiv)m(es)j(used.)150 1601 y Fs($if)336 b Ft(The)31 +b Fs($if)f Ft(construct)i(allo)m(ws)h(bindings)d(to)i(b)s(e)e(made)i +(based)f(on)g(the)g(editing)h(mo)s(de,)g(the)630 1711 +y(terminal)37 b(b)s(eing)f(used,)h(or)f(the)h(application)g(using)f +(Readline.)59 b(The)36 b(text)h(of)f(the)h(test,)630 +1821 y(after)30 b(an)m(y)g(comparison)g(op)s(erator,)g(extends)f(to)h +(the)g(end)f(of)h(the)f(line;)i(unless)e(otherwise)630 +1930 y(noted,)i(no)f(c)m(haracters)i(are)f(required)e(to)i(isolate)i +(it.)630 2091 y Fs(mode)288 b Ft(The)30 b Fs(mode=)e +Ft(form)i(of)g(the)h Fs($if)e Ft(directiv)m(e)j(is)e(used)f(to)i(test)g +(whether)e(Read-)1110 2201 y(line)44 b(is)f(in)g Fs(emacs)f +Ft(or)h Fs(vi)g Ft(mo)s(de.)79 b(This)42 b(ma)m(y)i(b)s(e)e(used)h(in)g +(conjunction)1110 2311 y(with)c(the)h(`)p Fs(set)29 b(keymap)p +Ft(')38 b(command,)k(for)d(instance,)j(to)e(set)g(bindings)e(in)1110 +2420 y(the)32 b Fs(emacs-standard)c Ft(and)j Fs(emacs-ctlx)d +Ft(k)m(eymaps)k(only)g(if)g(Readline)g(is)1110 2530 y(starting)f(out)g +(in)f Fs(emacs)f Ft(mo)s(de.)630 2691 y Fs(term)288 b +Ft(The)26 b Fs(term=)g Ft(form)g(ma)m(y)i(b)s(e)e(used)g(to)i(include)f +(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110 2800 y(ings,)38 +b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f(output)g(b)m(y)g +(the)g(terminal's)1110 2910 y(function)24 b(k)m(eys.)39 +b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g(the)g(`)p +Fs(=)p Ft(')g(is)g(tested)h(against)1110 3020 y(b)s(oth)k(the)h(full)g +(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s(ortion)e(of)h(the)g +(terminal)1110 3129 y(name)k(b)s(efore)f(the)g(\014rst)g(`)p +Fs(-)p Ft('.)50 b(This)33 b(allo)m(ws)i Fs(sun)e Ft(to)h(matc)m(h)g(b)s +(oth)f Fs(sun)g Ft(and)1110 3239 y Fs(sun-cmd)p Ft(,)c(for)h(instance.) +630 3400 y Fs(version)144 b Ft(The)44 b Fs(version)f +Ft(test)i(ma)m(y)h(b)s(e)e(used)f(to)j(p)s(erform)d(comparisons)i +(against)1110 3509 y(sp)s(eci\014c)c(Readline)i(v)m(ersions.)74 +b(The)42 b Fs(version)d Ft(expands)i(to)h(the)g(curren)m(t)1110 +3619 y(Readline)25 b(v)m(ersion.)39 b(The)23 b(set)h(of)g(comparison)h +(op)s(erators)f(includes)f(`)p Fs(=)p Ft(')h(\(and)1110 +3729 y(`)p Fs(==)p Ft('\),)33 b(`)p Fs(!=)p Ft(',)f(`)p +Fs(<=)p Ft(',)h(`)p Fs(>=)p Ft(',)f(`)p Fs(<)p Ft(',)h(and)e(`)p +Fs(>)p Ft('.)46 b(The)31 b(v)m(ersion)i(n)m(um)m(b)s(er)d(supplied)h +(on)1110 3838 y(the)j(righ)m(t)h(side)f(of)g(the)g(op)s(erator)g +(consists)h(of)f(a)g(ma)5 b(jor)35 b(v)m(ersion)f(n)m(um)m(b)s(er,)1110 +3948 y(an)45 b(optional)i(decimal)f(p)s(oin)m(t,)k(and)44 +b(an)i(optional)g(minor)f(v)m(ersion)h(\(e.g.,)1110 4057 +y(`)p Fs(7.1)p Ft('\).)40 b(If)27 b(the)h(minor)f(v)m(ersion)h(is)g +(omitted,)h(it)f(is)g(assumed)f(to)h(b)s(e)f(`)p Fs(0)p +Ft('.)40 b(The)1110 4167 y(op)s(erator)34 b(ma)m(y)g(b)s(e)f(separated) +g(from)g(the)h(string)f Fs(version)f Ft(and)h(from)g(the)1110 +4276 y(v)m(ersion)39 b(n)m(um)m(b)s(er)f(argumen)m(t)h(b)m(y)f +(whitespace.)67 b(The)38 b(follo)m(wing)i(example)1110 +4386 y(sets)31 b(a)g(v)-5 b(ariable)31 b(if)f(the)h(Readline)g(v)m +(ersion)f(b)s(eing)g(used)g(is)g(7.0)i(or)e(new)m(er:)1350 +4521 y Fs($if)47 b(version)f(>=)h(7.0)1350 4631 y(set)g +(show-mode-in-prompt)42 b(on)1350 4741 y($endif)630 4902 +y(application)1110 5011 y Ft(The)21 b Fj(application)j +Ft(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h +(set-)1110 5121 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h +(Readline)g(library)g(sets)g(the)g Fj(application)1110 +5230 y(name)p Ft(,)g(and)e(y)m(ou)g(can)h(test)g(for)f(a)g(particular)h +(v)-5 b(alue.)39 b(This)22 b(could)h(b)s(e)g(used)f(to)1110 +5340 y(bind)32 b(k)m(ey)h(sequences)g(to)h(functions)e(useful)g(for)h +(a)g(sp)s(eci\014c)f(program.)48 b(F)-8 b(or)p eop end +%%Page: 14 18 +TeXDict begin 14 17 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(14)1110 299 y(instance,)35 +b(the)e(follo)m(wing)h(command)f(adds)f(a)i(k)m(ey)f(sequence)h(that)f +(quotes)1110 408 y(the)e(curren)m(t)f(or)g(previous)g(w)m(ord)g(in)g +(Bash:)1350 543 y Fs($if)47 b(Bash)1350 653 y(#)g(Quote)g(the)g +(current)f(or)h(previous)e(word)1350 762 y("\\C-xq":)h +("\\eb\\"\\ef\\"")1350 872 y($endif)630 1031 y(variable)96 +b Ft(The)33 b Fj(v)-5 b(ariable)39 b Ft(construct)33 +b(pro)m(vides)g(simple)g(equalit)m(y)i(tests)e(for)g(Readline)1110 +1141 y(v)-5 b(ariables)32 b(and)f(v)-5 b(alues.)45 b(The)32 +b(p)s(ermitted)f(comparison)h(op)s(erators)f(are)i(`)p +Fs(=)p Ft(',)1110 1250 y(`)p Fs(==)p Ft(',)49 b(and)44 +b(`)p Fs(!=)p Ft('.)85 b(The)44 b(v)-5 b(ariable)46 b(name)f(m)m(ust)g +(b)s(e)g(separated)g(from)g(the)1110 1360 y(comparison)25 +b(op)s(erator)g(b)m(y)g(whitespace;)j(the)d(op)s(erator)g(ma)m(y)g(b)s +(e)f(separated)1110 1469 y(from)33 b(the)h(v)-5 b(alue)35 +b(on)f(the)g(righ)m(t)g(hand)f(side)h(b)m(y)f(whitespace.)52 +b(Both)35 b(string)1110 1579 y(and)i(b)s(o)s(olean)g(v)-5 +b(ariables)38 b(ma)m(y)h(b)s(e)d(tested.)63 b(Bo)s(olean)39 +b(v)-5 b(ariables)38 b(m)m(ust)g(b)s(e)1110 1689 y(tested)46 +b(against)g(the)f(v)-5 b(alues)46 b Fj(on)f Ft(and)f +Fj(o\013)p Ft(.)85 b(The)45 b(follo)m(wing)h(example)g(is)1110 +1798 y(equiv)-5 b(alen)m(t)32 b(to)f(the)f Fs(mode=emacs)e +Ft(test)j(describ)s(ed)f(ab)s(o)m(v)m(e:)1350 1933 y +Fs($if)47 b(editing-mode)d(==)k(emacs)1350 2042 y(set)f +(show-mode-in-prompt)42 b(on)1350 2152 y($endif)150 2311 +y($endif)192 b Ft(This)29 b(command,)i(as)f(seen)h(in)f(the)g(previous) +g(example,)h(terminates)g(an)g Fs($if)e Ft(command.)150 +2471 y Fs($else)240 b Ft(Commands)29 b(in)h(this)h(branc)m(h)e(of)i +(the)f Fs($if)g Ft(directiv)m(e)i(are)f(executed)g(if)f(the)h(test)g +(fails.)150 2630 y Fs($include)96 b Ft(This)43 b(directiv)m(e)i(tak)m +(es)g(a)e(single)i(\014lename)e(as)h(an)f(argumen)m(t)h(and)f(reads)g +(commands)630 2740 y(and)38 b(bindings)f(from)h(that)i(\014le.)65 +b(F)-8 b(or)39 b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e +(from)630 2849 y Fs(/etc/inputrc)p Ft(:)870 2984 y Fs($include)46 +b(/etc/inputrc)150 3183 y Fi(1.3.3)63 b(Sample)41 b(Init)g(File)150 +3330 y Ft(Here)27 b(is)f(an)h(example)g(of)f(an)h Fj(inputrc)k +Ft(\014le.)39 b(This)26 b(illustrates)h(k)m(ey)h(binding,)e(v)-5 +b(ariable)27 b(assignmen)m(t,)i(and)150 3440 y(conditional)j(syn)m +(tax.)p eop end +%%Page: 15 19 +TeXDict begin 15 18 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(15)390 408 y Fs(#)47 +b(This)g(file)g(controls)e(the)i(behaviour)e(of)j(line)e(input)h +(editing)e(for)390 518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h +(Readline)f(library.)93 b(Existing)390 628 y(#)47 b(programs)f(include) +g(FTP,)g(Bash,)h(and)g(GDB.)390 737 y(#)390 847 y(#)g(You)g(can)g +(re-read)f(the)h(inputrc)f(file)g(with)h(C-x)g(C-r.)390 +956 y(#)g(Lines)g(beginning)e(with)i('#')g(are)g(comments.)390 +1066 y(#)390 1176 y(#)g(First,)g(include)e(any)i(system-wide)e +(bindings)h(and)g(variable)390 1285 y(#)h(assignments)e(from)i +(/etc/Inputrc)390 1395 y($include)f(/etc/Inputrc)390 +1614 y(#)390 1724 y(#)h(Set)g(various)f(bindings)g(for)h(emacs)f(mode.) +390 1943 y(set)h(editing-mode)d(emacs)390 2162 y($if)j(mode=emacs)390 +2381 y(Meta-Control-h:)91 b(backward-kill-word)43 b(Text)k(after)f(the) +h(function)f(name)g(is)h(ignored)p 3970 2401 42 76 v +390 2600 a(#)390 2710 y(#)g(Arrow)g(keys)f(in)i(keypad)e(mode)390 +2819 y(#)390 2929 y(#"\\M-OD":)379 b(backward-char)390 +3039 y(#"\\M-OC":)g(forward-char)390 3148 y(#"\\M-OA":)g +(previous-history)390 3258 y(#"\\M-OB":)g(next-history)390 +3367 y(#)390 3477 y(#)47 b(Arrow)g(keys)f(in)i(ANSI)e(mode)390 +3587 y(#)390 3696 y("\\M-[D":)380 b(backward-char)390 +3806 y("\\M-[C":)g(forward-char)390 3915 y("\\M-[A":)g +(previous-history)390 4025 y("\\M-[B":)g(next-history)390 +4134 y(#)390 4244 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode) +390 4354 y(#)390 4463 y(#"\\M-\\C-OD":)331 b(backward-char)390 +4573 y(#"\\M-\\C-OC":)g(forward-char)390 4682 y(#"\\M-\\C-OA":)g +(previous-history)390 4792 y(#"\\M-\\C-OB":)g(next-history)390 +4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode) +390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390 +5340 y(#"\\M-\\C-[C":)g(forward-char)p eop end +%%Page: 16 20 +TeXDict begin 16 19 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(16)390 299 y Fs(#"\\M-\\C-[A":)331 +b(previous-history)390 408 y(#"\\M-\\C-[B":)g(next-history)390 +628 y(C-q:)47 b(quoted-insert)390 847 y($endif)390 1066 +y(#)g(An)h(old-style)d(binding.)93 b(This)47 b(happens)f(to)h(be)g(the) +g(default.)390 1176 y(TAB:)g(complete)390 1395 y(#)g(Macros)g(that)f +(are)h(convenient)e(for)i(shell)f(interaction)390 1504 +y($if)h(Bash)390 1614 y(#)g(edit)g(the)g(path)390 1724 +y("\\C-xp":)f("PATH=${PATH}\\e\\C-e\\C-a)o(\\ef)o(\\C-f)o(")390 +1833 y(#)h(prepare)f(to)h(type)g(a)h(quoted)e(word)g(--)390 +1943 y(#)h(insert)g(open)f(and)h(close)f(double)h(quotes)390 +2052 y(#)g(and)g(move)g(to)g(just)g(after)f(the)h(open)g(quote)390 +2162 y("\\C-x\\"":)e("\\"\\"\\C-b")390 2271 y(#)i(insert)g(a)g +(backslash)e(\(testing)h(backslash)f(escapes)390 2381 +y(#)i(in)h(sequences)d(and)i(macros\))390 2491 y("\\C-x\\\\":)e("\\\\") +390 2600 y(#)i(Quote)g(the)g(current)f(or)h(previous)e(word)390 +2710 y("\\C-xq":)h("\\eb\\"\\ef\\"")390 2819 y(#)h(Add)g(a)h(binding)e +(to)h(refresh)f(the)h(line,)f(which)g(is)h(unbound)390 +2929 y("\\C-xr":)f(redraw-current-line)390 3039 y(#)h(Edit)g(variable)f +(on)h(current)f(line.)390 3148 y("\\M-\\C-v":)f +("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-)o(a\\C-)o(y=")390 3258 +y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h +(available)390 3587 y(set)f(bell-style)e(visible)390 +3806 y(#)i(don't)g(strip)f(characters)f(to)i(7)h(bits)e(when)h(reading) +390 3915 y(set)g(input-meta)e(on)390 4134 y(#)i(allow)g(iso-latin1)e +(characters)g(to)i(be)g(inserted)f(rather)390 4244 y(#)h(than)g +(converted)e(to)j(prefix-meta)c(sequences)390 4354 y(set)j +(convert-meta)d(off)390 4573 y(#)j(display)f(characters)f(with)i(the)g +(eighth)f(bit)h(set)g(directly)390 4682 y(#)g(rather)g(than)f(as)h +(meta-prefixed)e(characters)390 4792 y(set)i(output-meta)e(on)390 +5011 y(#)i(if)h(there)e(are)h(150)g(or)g(more)g(possible)e(completions) +g(for)i(a)g(word,)390 5121 y(#)g(ask)g(whether)f(or)h(not)g(the)g(user) +g(wants)f(to)h(see)g(all)g(of)g(them)390 5230 y(set)g +(completion-query-items)42 b(150)p eop end +%%Page: 17 21 +TeXDict begin 17 20 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(17)390 299 y Fs(#)47 +b(For)g(FTP)390 408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390 +628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390 +847 y($endif)150 1089 y Fr(1.4)68 b(Bindable)45 b(Readline)i(Commands) +150 1248 y Ft(This)25 b(section)i(describ)s(es)d(Readline)j(commands)e +(that)h(ma)m(y)g(b)s(e)f(b)s(ound)f(to)i(k)m(ey)h(sequences.)39 +b(Command)150 1358 y(names)30 b(without)h(an)f(accompan)m(ying)i(k)m +(ey)f(sequence)g(are)g(un)m(b)s(ound)c(b)m(y)k(default.)275 +1493 y(In)25 b(the)h(follo)m(wing)i(descriptions,)f Fj(p)s(oin)m(t)h +Ft(refers)e(to)h(the)f(curren)m(t)g(cursor)g(p)s(osition,)h(and)f +Fj(mark)31 b Ft(refers)150 1603 y(to)40 b(a)f(cursor)f(p)s(osition)h +(sa)m(v)m(ed)h(b)m(y)f(the)g Fs(set-mark)d Ft(command.)66 +b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f(p)s(oin)m(t)g(and)150 +1713 y(mark)30 b(is)h(referred)e(to)i(as)g(the)f Fj(region)p +Ft(.)150 1913 y Fi(1.4.1)63 b(Commands)42 b(F)-10 b(or)41 +b(Mo)m(ving)150 2085 y Fs(beginning-of-line)26 b(\(C-a\))630 +2195 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(curren)m(t)g +(line.)150 2355 y Fs(end-of-line)d(\(C-e\))630 2464 y +Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150 +2625 y Fs(forward-char)c(\(C-f\))630 2734 y Ft(Mo)m(v)m(e)32 +b(forw)m(ard)e(a)h(c)m(haracter.)150 2895 y Fs(backward-char)c(\(C-b\)) +630 3004 y Ft(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150 +3165 y Fs(forward-word)d(\(M-f\))630 3274 y Ft(Mo)m(v)m(e)32 +b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41 +b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)i(and)630 +3384 y(digits.)150 3544 y Fs(backward-word)27 b(\(M-b\))630 +3654 y Ft(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g +(curren)m(t)f(or)g(previous)g(w)m(ord.)50 b(W)-8 b(ords)34 +b(are)g(comp)s(osed)630 3763 y(of)d(letters)g(and)f(digits.)150 +3923 y Fs(previous-screen-line)25 b(\(\))630 4033 y Ft(A)m(ttempt)41 +b(to)g(mo)m(v)m(e)h(p)s(oin)m(t)e(to)h(the)f(same)h(ph)m(ysical)g +(screen)f(column)g(on)g(the)g(previous)630 4143 y(ph)m(ysical)26 +b(screen)f(line.)39 b(This)24 b(will)i(not)f(ha)m(v)m(e)h(the)f +(desired)g(e\013ect)h(if)f(the)h(curren)m(t)e(Readline)630 +4252 y(line)k(do)s(es)f(not)g(tak)m(e)i(up)d(more)i(than)f(one)g(ph)m +(ysical)h(line)g(or)f(if)g(p)s(oin)m(t)h(is)f(not)h(greater)g(than)630 +4362 y(the)j(length)f(of)h(the)f(prompt)g(plus)f(the)i(screen)f(width.) +150 4522 y Fs(next-screen-line)c(\(\))630 4632 y Ft(A)m(ttempt)g(to)f +(mo)m(v)m(e)i(p)s(oin)m(t)d(to)i(the)e(same)i(ph)m(ysical)f(screen)g +(column)f(on)h(the)f(next)h(ph)m(ysical)630 4741 y(screen)e(line.)39 +b(This)23 b(will)g(not)h(ha)m(v)m(e)h(the)e(desired)g(e\013ect)i(if)e +(the)g(curren)m(t)h(Readline)g(line)f(do)s(es)630 4851 +y(not)k(tak)m(e)i(up)e(more)g(than)g(one)g(ph)m(ysical)h(line)g(or)f +(if)g(the)h(length)f(of)h(the)f(curren)m(t)g(Readline)630 +4960 y(line)k(is)f(not)h(greater)g(than)f(the)h(length)g(of)f(the)h +(prompt)e(plus)h(the)g(screen)h(width.)150 5121 y Fs(clear-display)c +(\(M-C-l\))630 5230 y Ft(Clear)33 b(the)g(screen)g(and,)h(if)e(p)s +(ossible,)i(the)f(terminal's)g(scrollbac)m(k)i(bu\013er,)e(then)f +(redra)m(w)630 5340 y(the)f(curren)m(t)f(line,)h(lea)m(ving)h(the)e +(curren)m(t)h(line)f(at)h(the)g(top)g(of)f(the)h(screen.)p +eop end +%%Page: 18 22 +TeXDict begin 18 21 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(18)150 299 y Fs(clear-screen)27 +b(\(C-l\))630 408 y Ft(Clear)35 b(the)f(screen,)i(then)e(redra)m(w)g +(the)h(curren)m(t)f(line,)i(lea)m(ving)g(the)f(curren)m(t)f(line)h(at)g +(the)630 518 y(top)c(of)f(the)h(screen.)150 665 y Fs +(redraw-current-line)25 b(\(\))630 775 y Ft(Refresh)30 +b(the)g(curren)m(t)h(line.)41 b(By)30 b(default,)h(this)f(is)h(un)m(b)s +(ound.)150 962 y Fi(1.4.2)63 b(Commands)42 b(F)-10 b(or)41 +b(Manipulating)h(The)f(History)150 1128 y Fs(accept-line)27 +b(\(Newline)h(or)i(Return\))630 1237 y Ft(Accept)36 b(the)g(line)f +(regardless)h(of)f(where)g(the)g(cursor)g(is.)55 b(If)34 +b(this)h(line)h(is)f(non-empt)m(y)-8 b(,)37 b(it)630 +1347 y(ma)m(y)32 b(b)s(e)g(added)f(to)h(the)g(history)g(list)h(for)e +(future)g(recall)j(with)d Fs(add_history\(\))p Ft(.)42 +b(If)31 b(this)630 1457 y(line)g(is)f(a)h(mo)s(di\014ed)e(history)h +(line,)h(the)g(history)f(line)h(is)f(restored)h(to)g(its)g(original)g +(state.)150 1604 y Fs(previous-history)26 b(\(C-p\))630 +1713 y Ft(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g(history)h(list,)g +(fetc)m(hing)g(the)g(previous)f(command.)150 1861 y Fs(next-history)d +(\(C-n\))630 1970 y Ft(Mo)m(v)m(e)32 b(`forw)m(ard')f(through)e(the)i +(history)f(list,)i(fetc)m(hing)f(the)g(next)f(command.)150 +2117 y Fs(beginning-of-history)25 b(\(M-<\))630 2227 +y Ft(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h(the)f(history)-8 +b(.)150 2374 y Fs(end-of-history)26 b(\(M->\))630 2484 +y Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(input)e(history)-8 +b(,)31 b(i.e.,)h(the)f(line)f(curren)m(tly)h(b)s(eing)f(en)m(tered.)150 +2631 y Fs(reverse-search-history)24 b(\(C-r\))630 2741 +y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g(the)f(curren)m(t)g +(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g(his-)630 +2850 y(tory)26 b(as)h(necessary)-8 b(.)40 b(This)25 b(is)i(an)f +(incremen)m(tal)h(searc)m(h.)40 b(This)25 b(command)h(sets)h(the)f +(region)630 2960 y(to)31 b(the)g(matc)m(hed)g(text)g(and)f(activ)-5 +b(ates)33 b(the)d(mark.)150 3107 y Fs(forward-search-history)24 +b(\(C-s\))630 3217 y Ft(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h +(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the) +630 3326 y(history)38 b(as)g(necessary)-8 b(.)65 b(This)38 +b(is)g(an)g(incremen)m(tal)h(searc)m(h.)65 b(This)37 +b(command)h(sets)h(the)630 3436 y(region)31 b(to)g(the)g(matc)m(hed)g +(text)g(and)f(activ)-5 b(ates)33 b(the)d(mark.)150 3583 +y Fs(non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24 +b(\(M-p\))630 3693 y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g +(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g +(his-)630 3802 y(tory)36 b(as)g(necessary)h(using)e(a)i(non-incremen)m +(tal)g(searc)m(h)f(for)g(a)g(string)g(supplied)f(b)m(y)h(the)630 +3912 y(user.)k(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an)m +(ywhere)g(in)f(a)h(history)f(line.)150 4059 y Fs +(non-incremental-forward-)o(sear)o(ch-h)o(ist)o(ory)24 +b(\(M-n\))630 4169 y Ft(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h +(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the) +630 4278 y(history)27 b(as)f(necessary)i(using)e(a)h(non-incremen)m +(tal)g(searc)m(h)h(for)e(a)h(string)g(supplied)e(b)m(y)i(the)630 +4388 y(user.)40 b(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an) +m(ywhere)g(in)f(a)h(history)f(line.)150 4535 y Fs +(history-search-forward)24 b(\(\))630 4645 y Ft(Searc)m(h)42 +b(forw)m(ard)f(through)f(the)i(history)f(for)g(the)h(string)f(of)h(c)m +(haracters)h(b)s(et)m(w)m(een)f(the)630 4754 y(start)36 +b(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.)58 +b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)630 +4864 y(b)s(eginning)32 b(of)g(a)h(history)g(line.)47 +b(This)32 b(is)h(a)f(non-incremen)m(tal)i(searc)m(h.)48 +b(By)33 b(default,)g(this)630 4974 y(command)d(is)h(un)m(b)s(ound.)150 +5121 y Fs(history-search-backward)24 b(\(\))630 5230 +y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g +(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630 +5340 y(start)g(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.) +58 b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)p +eop end +%%Page: 19 23 +TeXDict begin 19 22 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(19)630 299 y(b)s(eginning)32 +b(of)g(a)h(history)g(line.)47 b(This)32 b(is)h(a)f(non-incremen)m(tal)i +(searc)m(h.)48 b(By)33 b(default,)g(this)630 408 y(command)d(is)h(un)m +(b)s(ound.)150 566 y Fs(history-substring-search)o(-for)o(ward)24 +b(\(\))630 676 y Ft(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i +(history)f(for)g(the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f +(the)630 785 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h(p) +s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h(an)m +(ywhere)630 895 y(in)i(a)h(history)g(line.)47 b(This)32 +b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33 +b(default,)h(this)e(command)630 1005 y(is)e(un)m(b)s(ound.)150 +1162 y Fs(history-substring-search)o(-bac)o(kwar)o(d)24 +b(\(\))630 1272 y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h +(history)g(for)g(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g +(the)630 1381 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h +(p)s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h +(an)m(ywhere)630 1491 y(in)i(a)h(history)g(line.)47 b(This)32 +b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33 +b(default,)h(this)e(command)630 1601 y(is)e(un)m(b)s(ound.)150 +1758 y Fs(yank-nth-arg)d(\(M-C-y\))630 1868 y Ft(Insert)37 +b(the)g(\014rst)f(argumen)m(t)i(to)f(the)h(previous)e(command)h +(\(usually)g(the)g(second)g(w)m(ord)630 1978 y(on)32 +b(the)g(previous)f(line\))i(at)f(p)s(oin)m(t.)46 b(With)32 +b(an)g(argumen)m(t)g Fj(n)p Ft(,)g(insert)g(the)g Fj(n)p +Ft(th)f(w)m(ord)g(from)630 2087 y(the)k(previous)f(command)h(\(the)g(w) +m(ords)g(in)f(the)h(previous)g(command)f(b)s(egin)h(with)f(w)m(ord)630 +2197 y(0\).)69 b(A)40 b(negativ)m(e)h(argumen)m(t)f(inserts)g(the)f +Fj(n)p Ft(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630 +2306 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fj(n)e +Ft(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630 +2416 y(the)e(`)p Fs(!)p Fl(n)p Ft(')f(history)g(expansion)g(had)g(b)s +(een)g(sp)s(eci\014ed.)150 2574 y Fs(yank-last-arg)d(\(M-.)i(or)h +(M-_\))630 2683 y Ft(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous) +f(command)h(\(the)h(last)f(w)m(ord)g(of)g(the)g(previous)630 +2793 y(history)e(en)m(try\).)51 b(With)34 b(a)g(n)m(umeric)g(argumen)m +(t,)h(b)s(eha)m(v)m(e)f(exactly)h(lik)m(e)g Fs(yank-nth-arg)p +Ft(.)630 2902 y(Successiv)m(e)26 b(calls)g(to)f Fs(yank-last-arg)c +Ft(mo)m(v)m(e)27 b(bac)m(k)e(through)f(the)h(history)g(list,)i +(inserting)630 3012 y(the)c(last)g(w)m(ord)f(\(or)h(the)g(w)m(ord)f(sp) +s(eci\014ed)g(b)m(y)g(the)h(argumen)m(t)g(to)g(the)g(\014rst)f(call\))i +(of)f(eac)m(h)h(line)630 3122 y(in)36 b(turn.)58 b(An)m(y)36 +b(n)m(umeric)h(argumen)m(t)f(supplied)g(to)h(these)g(successiv)m(e)g +(calls)h(determines)630 3231 y(the)d(direction)g(to)h(mo)m(v)m(e)g +(through)e(the)h(history)-8 b(.)54 b(A)35 b(negativ)m(e)i(argumen)m(t)e +(switc)m(hes)h(the)630 3341 y(direction)23 b(through)g(the)g(history)f +(\(bac)m(k)i(or)f(forw)m(ard\).)38 b(The)22 b(history)h(expansion)g +(facilities)630 3450 y(are)28 b(used)f(to)h(extract)h(the)f(last)g +(argumen)m(t,)h(as)e(if)h(the)g(`)p Fs(!$)p Ft(')f(history)g(expansion) +h(had)f(b)s(een)630 3560 y(sp)s(eci\014ed.)150 3718 y +Fs(operate-and-get-next)e(\(C-o\))630 3827 y Ft(Accept)30 +b(the)g(curren)m(t)e(line)i(for)f(return)f(to)h(the)h(calling)g +(application)h(as)e(if)g(a)h(newline)f(had)630 3937 y(b)s(een)22 +b(en)m(tered,)k(and)d(fetc)m(h)h(the)f(next)g(line)h(relativ)m(e)h(to)f +(the)f(curren)m(t)g(line)h(from)f(the)g(history)630 4046 +y(for)31 b(editing.)43 b(A)31 b(n)m(umeric)f(argumen)m(t,)i(if)f +(supplied,)f(sp)s(eci\014es)h(the)g(history)f(en)m(try)i(to)f(use)630 +4156 y(instead)g(of)f(the)h(curren)m(t)f(line.)150 4314 +y Fs(fetch-history)d(\(\))630 4423 y Ft(With)e(a)f(n)m(umeric)g +(argumen)m(t,)i(fetc)m(h)f(that)g(en)m(try)f(from)g(the)g(history)g +(list)h(and)e(mak)m(e)i(it)g(the)630 4533 y(curren)m(t)30 +b(line.)41 b(Without)30 b(an)g(argumen)m(t,)h(mo)m(v)m(e)g(bac)m(k)g +(to)f(the)g(\014rst)f(en)m(try)h(in)g(the)g(history)630 +4643 y(list.)150 4840 y Fi(1.4.3)63 b(Commands)42 b(F)-10 +b(or)41 b(Changing)g(T)-10 b(ext)150 5011 y Fl(end-of-file)27 +b Fs(\(usually)h(C-d\))630 5121 y Ft(The)e(c)m(haracter)h(indicating)h +(end-of-\014le)e(as)h(set,)g(for)f(example,)i(b)m(y)e +Fs(stty)p Ft(.)39 b(If)25 b(this)h(c)m(harac-)630 5230 +y(ter)c(is)g(read)g(when)e(there)i(are)h(no)e(c)m(haracters)j(on)d(the) +h(line,)i(and)d(p)s(oin)m(t)h(is)g(at)h(the)f(b)s(eginning)630 +5340 y(of)31 b(the)f(line,)h(Readline)g(in)m(terprets)g(it)g(as)f(the)h +(end)f(of)g(input)f(and)h(returns)f Fm(eof)p Ft(.)p eop +end +%%Page: 20 24 +TeXDict begin 20 23 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(20)150 299 y Fs(delete-char)27 +b(\(C-d\))630 408 y Ft(Delete)35 b(the)f(c)m(haracter)h(at)f(p)s(oin)m +(t.)49 b(If)33 b(this)g(function)g(is)g(b)s(ound)e(to)j(the)g(same)f(c) +m(haracter)630 518 y(as)e(the)f(tt)m(y)i Fm(eof)d Ft(c)m(haracter,)j +(as)f Fl(C-d)e Ft(commonly)i(is,)g(see)g(ab)s(o)m(v)m(e)h(for)e(the)g +(e\013ects.)150 669 y Fs(backward-delete-char)25 b(\(Rubout\))630 +779 y Ft(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40 +b(A)30 b(n)m(umeric)g(argumen)m(t)h(means)f(to)h(kill)g(the)630 +889 y(c)m(haracters)h(instead)e(of)h(deleting)g(them.)150 +1040 y Fs(forward-backward-delete-)o(char)24 b(\(\))630 +1149 y Ft(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h +(unless)d(the)i(cursor)e(is)h(at)h(the)g(end)e(of)i(the)630 +1259 y(line,)33 b(in)e(whic)m(h)g(case)i(the)f(c)m(haracter)h(b)s +(ehind)d(the)i(cursor)f(is)g(deleted.)46 b(By)32 b(default,)g(this)630 +1369 y(is)e(not)h(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 +1520 y Fs(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 1630 +y Ft(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h +(v)m(erbatim.)53 b(This)33 b(is)i(ho)m(w)f(to)h(insert)f(k)m(ey)630 +1739 y(sequences)d(lik)m(e)g Fl(C-q)p Ft(,)f(for)g(example.)150 +1891 y Fs(tab-insert)e(\(M-TAB\))630 2000 y Ft(Insert)i(a)h(tab)f(c)m +(haracter.)150 2151 y Fs(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o +(\))630 2261 y Ft(Insert)g(y)m(ourself.)150 2412 y Fs +(bracketed-paste-begin)25 b(\(\))630 2522 y Ft(This)f(function)h(is)f +(in)m(tended)h(to)h(b)s(e)e(b)s(ound)f(to)i(the)g Fs(")p +Ft(brac)m(k)m(eted)h(paste)p Fs(")f Ft(escap)s(e)h(sequence)630 +2632 y(sen)m(t)38 b(b)m(y)f(some)h(terminals,)i(and)d(suc)m(h)g(a)h +(binding)e(is)i(assigned)f(b)m(y)h(default.)62 b(It)38 +b(allo)m(ws)630 2741 y(Readline)33 b(to)g(insert)g(the)f(pasted)h(text) +g(as)g(a)g(single)g(unit)f(without)h(treating)h(eac)m(h)f(c)m(har-)630 +2851 y(acter)40 b(as)f(if)g(it)g(had)f(b)s(een)g(read)h(from)f(the)h(k) +m(eyb)s(oard.)66 b(The)39 b(c)m(haracters)h(are)f(inserted)630 +2960 y(as)44 b(if)g(eac)m(h)i(one)e(w)m(as)g(b)s(ound)e(to)j +Fs(self-insert)c Ft(instead)j(of)h(executing)g(an)m(y)f(editing)630 +3070 y(commands.)630 3200 y(Brac)m(k)m(eted)38 b(paste)f(sets)f(the)h +(region)f(\(the)h(c)m(haracters)g(b)s(et)m(w)m(een)g(p)s(oin)m(t)f(and) +g(the)g(mark\))630 3310 y(to)j(the)g(inserted)f(text.)65 +b(It)39 b(uses)f(the)g(concept)h(of)g(an)f Fk(active)i(mark)10 +b Ft(:)57 b(when)38 b(the)g(mark)630 3420 y(is)d(activ)m(e,)k(Readline) +c(redispla)m(y)h(uses)e(the)h(terminal's)h(standout)f(mo)s(de)f(to)i +(denote)g(the)630 3529 y(region.)150 3680 y Fs(transpose-chars)26 +b(\(C-t\))630 3790 y Ft(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f(the) +g(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e(the)g +(cursor,)630 3900 y(mo)m(ving)k(the)g(cursor)f(forw)m(ard)g(as)g(w)m +(ell.)57 b(If)35 b(the)h(insertion)g(p)s(oin)m(t)f(is)g(at)i(the)e(end) +g(of)h(the)630 4009 y(line,)24 b(then)e(this)g(transp)s(oses)f(the)h +(last)h(t)m(w)m(o)g(c)m(haracters)g(of)f(the)h(line.)38 +b(Negativ)m(e)25 b(argumen)m(ts)630 4119 y(ha)m(v)m(e)32 +b(no)e(e\013ect.)150 4270 y Fs(transpose-words)c(\(M-t\))630 +4380 y Ft(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g +(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s(oin)m(t)f(past) +g(that)630 4489 y(w)m(ord)c(as)h(w)m(ell.)41 b(If)27 +b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i(the)f +(line,)i(this)e(transp)s(oses)g(the)630 4599 y(last)j(t)m(w)m(o)h(w)m +(ords)e(on)g(the)h(line.)150 4750 y Fs(upcase-word)c(\(M-u\))630 +4860 y Ft(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i +(w)m(ord.)45 b(With)32 b(a)g(negativ)m(e)j(argumen)m(t,)e(upp)s(er-)630 +4969 y(case)e(the)g(previous)f(w)m(ord,)g(but)g(do)g(not)h(mo)m(v)m(e)h +(the)e(cursor.)150 5121 y Fs(downcase-word)d(\(M-l\))630 +5230 y Ft(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i +(w)m(ord.)37 b(With)22 b(a)g(negativ)m(e)i(argumen)m(t,)g(lo)m(w)m +(ercase)630 5340 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f(mo)m +(v)m(e)i(the)f(cursor.)p eop end +%%Page: 21 25 +TeXDict begin 21 24 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(21)150 299 y Fs(capitalize-word)26 +b(\(M-c\))630 408 y Ft(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m +(wing\))i(w)m(ord.)38 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h +(capitalize)630 518 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f +(mo)m(v)m(e)i(the)f(cursor.)150 678 y Fs(overwrite-mode)26 +b(\(\))630 788 y Ft(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48 +b(With)33 b(an)g(explicit)h(p)s(ositiv)m(e)g(n)m(umeric)f(argumen)m(t,) +h(switc)m(hes)630 897 y(to)22 b(o)m(v)m(erwrite)i(mo)s(de.)37 +b(With)22 b(an)g(explicit)h(non-p)s(ositiv)m(e)f(n)m(umeric)g(argumen)m +(t,)i(switc)m(hes)e(to)630 1007 y(insert)30 b(mo)s(de.)41 +b(This)30 b(command)h(a\013ects)h(only)e Fs(emacs)f Ft(mo)s(de;)i +Fs(vi)f Ft(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 1116 +y(di\013eren)m(tly)-8 b(.)42 b(Eac)m(h)31 b(call)h(to)f +Fs(readline\(\))c Ft(starts)k(in)f(insert)g(mo)s(de.)630 +1251 y(In)52 b(o)m(v)m(erwrite)h(mo)s(de,)58 b(c)m(haracters)c(b)s +(ound)c(to)j Fs(self-insert)c Ft(replace)k(the)g(text)g(at)630 +1361 y(p)s(oin)m(t)59 b(rather)f(than)h(pushing)e(the)i(text)g(to)h +(the)f(righ)m(t.)126 b(Characters)59 b(b)s(ound)d(to)630 +1470 y Fs(backward-delete-char)25 b Ft(replace)31 b(the)g(c)m(haracter) +h(b)s(efore)e(p)s(oin)m(t)g(with)g(a)h(space.)630 1605 +y(By)g(default,)f(this)h(command)f(is)g(un)m(b)s(ound.)150 +1805 y Fi(1.4.4)63 b(Killing)42 b(And)e(Y)-10 b(anking)150 +1977 y Fs(kill-line)28 b(\(C-k\))630 2087 y Ft(Kill)k(the)f(text)i +(from)d(p)s(oin)m(t)i(to)g(the)f(end)g(of)g(the)h(line.)44 +b(With)31 b(a)h(negativ)m(e)i(n)m(umeric)d(argu-)630 +2197 y(men)m(t,)g(kill)g(bac)m(kw)m(ard)g(from)f(the)g(cursor)g(to)h +(the)g(b)s(eginning)e(of)i(the)g(curren)m(t)f(line.)150 +2357 y Fs(backward-kill-line)25 b(\(C-x)30 b(Rubout\))630 +2466 y Ft(Kill)40 b(bac)m(kw)m(ard)h(from)e(the)h(cursor)g(to)g(the)g +(b)s(eginning)g(of)g(the)g(curren)m(t)f(line.)70 b(With)41 +b(a)630 2576 y(negativ)m(e)47 b(n)m(umeric)e(argumen)m(t,)50 +b(kill)c(forw)m(ard)e(from)h(the)g(cursor)g(to)h(the)f(end)f(of)i(the) +630 2685 y(curren)m(t)30 b(line.)150 2845 y Fs(unix-line-discard)c +(\(C-u\))630 2955 y Ft(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor)f +(to)h(the)f(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150 +3115 y Fs(kill-whole-line)c(\(\))630 3225 y Ft(Kill)37 +b(all)g(c)m(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g +(where)f(p)s(oin)m(t)h(is.)59 b(By)36 b(default,)630 +3334 y(this)30 b(is)h(un)m(b)s(ound.)150 3494 y Fs(kill-word)d(\(M-d\)) +630 3604 y Ft(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f +(curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)h +(the)g(end)630 3713 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8 +b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Fs(forward-word)p +Ft(.)150 3874 y Fs(backward-kill-word)25 b(\(M-DEL\))630 +3983 y Ft(Kill)k(the)g(w)m(ord)g(b)s(ehind)e(p)s(oin)m(t.)40 +b(W)-8 b(ord)29 b(b)s(oundaries)f(are)h(the)g(same)g(as)g +Fs(backward-word)p Ft(.)150 4143 y Fs(shell-transpose-words)c +(\(M-C-t\))630 4253 y Ft(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin) +m(t)g(past)g(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s +(oin)m(t)f(past)g(that)630 4362 y(w)m(ord)c(as)h(w)m(ell.)41 +b(If)27 b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i +(the)f(line,)i(this)e(transp)s(oses)g(the)630 4472 y(last)j(t)m(w)m(o)h +(w)m(ords)d(on)i(the)f(line.)41 b(W)-8 b(ord)31 b(b)s(oundaries)e(are)h +(the)h(same)f(as)h Fs(shell-forward-)630 4582 y(word)e +Ft(and)h Fs(shell-backward-word)p Ft(.)150 4742 y Fs(unix-word-rubout)c +(\(C-w\))630 4851 y Ft(Kill)32 b(the)g(w)m(ord)f(b)s(ehind)f(p)s(oin)m +(t,)i(using)f(white)h(space)g(as)g(a)g(w)m(ord)f(b)s(oundary)-8 +b(.)43 b(The)31 b(killed)630 4961 y(text)g(is)g(sa)m(v)m(ed)g(on)g(the) +f(kill-ring.)150 5121 y Fs(unix-filename-rubout)25 b(\(\))630 +5230 y Ft(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m(t,)j(using)e +(white)g(space)h(and)f(the)g(slash)g(c)m(haracter)i(as)f(the)630 +5340 y(w)m(ord)30 b(b)s(oundaries.)39 b(The)30 b(killed)h(text)g(is)g +(sa)m(v)m(ed)g(on)g(the)f(kill-ring.)p eop end +%%Page: 22 26 +TeXDict begin 22 25 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(22)150 299 y Fs +(delete-horizontal-space)24 b(\(\))630 408 y Ft(Delete)33 +b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41 +b(By)31 b(default,)f(this)h(is)f(un)m(b)s(ound.)150 564 +y Fs(kill-region)d(\(\))630 673 y Ft(Kill)k(the)f(text)i(in)e(the)g +(curren)m(t)h(region.)41 b(By)31 b(default,)f(this)h(command)f(is)g(un) +m(b)s(ound.)150 829 y Fs(copy-region-as-kill)25 b(\(\))630 +938 y Ft(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f(kill) +h(bu\013er,)f(so)g(it)h(can)f(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)f(a)m(w)m +(a)m(y)-8 b(.)630 1048 y(By)31 b(default,)f(this)h(command)f(is)g(un)m +(b)s(ound.)150 1203 y Fs(copy-backward-word)25 b(\(\))630 +1313 y Ft(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(to)i +(the)e(kill)h(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries)f(are)i +(the)630 1422 y(same)31 b(as)f Fs(backward-word)p Ft(.)38 +b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150 +1578 y Fs(copy-forward-word)26 b(\(\))630 1687 y Ft(Cop)m(y)31 +b(the)g(w)m(ord)g(follo)m(wing)h(p)s(oin)m(t)f(to)h(the)f(kill)h +(bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)e(are)j(the)630 +1797 y(same)f(as)f Fs(forward-word)p Ft(.)38 b(By)30 +b(default,)h(this)g(command)f(is)g(un)m(b)s(ound.)150 +1952 y Fs(yank)f(\(C-y\))630 2062 y Ft(Y)-8 b(ank)31 +b(the)f(top)h(of)g(the)f(kill)h(ring)f(in)m(to)i(the)e(bu\013er)g(at)h +(p)s(oin)m(t.)150 2217 y Fs(yank-pop)d(\(M-y\))630 2327 +y Ft(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h(the)f(new)g(top.)54 +b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h(the)g(prior)630 +2436 y(command)30 b(is)h Fs(yank)e Ft(or)h Fs(yank-pop)p +Ft(.)150 2631 y Fi(1.4.5)63 b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m +(ts)150 2801 y Fs(digit-argument)26 b(\()p Fl(M-0)p Fs(,)j +Fl(M-1)p Fs(,)h(...)f Fl(M--)p Fs(\))630 2911 y Ft(Add)d(this)h(digit)g +(to)h(the)f(argumen)m(t)g(already)h(accum)m(ulating,)h(or)e(start)h(a)f +(new)f(argumen)m(t.)630 3020 y Fl(M--)j Ft(starts)i(a)g(negativ)m(e)i +(argumen)m(t.)150 3176 y Fs(universal-argument)25 b(\(\))630 +3285 y Ft(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g +(argumen)m(t.)40 b(If)25 b(this)g(command)h(is)f(follo)m(w)m(ed)i(b)m +(y)f(one)630 3395 y(or)k(more)f(digits,)i(optionally)g(with)e(a)h +(leading)h(min)m(us)e(sign,)h(those)g(digits)g(de\014ne)f(the)h(ar-)630 +3505 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)g(follo)m(w)m(ed)h(b) +m(y)f(digits,)i(executing)f Fs(universal-argument)630 +3614 y Ft(again)j(ends)e(the)h(n)m(umeric)f(argumen)m(t,)i(but)e(is)h +(otherwise)g(ignored.)45 b(As)32 b(a)g(sp)s(ecial)h(case,)630 +3724 y(if)g(this)g(command)f(is)h(immediately)h(follo)m(w)m(ed)h(b)m(y) +d(a)h(c)m(haracter)i(that)e(is)g(neither)g(a)g(digit)630 +3833 y(nor)41 b(min)m(us)f(sign,)k(the)e(argumen)m(t)f(coun)m(t)h(for)f +(the)h(next)f(command)g(is)g(m)m(ultiplied)h(b)m(y)630 +3943 y(four.)54 b(The)35 b(argumen)m(t)g(coun)m(t)h(is)f(initially)h +(one,)h(so)e(executing)i(this)e(function)f(the)i(\014rst)630 +4053 y(time)29 b(mak)m(es)h(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)h +(second)g(time)g(mak)m(es)h(the)e(argumen)m(t)h(coun)m(t)630 +4162 y(sixteen,)i(and)f(so)h(on.)40 b(By)31 b(default,)g(this)f(is)g +(not)h(b)s(ound)d(to)k(a)e(k)m(ey)-8 b(.)150 4357 y Fi(1.4.6)63 +b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42 +b(Y)-10 b(ou)150 4527 y Fs(complete)28 b(\(TAB\))630 +4637 y Ft(A)m(ttempt)c(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g +(b)s(efore)f(p)s(oin)m(t.)39 b(The)22 b(actual)i(completion)630 +4746 y(p)s(erformed)29 b(is)h(application-sp)s(eci\014c.)42 +b(The)30 b(default)h(is)f(\014lename)h(completion.)150 +4902 y Fs(possible-completions)25 b(\(M-?\))630 5011 +y Ft(List)35 b(the)g(p)s(ossible)f(completions)i(of)e(the)h(text)h(b)s +(efore)e(p)s(oin)m(t.)54 b(When)34 b(displa)m(ying)h(com-)630 +5121 y(pletions,)f(Readline)f(sets)f(the)h(n)m(um)m(b)s(er)e(of)i +(columns)f(used)f(for)i(displa)m(y)f(to)h(the)g(v)-5 +b(alue)33 b(of)630 5230 y Fs(completion-display-width)o +Ft(,)g(the)j(v)-5 b(alue)37 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5 +b(ariable)38 b Fs(COLUMNS)p Ft(,)630 5340 y(or)30 b(the)h(screen)f +(width,)g(in)g(that)h(order.)p eop end +%%Page: 23 27 +TeXDict begin 23 26 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(23)150 299 y Fs +(insert-completions)25 b(\(M-*\))630 408 y Ft(Insert)30 +b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f(p)s(oin)m(t)h(that) +g(w)m(ould)f(ha)m(v)m(e)i(b)s(een)e(generated)630 518 +y(b)m(y)g Fs(possible-completions)p Ft(.)150 673 y Fs(menu-complete)d +(\(\))630 783 y Ft(Similar)d(to)g Fs(complete)p Ft(,)f(but)h(replaces)g +(the)g(w)m(ord)g(to)g(b)s(e)f(completed)i(with)e(a)i(single)f(matc)m(h) +630 893 y(from)37 b(the)h(list)h(of)f(p)s(ossible)f(completions.)64 +b(Rep)s(eated)39 b(execution)g(of)f Fs(menu-complete)630 +1002 y Ft(steps)i(through)g(the)g(list)h(of)f(p)s(ossible)g +(completions,)k(inserting)c(eac)m(h)i(matc)m(h)f(in)f(turn.)630 +1112 y(A)m(t)e(the)f(end)f(of)h(the)g(list)g(of)g(completions,)i(the)e +(b)s(ell)g(is)g(rung)f(\(sub)5 b(ject)36 b(to)i(the)f(setting)630 +1221 y(of)f Fs(bell-style)p Ft(\))e(and)h(the)h(original)i(text)f(is)f +(restored.)57 b(An)36 b(argumen)m(t)h(of)f Fj(n)f Ft(mo)m(v)m(es)i +Fj(n)630 1331 y Ft(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e +(matc)m(hes;)39 b(a)c(negativ)m(e)i(argumen)m(t)e(ma)m(y)g(b)s(e)f +(used)g(to)630 1441 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g +(list.)65 b(This)38 b(command)g(is)g(in)m(tended)g(to)h(b)s(e)f(b)s +(ound)e(to)630 1550 y Fs(TAB)p Ft(,)30 b(but)f(is)i(un)m(b)s(ound)d(b)m +(y)i(default.)150 1705 y Fs(menu-complete-backward)24 +b(\(\))630 1815 y Ft(Iden)m(tical)36 b(to)g Fs(menu-complete)p +Ft(,)d(but)h(mo)m(v)m(es)j(bac)m(kw)m(ard)e(through)f(the)i(list)f(of)g +(p)s(ossible)630 1925 y(completions,)d(as)e(if)h Fs(menu-complete)26 +b Ft(had)k(b)s(een)g(giv)m(en)h(a)g(negativ)m(e)i(argumen)m(t.)150 +2080 y Fs(delete-char-or-list)25 b(\(\))630 2190 y Ft(Deletes)41 +b(the)e(c)m(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)h(b)s +(eginning)e(or)h(end)f(of)h(the)630 2299 y(line)50 b(\(lik)m(e)h +Fs(delete-char)p Ft(\).)96 b(If)49 b(at)h(the)g(end)f(of)h(the)f(line,) +55 b(b)s(eha)m(v)m(es)c(iden)m(tically)g(to)630 2409 +y Fs(possible-completions)p Ft(.)35 b(This)30 b(command)g(is)g(un)m(b)s +(ound)e(b)m(y)i(default.)150 2604 y Fi(1.4.7)63 b(Keyb)s(oard)41 +b(Macros)150 2774 y Fs(start-kbd-macro)26 b(\(C-x)j(\(\))630 +2883 y Ft(Begin)i(sa)m(ving)h(the)e(c)m(haracters)i(t)m(yp)s(ed)e(in)m +(to)h(the)g(curren)m(t)f(k)m(eyb)s(oard)g(macro.)150 +3039 y Fs(end-kbd-macro)d(\(C-x)i(\)\))630 3148 y Ft(Stop)e(sa)m(ving)h +(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m(to)i(the)e(curren)m(t)g(k)m +(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i(the)630 3258 +y(de\014nition.)150 3413 y Fs(call-last-kbd-macro)c(\(C-x)k(e\))630 +3523 y Ft(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard)f(macro)h +(de\014ned,)f(b)m(y)h(making)f(the)g(c)m(haracters)i(in)e(the)630 +3632 y(macro)c(app)s(ear)f(as)g(if)h(t)m(yp)s(ed)f(at)h(the)f(k)m(eyb)s +(oard.)150 3788 y Fs(print-last-kbd-macro)25 b(\(\))630 +3897 y Ft(Prin)m(t)30 b(the)g(last)h(k)m(eyb)s(oard)f(macro)h +(de\014ned)e(in)h(a)g(format)h(suitable)g(for)f(the)g +Fj(inputrc)35 b Ft(\014le.)150 4092 y Fi(1.4.8)63 b(Some)41 +b(Miscellaneous)i(Commands)150 4262 y Fs(re-read-init-file)26 +b(\(C-x)j(C-r\))630 4372 y Ft(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of) +f(the)g Fj(inputrc)27 b Ft(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h +(bindings)d(or)i(v)-5 b(ariable)630 4481 y(assignmen)m(ts)31 +b(found)e(there.)150 4637 y Fs(abort)g(\(C-g\))630 4746 +y Ft(Ab)s(ort)d(the)h(curren)m(t)f(editing)h(command)f(and)g(ring)h +(the)f(terminal's)h(b)s(ell)g(\(sub)5 b(ject)26 b(to)i(the)630 +4856 y(setting)j(of)g Fs(bell-style)p Ft(\).)150 5011 +y Fs(do-lowercase-version)25 b(\(M-A,)k(M-B,)g(M-)p Fl(x)p +Fs(,)g(...)o(\))630 5121 y Ft(If)35 b(the)g(meta\014ed)g(c)m(haracter)i +Fj(x)k Ft(is)35 b(upp)s(er)e(case,)k(run)d(the)h(command)g(that)g(is)g +(b)s(ound)e(to)630 5230 y(the)g(corresp)s(onding)f(meta\014ed)h(lo)m(w) +m(er)i(case)f(c)m(haracter.)50 b(The)32 b(b)s(eha)m(vior)h(is)g +(unde\014ned)e(if)630 5340 y Fj(x)37 b Ft(is)30 b(already)h(lo)m(w)m +(er)h(case.)p eop end +%%Page: 24 28 +TeXDict begin 24 27 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(24)150 299 y Fs(prefix-meta)27 +b(\(ESC\))630 408 y Ft(Metafy)39 b(the)e(next)h(c)m(haracter)h(t)m(yp)s +(ed.)62 b(This)37 b(is)g(for)h(k)m(eyb)s(oards)f(without)g(a)h(meta)g +(k)m(ey)-8 b(.)630 518 y(T)m(yping)30 b(`)p Fs(ESC)g(f)p +Ft(')g(is)h(equiv)-5 b(alen)m(t)31 b(to)g(t)m(yping)g +Fl(M-f)p Ft(.)150 704 y Fs(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630 +814 y Ft(Incremen)m(tal)h(undo,)f(separately)h(remem)m(b)s(ered)f(for)g +(eac)m(h)i(line.)150 1000 y Fs(revert-line)27 b(\(M-r\))630 +1110 y Ft(Undo)33 b(all)h(c)m(hanges)g(made)f(to)h(this)f(line.)49 +b(This)32 b(is)h(lik)m(e)i(executing)f(the)f Fs(undo)f +Ft(command)630 1219 y(enough)e(times)h(to)g(get)h(bac)m(k)f(to)g(the)f +(b)s(eginning.)150 1406 y Fs(tilde-expand)d(\(M-~\))630 +1515 y Ft(P)m(erform)j(tilde)h(expansion)g(on)f(the)g(curren)m(t)h(w)m +(ord.)150 1702 y Fs(set-mark)d(\(C-@\))630 1811 y Ft(Set)33 +b(the)g(mark)f(to)i(the)f(p)s(oin)m(t.)48 b(If)32 b(a)h(n)m(umeric)g +(argumen)m(t)g(is)g(supplied,)f(the)h(mark)g(is)f(set)630 +1921 y(to)f(that)g(p)s(osition.)150 2107 y Fs(exchange-point-and-mark) +24 b(\(C-x)29 b(C-x\))630 2217 y Ft(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with) +g(the)g(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)i(is)f +(set)h(to)f(the)h(sa)m(v)m(ed)630 2326 y(p)s(osition,)f(and)e(the)i +(old)g(cursor)e(p)s(osition)i(is)f(sa)m(v)m(ed)i(as)e(the)h(mark.)150 +2513 y Fs(character-search)26 b(\(C-]\))630 2622 y Ft(A)f(c)m(haracter) +h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)g(the)f(next)g +(o)s(ccurrence)g(of)g(that)g(c)m(haracter.)630 2732 y(A)30 +b(negativ)m(e)j(argumen)m(t)e(searc)m(hes)g(for)f(previous)g(o)s +(ccurrences.)150 2918 y Fs(character-search-backwar)o(d)24 +b(\(M-C-]\))630 3028 y Ft(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s +(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)f(the)g(previous)f(o)s(ccurrence)h(of) +g(that)630 3137 y(c)m(haracter.)d(A)31 b(negativ)m(e)h(argumen)m(t)f +(searc)m(hes)g(for)g(subsequen)m(t)e(o)s(ccurrences.)150 +3324 y Fs(skip-csi-sequence)d(\(\))630 3433 y Ft(Read)i(enough)f(c)m +(haracters)h(to)g(consume)f(a)h(m)m(ulti-k)m(ey)h(sequence)f(suc)m(h)f +(as)g(those)h(de\014ned)630 3543 y(for)37 b(k)m(eys)h(lik)m(e)g(Home)g +(and)f(End.)60 b(Suc)m(h)37 b(sequences)g(b)s(egin)g(with)g(a)h(Con)m +(trol)g(Sequence)630 3652 y(Indicator)f(\(CSI\),)f(usually)h(ESC-[.)59 +b(If)36 b(this)g(sequence)h(is)g(b)s(ound)d(to)k Fs("\\)p +Ft(e[)p Fs(")p Ft(,)g(k)m(eys)f(pro-)630 3762 y(ducing)29 +b(suc)m(h)g(sequences)g(will)h(ha)m(v)m(e)h(no)e(e\013ect)i(unless)d +(explicitly)j(b)s(ound)d(to)i(a)f(Readline)630 3871 y(command,)j +(instead)g(of)g(inserting)g(stra)m(y)h(c)m(haracters)g(in)m(to)g(the)f +(editing)h(bu\013er.)44 b(This)31 b(is)630 3981 y(un)m(b)s(ound)d(b)m +(y)i(default,)h(but)f(usually)g(b)s(ound)e(to)j(ESC-[.)150 +4167 y Fs(insert-comment)26 b(\(M-#\))630 4277 y Ft(Without)36 +b(a)g(n)m(umeric)g(argumen)m(t,)h(the)f(v)-5 b(alue)36 +b(of)g(the)g Fs(comment-begin)c Ft(v)-5 b(ariable)36 +b(is)g(in-)630 4387 y(serted)c(at)g(the)g(b)s(eginning)f(of)h(the)f +(curren)m(t)h(line.)45 b(If)31 b(a)h(n)m(umeric)f(argumen)m(t)h(is)g +(supplied,)630 4496 y(this)k(command)h(acts)g(as)g(a)g(toggle:)55 +b(if)37 b(the)f(c)m(haracters)i(at)g(the)e(b)s(eginning)g(of)h(the)g +(line)630 4606 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5 +b(alue)31 b(of)f Fs(comment-begin)p Ft(,)e(the)i(v)-5 +b(alue)31 b(is)g(inserted,)g(otherwise)g(the)630 4715 +y(c)m(haracters)42 b(in)d Fs(comment-begin)e Ft(are)j(deleted)h(from)f +(the)g(b)s(eginning)g(of)g(the)g(line.)71 b(In)630 4825 +y(either)31 b(case,)h(the)e(line)h(is)f(accepted)i(as)f(if)f(a)h +(newline)f(had)g(b)s(een)f(t)m(yp)s(ed.)150 5011 y Fs(dump-functions)d +(\(\))630 5121 y Ft(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g +(their)g(k)m(ey)h(bindings)e(to)j(the)e(Readline)h(output)f(stream.)630 +5230 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g(supplied,)f(the)h +(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m(y)g(that)630 +5340 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fj(inputrc)k +Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k +(default.)p eop end +%%Page: 25 29 +TeXDict begin 25 28 bop 150 -116 a Ft(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(25)150 299 y Fs(dump-variables)26 +b(\(\))630 408 y Ft(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5 +b(ariables)22 b(and)f(their)g(v)-5 b(alues)22 b(to)g(the)f(Readline)h +(output)f(stream.)630 518 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g +(supplied,)f(the)h(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m +(y)g(that)630 628 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h +Fj(inputrc)k Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c +(b)m(y)k(default.)150 787 y Fs(dump-macros)c(\(\))630 +897 y Ft(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences)f +(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)g(they)630 +1006 y(output.)53 b(If)35 b(a)g(n)m(umeric)f(argumen)m(t)i(is)e +(supplied,)h(the)g(output)g(is)f(formatted)i(in)e(suc)m(h)h(a)630 +1116 y(w)m(a)m(y)c(that)g(it)f(can)g(b)s(e)g(made)g(part)f(of)i(an)e +Fj(inputrc)35 b Ft(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound) +d(b)m(y)630 1225 y(default.)150 1385 y Fs(emacs-editing-mode)e(\(C-e\)) +630 1494 y Ft(When)30 b(in)g Fs(vi)g Ft(command)g(mo)s(de,)g(this)h +(causes)f(a)h(switc)m(h)g(to)g Fs(emacs)e Ft(editing)i(mo)s(de.)150 +1654 y Fs(vi-editing-mode)26 b(\(M-C-j\))630 1763 y Ft(When)k(in)g +Fs(emacs)f Ft(editing)i(mo)s(de,)f(this)h(causes)f(a)h(switc)m(h)g(to)g +Fs(vi)f Ft(editing)h(mo)s(de.)150 2004 y Fr(1.5)68 b(Readline)47 +b(vi)e(Mo)t(de)150 2164 y Ft(While)32 b(the)g(Readline)g(library)f(do)s +(es)g(not)h(ha)m(v)m(e)h(a)f(full)f(set)h(of)g Fs(vi)f +Ft(editing)h(functions,)f(it)h(do)s(es)g(con)m(tain)150 +2273 y(enough)i(to)h(allo)m(w)g(simple)f(editing)h(of)f(the)g(line.)52 +b(The)34 b(Readline)g Fs(vi)g Ft(mo)s(de)f(b)s(eha)m(v)m(es)i(as)f(sp)s +(eci\014ed)f(in)150 2383 y(the)e Fm(posix)e Ft(standard.)275 +2517 y(In)f(order)g(to)i(switc)m(h)g(in)m(teractiv)m(ely)i(b)s(et)m(w)m +(een)d Fs(emacs)f Ft(and)g Fs(vi)h Ft(editing)g(mo)s(des,)g(use)g(the)g +(command)150 2627 y Fl(M-C-j)36 b Ft(\(b)s(ound)h(to)h +(emacs-editing-mo)s(de)i(when)d(in)g Fs(vi)h Ft(mo)s(de)f(and)g(to)i +(vi-editing-mo)s(de)g(in)e Fs(emacs)150 2736 y Ft(mo)s(de\).)k(The)30 +b(Readline)h(default)f(is)g Fs(emacs)f Ft(mo)s(de.)275 +2871 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f(in)g Fs(vi)f +Ft(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g(`insertion')g(mo)s +(de,)g(as)h(if)f(y)m(ou)150 2980 y(had)f(t)m(yp)s(ed)g(an)g(`)p +Fs(i)p Ft('.)41 b(Pressing)29 b Fs(ESC)f Ft(switc)m(hes)i(y)m(ou)g(in)m +(to)h(`command')e(mo)s(de,)h(where)e(y)m(ou)i(can)g(edit)g(the)150 +3090 y(text)35 b(of)f(the)g(line)g(with)f(the)h(standard)f +Fs(vi)g Ft(mo)m(v)m(emen)m(t)j(k)m(eys,)g(mo)m(v)m(e)f(to)f(previous)g +(history)f(lines)h(with)150 3200 y(`)p Fs(k)p Ft(')d(and)e(subsequen)m +(t)h(lines)h(with)f(`)p Fs(j)p Ft(',)g(and)g(so)h(forth.)p +eop end +%%Page: 26 30 +TeXDict begin 26 29 bop 3659 -116 a Ft(26)150 299 y Fp(2)80 +b(Programming)54 b(with)f(GNU)h(Readline)150 543 y Ft(This)24 +b(c)m(hapter)i(describ)s(es)e(the)h(in)m(terface)h(b)s(et)m(w)m(een)g +(the)f Fm(gnu)f Ft(Readline)i(Library)e(and)g(other)h(programs.)150 +652 y(If)k(y)m(ou)g(are)g(a)h(programmer,)f(and)f(y)m(ou)i(wish)e(to)i +(include)f(the)g(features)g(found)f(in)h Fm(gnu)g Ft(Readline)g(suc)m +(h)150 762 y(as)c(completion,)j(line)d(editing,)i(and)d(in)m(teractiv)m +(e)k(history)d(manipulation)g(in)f(y)m(our)h(o)m(wn)g(programs,)h(this) +150 871 y(section)32 b(is)e(for)g(y)m(ou.)150 1117 y +Fr(2.1)68 b(Basic)45 b(Beha)l(vior)150 1276 y Ft(Man)m(y)39 +b(programs)e(pro)m(vide)h(a)h(command)f(line)g(in)m(terface,)k(suc)m(h) +37 b(as)i Fs(mail)p Ft(,)g Fs(ftp)p Ft(,)g(and)e Fs(sh)p +Ft(.)63 b(F)-8 b(or)39 b(suc)m(h)150 1386 y(programs,)29 +b(the)f(default)h(b)s(eha)m(viour)f(of)h(Readline)g(is)g(su\016cien)m +(t.)40 b(This)28 b(section)i(describ)s(es)d(ho)m(w)i(to)g(use)150 +1496 y(Readline)35 b(in)f(the)h(simplest)f(w)m(a)m(y)h(p)s(ossible,)h +(p)s(erhaps)c(to)j(replace)h(calls)f(in)f(y)m(our)h(co)s(de)f(to)h +Fs(gets\(\))e Ft(or)150 1605 y Fs(fgets\(\))p Ft(.)275 +1743 y(The)f(function)g Fs(readline\(\))e Ft(prin)m(ts)i(a)g(prompt)g +Fj(prompt)i Ft(and)e(then)g(reads)g(and)g(returns)f(a)i(single)150 +1852 y(line)g(of)g(text)h(from)e(the)h(user.)47 b(If)32 +b Fj(prompt)i Ft(is)e Fs(NULL)g Ft(or)h(the)f(empt)m(y)i(string,)f(no)g +(prompt)e(is)i(displa)m(y)m(ed.)150 1962 y(The)k(line)g +Fs(readline)e Ft(returns)h(is)h(allo)s(cated)i(with)e +Fs(malloc\(\))p Ft(;)h(the)f(caller)i(should)d Fs(free\(\))f +Ft(the)j(line)150 2072 y(when)29 b(it)i(has)f(\014nished)f(with)h(it.) +42 b(The)29 b(declaration)j(for)f Fs(readline)d Ft(in)i(ANSI)g(C)g(is) +390 2209 y Fs(char)47 b(*readline)e(\(const)h(char)h(*)p +Fl(prompt)p Fs(\);)150 2347 y Ft(So,)31 b(one)f(migh)m(t)h(sa)m(y)390 +2485 y Fs(char)47 b(*line)f(=)h(readline)f(\("Enter)g(a)h(line:)g("\);) +150 2623 y Ft(in)23 b(order)f(to)h(read)g(a)g(line)h(of)f(text)h(from)e +(the)h(user.)38 b(The)22 b(line)h(returned)f(has)g(the)h(\014nal)g +(newline)g(remo)m(v)m(ed,)150 2732 y(so)31 b(only)f(the)h(text)g +(remains.)275 2870 y(If)40 b Fs(readline)e Ft(encoun)m(ters)j(an)f +Fs(EOF)f Ft(while)i(reading)f(the)h(line,)j(and)39 b(the)i(line)g(is)f +(empt)m(y)h(at)g(that)150 2979 y(p)s(oin)m(t,)30 b(then)f +Fs(\(char)g(*\)NULL)e Ft(is)j(returned.)39 b(Otherwise,)30 +b(the)f(line)h(is)f(ended)g(just)g(as)g(if)h(a)f(newline)h(had)150 +3089 y(b)s(een)g(t)m(yp)s(ed.)275 3227 y(Readline)22 +b(p)s(erforms)e(some)j(expansion)e(on)h(the)g Fj(prompt)h +Ft(b)s(efore)f(it)g(is)g(displa)m(y)m(ed)h(on)f(the)g(screen.)38 +b(See)150 3336 y(the)27 b(description)g(of)h Fs(rl_expand_prompt)22 +b Ft(\(see)28 b(Section)g(2.4.6)h([Redispla)m(y],)g(page)f(40\))g(for)f +(additional)150 3446 y(details,)41 b(esp)s(ecially)f(if)e +Fj(prompt)i Ft(will)e(con)m(tain)i(c)m(haracters)f(that)g(do)f(not)h +(consume)f(ph)m(ysical)h(screen)150 3556 y(space)31 b(when)e(displa)m +(y)m(ed.)275 3693 y(If)d(y)m(ou)h(w)m(an)m(t)h(the)f(user)g(to)g(b)s(e) +g(able)g(to)h(get)g(at)g(the)f(line)g(later,)i(\(with)e +Fs(C-p)f Ft(for)h(example\),)i(y)m(ou)e(m)m(ust)150 3803 +y(call)32 b Fs(add_history\(\))26 b Ft(to)32 b(sa)m(v)m(e)f(the)g(line) +g(a)m(w)m(a)m(y)h(in)e(a)h Fj(history)38 b Ft(list)31 +b(of)g(suc)m(h)f(lines.)390 3941 y Fs(add_history)45 +b(\(line\);)150 4078 y Ft(F)-8 b(or)31 b(full)f(details)i(on)e(the)g +(GNU)h(History)g(Library)-8 b(,)31 b(see)g(the)f(asso)s(ciated)i(man)m +(ual.)275 4216 y(It)f(is)g(preferable)g(to)i(a)m(v)m(oid)f(sa)m(ving)h +(empt)m(y)e(lines)h(on)f(the)h(history)f(list,)h(since)g(users)e +(rarely)i(ha)m(v)m(e)h(a)150 4326 y(burning)28 b(need)h(to)i(reuse)e(a) +h(blank)g(line.)40 b(Here)31 b(is)e(a)h(function)g(whic)m(h)f(usefully) +g(replaces)i(the)f(standard)150 4435 y Fs(gets\(\))f +Ft(library)h(function,)g(and)g(has)g(the)g(adv)-5 b(an)m(tage)33 +b(of)d(no)g(static)i(bu\013er)e(to)h(o)m(v)m(er\015o)m(w:)390 +4573 y Fs(/*)47 b(A)h(static)e(variable)f(for)i(holding)f(the)h(line.)f +(*/)390 4682 y(static)g(char)h(*line_read)e(=)i(\(char)g(*\)NULL;)390 +4902 y(/*)g(Read)g(a)g(string,)f(and)h(return)f(a)i(pointer)d(to)j(it.) +533 5011 y(Returns)e(NULL)h(on)g(EOF.)f(*/)390 5121 y(char)h(*)390 +5230 y(rl_gets)f(\(\))390 5340 y({)p eop end +%%Page: 27 31 +TeXDict begin 27 30 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(27)485 +299 y Fs(/*)48 b(If)f(the)g(buffer)f(has)h(already)f(been)g(allocated,) +629 408 y(return)g(the)h(memory)f(to)h(the)g(free)f(pool.)h(*/)485 +518 y(if)h(\(line_read\))581 628 y({)676 737 y(free)f(\(line_read\);) +676 847 y(line_read)f(=)h(\(char)f(*\)NULL;)581 956 y(})485 +1176 y(/*)i(Get)f(a)g(line)g(from)f(the)h(user.)g(*/)485 +1285 y(line_read)f(=)h(readline)f(\(""\);)485 1504 y(/*)i(If)f(the)g +(line)f(has)h(any)g(text)g(in)g(it,)629 1614 y(save)f(it)h(on)h(the)f +(history.)e(*/)485 1724 y(if)j(\(line_read)d(&&)i(*line_read\))581 +1833 y(add_history)e(\(line_read\);)485 2052 y(return)i(\(line_read\);) +390 2162 y(})275 2303 y Ft(This)27 b(function)h(giv)m(es)h(the)f(user)g +(the)g(default)g(b)s(eha)m(viour)g(of)g Fs(TAB)g Ft(completion:)40 +b(completion)30 b(on)e(\014le)150 2412 y(names.)41 b(If)31 +b(y)m(ou)g(do)f(not)h(w)m(an)m(t)g(Readline)h(to)f(complete)h(on)f +(\014lenames,)g(y)m(ou)g(can)f(c)m(hange)i(the)f(binding)150 +2522 y(of)g(the)f Fs(TAB)g Ft(k)m(ey)h(with)f Fs(rl_bind_key\(\))p +Ft(.)390 2662 y Fs(int)47 b(rl_bind_key)e(\(int)h Fl(key)p +Fs(,)h(rl_command_func_t)c(*)p Fl(function)p Fs(\);)275 +2803 y(rl_bind_key\(\))29 b Ft(tak)m(es)35 b(t)m(w)m(o)g(argumen)m(ts:) +47 b Fj(k)m(ey)c Ft(is)33 b(the)h(c)m(haracter)h(that)f(y)m(ou)g(w)m +(an)m(t)g(to)g(bind,)g(and)150 2912 y Fj(function)39 +b Ft(is)f(the)h(address)f(of)h(the)g(function)g(to)g(call)i(when)c +Fj(k)m(ey)48 b Ft(is)39 b(pressed.)65 b(Binding)38 b +Fs(TAB)g Ft(to)i Fs(rl_)150 3022 y(insert\(\))c Ft(mak)m(es)k +Fs(TAB)e Ft(insert)g(itself.)67 b Fs(rl_bind_key\(\))35 +b Ft(returns)j(non-zero)h(if)g Fj(k)m(ey)47 b Ft(is)39 +b(not)g(a)g(v)-5 b(alid)150 3132 y(ASCI)s(I)29 b(c)m(haracter)j(co)s +(de)e(\(b)s(et)m(w)m(een)i(0)f(and)e(255\).)275 3272 +y(Th)m(us,)g(to)i(disable)g(the)f(default)h Fs(TAB)e +Ft(b)s(eha)m(vior,)i(the)g(follo)m(wing)g(su\016ces:)390 +3413 y Fs(rl_bind_key)45 b(\('\\t',)h(rl_insert\);)275 +3554 y Ft(This)25 b(co)s(de)i(should)e(b)s(e)h(executed)h(once)g(at)g +(the)g(start)g(of)f(y)m(our)h(program;)g(y)m(ou)g(migh)m(t)g(write)g(a) +g(func-)150 3663 y(tion)33 b(called)h Fs(initialize_readline\(\))27 +b Ft(whic)m(h)33 b(p)s(erforms)e(this)h(and)h(other)g(desired)f +(initializations,)150 3773 y(suc)m(h)e(as)h(installing)g(custom)g +(completers)g(\(see)g(Section)h(2.6)f([Custom)f(Completers],)h(page)g +(53\).)150 4023 y Fr(2.2)68 b(Custom)45 b(F)-11 b(unctions)150 +4182 y Ft(Readline)28 b(pro)m(vides)f(man)m(y)g(functions)g(for)g +(manipulating)h(the)f(text)h(of)g(the)f(line,)i(but)d(it)i(isn't)f(p)s +(ossible)150 4292 y(to)37 b(an)m(ticipate)i(the)e(needs)f(of)h(all)g +(programs.)59 b(This)36 b(section)h(describ)s(es)f(the)h(v)-5 +b(arious)36 b(functions)h(and)150 4401 y(v)-5 b(ariables)27 +b(de\014ned)e(within)g(the)h(Readline)h(library)f(whic)m(h)g(allo)m(w)h +(a)g(user)e(program)h(to)h(add)e(customized)150 4511 +y(functionalit)m(y)32 b(to)f(Readline.)275 4651 y(Before)37 +b(declaring)g(an)m(y)g(functions)f(that)h(customize)h(Readline's)f(b)s +(eha)m(vior,)h(or)f(using)f(an)m(y)h(func-)150 4761 y(tionalit)m(y)48 +b(Readline)e(pro)m(vides)f(in)g(other)h(co)s(de,)k(an)45 +b(application)i(writer)e(should)g(include)g(the)h(\014le)150 +4871 y Fs()28 b Ft(in)33 b(an)m(y)h(\014le)f(that) +h(uses)f(Readline's)h(features.)51 b(Since)33 b(some)h(of)g(the)f +(de\014-)150 4980 y(nitions)e(in)g Fs(readline.h)d Ft(use)j(the)h +Fs(stdio)d Ft(library)-8 b(,)32 b(the)f(\014le)h Fs()c +Ft(should)i(b)s(e)h(included)f(b)s(efore)150 5090 y Fs(readline.h)p +Ft(.)275 5230 y Fs(readline.h)d Ft(de\014nes)j(a)h(C)f(prepro)s(cessor) +g(v)-5 b(ariable)31 b(that)g(should)f(b)s(e)g(treated)h(as)g(an)g(in)m +(teger,)h Fs(RL_)150 5340 y(READLINE_VERSION)p Ft(,)20 +b(whic)m(h)h(ma)m(y)i(b)s(e)f(used)f(to)i(conditionally)h(compile)f +(application)g(co)s(de)f(dep)s(ending)p eop end +%%Page: 28 32 +TeXDict begin 28 31 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(28)150 +299 y(on)35 b(the)g(installed)h(Readline)f(v)m(ersion.)56 +b(The)34 b(v)-5 b(alue)35 b(is)h(a)f(hexadecimal)h(enco)s(ding)f(of)g +(the)h(ma)5 b(jor)35 b(and)150 408 y(minor)f(v)m(ersion)g(n)m(um)m(b)s +(ers)f(of)h(the)h(library)-8 b(,)35 b(of)f(the)h(form)e(0x)p +Fj(MMmm)p Ft(.)53 b Fj(MM)45 b Ft(is)34 b(the)g(t)m(w)m(o-digit)j(ma)5 +b(jor)150 518 y(v)m(ersion)29 b(n)m(um)m(b)s(er;)g Fj(mm)f +Ft(is)h(the)g(t)m(w)m(o-digit)j(minor)c(v)m(ersion)i(n)m(um)m(b)s(er.) +38 b(F)-8 b(or)30 b(Readline)g(4.2,)g(for)f(example,)150 +628 y(the)i(v)-5 b(alue)30 b(of)h Fs(RL_READLINE_VERSION)25 +b Ft(w)m(ould)30 b(b)s(e)g Fs(0x0402)p Ft(.)150 837 y +Fi(2.2.1)63 b(Readline)40 b(T)m(yp)s(edefs)150 984 y +Ft(F)-8 b(or)31 b(readabilit)m(y)-8 b(,)33 b(w)m(e)d(declare)i(a)f(n)m +(um)m(b)s(er)e(of)h(new)g(ob)5 b(ject)31 b(t)m(yp)s(es,)g(all)g(p)s +(oin)m(ters)f(to)i(functions.)275 1128 y(The)j(reason)h(for)f +(declaring)h(these)h(new)e(t)m(yp)s(es)g(is)h(to)h(mak)m(e)f(it)g +(easier)h(to)f(write)g(co)s(de)g(describing)150 1238 +y(p)s(oin)m(ters)30 b(to)h(C)f(functions)g(with)g(appropriately)h +(protot)m(yp)s(ed)f(argumen)m(ts)h(and)f(return)f(v)-5 +b(alues.)275 1382 y(F)d(or)37 b(instance,)j(sa)m(y)d(w)m(e)g(w)m(an)m +(t)h(to)g(declare)f(a)h(v)-5 b(ariable)37 b Fj(func)42 +b Ft(as)37 b(a)g(p)s(oin)m(ter)g(to)g(a)h(function)e(whic)m(h)150 +1492 y(tak)m(es)27 b(t)m(w)m(o)g Fs(int)e Ft(argumen)m(ts)h(and)f +(returns)f(an)i Fs(int)f Ft(\(this)h(is)f(the)h(t)m(yp)s(e)g(of)g(all)h +(of)e(the)h(Readline)h(bindable)150 1601 y(functions\).)41 +b(Instead)30 b(of)g(the)h(classic)h(C)e(declaration)275 +1746 y Fs(int)f(\(*func\)\(\);)150 1890 y Ft(or)h(the)h(ANSI-C)f(st)m +(yle)i(declaration)275 2035 y Fs(int)d(\(*func\)\(int,)e(int\);)150 +2179 y Ft(w)m(e)k(ma)m(y)g(write)275 2324 y Fs(rl_command_func_t)25 +b(*func;)275 2468 y Ft(The)k(full)h(list)i(of)e(function)g(p)s(oin)m +(ter)g(t)m(yp)s(es)h(a)m(v)-5 b(ailable)33 b(is)150 2643 +y Fs(typedef)28 b(int)i(rl_command_func_t)c(\(int,)i(int\);)150 +2752 y(typedef)g(char)i(*rl_compentry_func_t)24 b(\(const)29 +b(char)g(*,)h(int\);)150 2862 y(typedef)e(char)i +(**rl_completion_func_t)24 b(\(const)29 b(char)g(*,)h(int,)f(int\);)150 +2971 y(typedef)f(char)i(*rl_quote_func_t)c(\(char)i(*,)i(int,)f(char)h +(*\);)150 3081 y(typedef)e(char)i(*rl_dequote_func_t)25 +b(\(char)k(*,)h(int\);)150 3191 y(typedef)e(int)i(rl_compignore_func_t) +25 b(\(char)k(**\);)150 3300 y(typedef)f(void)i(rl_compdisp_func_t)25 +b(\(char)k(**,)g(int,)h(int\);)150 3410 y(typedef)e(int)i +(rl_hook_func_t)c(\(void\);)150 3519 y(typedef)i(int)i(rl_getc_func_t)c +(\(FILE)j(*\);)150 3629 y(typedef)f(int)i(rl_linebuf_func_t)c(\(char)i +(*,)i(int\);)150 3738 y(typedef)e(int)i(rl_intfunc_t)d(\(int\);)150 +3848 y(#define)h(rl_ivoidfunc_t)f(rl_hook_func_t)150 +3958 y(typedef)h(int)i(rl_icpfunc_t)d(\(char)i(*\);)150 +4067 y(typedef)f(int)i(rl_icppfunc_t)d(\(char)i(**\);)150 +4177 y(typedef)f(void)i(rl_voidfunc_t)c(\(void\);)150 +4286 y(typedef)i(void)i(rl_vintfunc_t)c(\(int\);)150 +4396 y(typedef)i(void)i(rl_vcpfunc_t)d(\(char)i(*\);)150 +4506 y(typedef)f(void)i(rl_vcppfunc_t)c(\(char)j(**\);)150 +4685 y Fi(2.2.2)63 b(W)-10 b(riting)41 b(a)f(New)h(F)-10 +b(unction)150 4832 y Ft(In)30 b(order)h(to)h(write)f(new)g(functions)f +(for)h(Readline,)h(y)m(ou)g(need)e(to)i(kno)m(w)f(the)g(calling)i(con)m +(v)m(en)m(tions)g(for)150 4941 y(k)m(eyb)s(oard-in)m(v)m(ok)m(ed)f +(functions,)d(and)h(the)g(names)g(of)g(the)g(v)-5 b(ariables)31 +b(that)f(describ)s(e)g(the)g(curren)m(t)g(state)150 5051 +y(of)h(the)f(line)h(read)f(so)h(far.)275 5196 y(The)e(calling)j +(sequence)f(for)f(a)h(command)f Fs(foo)g Ft(lo)s(oks)g(lik)m(e)390 +5340 y Fs(int)47 b(foo)g(\(int)f(count,)h(int)f(key\))p +eop end +%%Page: 29 33 +TeXDict begin 29 32 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(29)150 +299 y(where)35 b Fj(coun)m(t)k Ft(is)d(the)g(n)m(umeric)g(argumen)m(t)g +(\(or)g(1)g(if)g(defaulted\))h(and)e Fj(k)m(ey)44 b Ft(is)36 +b(the)g(k)m(ey)h(that)f(in)m(v)m(ok)m(ed)150 408 y(this)30 +b(function.)275 541 y(It)23 b(is)g(completely)h(up)e(to)i(the)f +(function)g(as)g(to)h(what)f(should)f(b)s(e)h(done)f(with)h(the)g(n)m +(umeric)g(argumen)m(t.)150 650 y(Some)40 b(functions)g(use)f(it)i(as)f +(a)g(rep)s(eat)h(coun)m(t,)i(some)d(as)h(a)f(\015ag,)j(and)c(others)h +(to)h(c)m(ho)s(ose)g(alternate)150 760 y(b)s(eha)m(vior)i(\(refreshing) +g(the)h(curren)m(t)f(line)h(as)f(opp)s(osed)g(to)h(refreshing)e(the)i +(screen,)j(for)c(example\).)150 870 y(Some)33 b(c)m(ho)s(ose)h(to)g +(ignore)g(it.)50 b(In)32 b(general,)j(if)f(a)f(function)g(uses)g(the)g +(n)m(umeric)g(argumen)m(t)h(as)f(a)h(rep)s(eat)150 979 +y(coun)m(t,)29 b(it)g(should)e(b)s(e)g(able)h(to)h(do)f(something)g +(useful)f(with)h(b)s(oth)f(negativ)m(e)j(and)d(p)s(ositiv)m(e)i +(argumen)m(ts.)150 1089 y(A)m(t)i(the)g(v)m(ery)g(least,)h(it)e(should) +g(b)s(e)g(a)m(w)m(are)h(that)g(it)g(can)g(b)s(e)f(passed)g(a)g(negativ) +m(e)j(argumen)m(t.)275 1221 y(A)38 b(command)f(function)h(should)f +(return)g(0)h(if)g(its)h(action)g(completes)g(successfully)-8 +b(,)41 b(and)c(a)h(v)-5 b(alue)150 1331 y(greater)34 +b(than)f(zero)g(if)g(some)h(error)e(o)s(ccurs.)48 b(This)32 +b(is)h(the)g(con)m(v)m(en)m(tion)i(ob)s(ey)m(ed)f(b)m(y)e(all)i(of)f +(the)g(builtin)150 1440 y(Readline)e(bindable)f(command)g(functions.) +150 1677 y Fr(2.3)68 b(Readline)47 b(V)-11 b(ariables)150 +1836 y Ft(These)30 b(v)-5 b(ariables)31 b(are)g(a)m(v)-5 +b(ailable)33 b(to)e(function)f(writers.)3371 2014 y([V)-8 +b(ariable])-3598 b Fh(char)54 b(*)e(rl_line_buffer)390 +2123 y Ft(This)30 b(is)i(the)f(line)g(gathered)h(so)f(far.)43 +b(Y)-8 b(ou)32 b(are)f(w)m(elcome)i(to)f(mo)s(dify)f(the)g(con)m(ten)m +(ts)i(of)e(the)g(line,)390 2233 y(but)k(see)h(Section)g(2.4.5)h([Allo)m +(wing)h(Undoing],)f(page)f(39.)57 b(The)35 b(function)g +Fs(rl_extend_line_)390 2342 y(buffer)29 b Ft(is)h(a)m(v)-5 +b(ailable)33 b(to)e(increase)g(the)g(memory)f(allo)s(cated)i(to)f +Fs(rl_line_buffer)p Ft(.)3371 2520 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_point)390 2630 y Ft(The)30 b(o\013set)h(of)g(the)f +(curren)m(t)h(cursor)e(p)s(osition)i(in)f Fs(rl_line_buffer)c +Ft(\(the)31 b Fk(p)-5 b(oint)9 b Ft(\).)3371 2808 y([V)-8 +b(ariable])-3598 b Fh(int)53 b(rl_end)390 2917 y Ft(The)27 +b(n)m(um)m(b)s(er)g(of)h(c)m(haracters)h(presen)m(t)f(in)g +Fs(rl_line_buffer)p Ft(.)36 b(When)27 b Fs(rl_point)f +Ft(is)i(at)h(the)f(end)390 3027 y(of)j(the)f(line,)h +Fs(rl_point)d Ft(and)i Fs(rl_end)f Ft(are)h(equal.)3371 +3204 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_mark)390 +3314 y Ft(The)36 b Fj(mark)42 b Ft(\(sa)m(v)m(ed)d(p)s(osition\))e(in)g +(the)g(curren)m(t)f(line.)61 b(If)36 b(set,)k(the)d(mark)f(and)h(p)s +(oin)m(t)f(de\014ne)h(a)390 3424 y Fk(r)-5 b(e)g(gion)p +Ft(.)3371 3601 y([V)d(ariable])-3598 b Fh(int)53 b(rl_done)390 +3711 y Ft(Setting)22 b(this)g(to)g(a)g(non-zero)g(v)-5 +b(alue)23 b(causes)f(Readline)g(to)g(return)f(the)h(curren)m(t)f(line)h +(immediately)-8 b(.)390 3820 y(Readline)26 b(will)f(set)h(this)f(v)-5 +b(ariable)26 b(when)e(it)i(has)f(read)g(a)g(k)m(ey)h(sequence)g(b)s +(ound)d(to)j Fs(accept-line)390 3930 y Ft(and)k(is)g(ab)s(out)g(to)h +(return)f(the)g(line)h(to)g(the)g(caller.)3371 4108 y([V)-8 +b(ariable])-3598 b Fh(int)53 b(rl_eof_found)390 4217 +y Ft(Readline)28 b(will)g(set)g(this)f(v)-5 b(ariable)28 +b(when)e(it)i(has)f(read)g(an)h(EOF)f(c)m(haracter)i(\(e.g.,)h(the)d +(stt)m(y)h(`)p Fs(EOF)p Ft(')390 4327 y(c)m(haracter\))42 +b(on)e(an)f(empt)m(y)i(line)f(or)g(encoun)m(tered)g(a)g(read)g(error)f +(and)h(is)g(ab)s(out)f(to)i(return)e(a)390 4437 y(NULL)30 +b(line)h(to)g(the)g(caller.)3371 4614 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_num_chars_to_read)390 4724 y Ft(Setting)34 +b(this)e(to)i(a)f(p)s(ositiv)m(e)h(v)-5 b(alue)34 b(b)s(efore)e +(calling)i Fs(readline\(\))d Ft(causes)i(Readline)g(to)h(return)390 +4833 y(after)i(accepting)h(that)g(man)m(y)e(c)m(haracters,)k(rather)d +(than)f(reading)h(up)e(to)j(a)f(c)m(haracter)h(b)s(ound)390 +4943 y(to)31 b Fs(accept-line)p Ft(.)3371 5121 y([V)-8 +b(ariable])-3598 b Fh(int)53 b(rl_pending_input)390 5230 +y Ft(Setting)26 b(this)f(to)h(a)f(v)-5 b(alue)26 b(mak)m(es)g(it)g(the) +f(next)g(k)m(eystrok)m(e)i(read.)39 b(This)24 b(is)i(a)f(w)m(a)m(y)h +(to)g(stu\013)f(a)g(single)390 5340 y(c)m(haracter)32 +b(in)m(to)f(the)g(input)e(stream.)p eop end +%%Page: 30 34 +TeXDict begin 30 33 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(30)3371 +299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_dispatching)390 +408 y Ft(Set)24 b(to)h(a)g(non-zero)g(v)-5 b(alue)24 +b(if)h(a)f(function)g(is)g(b)s(eing)g(called)i(from)d(a)i(k)m(ey)g +(binding;)g(zero)g(otherwise.)390 518 y(Application)37 +b(functions)e(can)h(test)h(this)e(to)i(disco)m(v)m(er)g(whether)e(they) +h(w)m(ere)g(called)h(directly)f(or)390 628 y(b)m(y)30 +b(Readline's)h(dispatc)m(hing)g(mec)m(hanism.)3371 835 +y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_erase_empty_line)390 +944 y Ft(Setting)47 b(this)e(to)i(a)f(non-zero)h(v)-5 +b(alue)46 b(causes)h(Readline)f(to)h(completely)g(erase)g(the)f(curren) +m(t)390 1054 y(line,)f(including)c(an)m(y)g(prompt,)j(an)m(y)d(time)h +(a)g(newline)f(is)h(t)m(yp)s(ed)f(as)g(the)h(only)f(c)m(haracter)i(on) +390 1163 y(an)36 b(otherwise-empt)m(y)i(line.)58 b(The)36 +b(cursor)g(is)g(mo)m(v)m(ed)h(to)g(the)g(b)s(eginning)e(of)i(the)f +(newly-blank)390 1273 y(line.)3371 1480 y([V)-8 b(ariable])-3598 +b Fh(char)54 b(*)e(rl_prompt)390 1590 y Ft(The)26 b(prompt)f(Readline)i +(uses.)38 b(This)26 b(is)g(set)h(from)e(the)i(argumen)m(t)f(to)h +Fs(readline\(\))p Ft(,)d(and)i(should)390 1699 y(not)h(b)s(e)f +(assigned)h(to)h(directly)-8 b(.)41 b(The)26 b Fs(rl_set_prompt\(\))d +Ft(function)j(\(see)i(Section)g(2.4.6)h([Redis-)390 1809 +y(pla)m(y],)i(page)h(40\))f(ma)m(y)g(b)s(e)f(used)f(to)j(mo)s(dify)d +(the)i(prompt)e(string)h(after)h(calling)h Fs(readline\(\))p +Ft(.)3371 2016 y([V)-8 b(ariable])-3598 b Fh(char)54 +b(*)e(rl_display_prompt)390 2125 y Ft(The)31 b(string)h(displa)m(y)m +(ed)g(as)g(the)g(prompt.)44 b(This)31 b(is)h(usually)f(iden)m(tical)j +(to)e Fj(rl)p 3031 2125 28 4 v 40 w(prompt)p Ft(,)f(but)g(ma)m(y)390 +2235 y(b)s(e)j(c)m(hanged)g(temp)s(orarily)h(b)m(y)f(functions)g(that)g +(use)g(the)h(prompt)e(string)h(as)h(a)f(message)i(area,)390 +2345 y(suc)m(h)30 b(as)h(incremen)m(tal)g(searc)m(h.)3371 +2552 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_already_prompted)390 +2661 y Ft(If)36 b(an)g(application)i(wishes)d(to)i(displa)m(y)g(the)f +(prompt)g(itself,)i(rather)f(than)f(ha)m(v)m(e)h(Readline)g(do)390 +2771 y(it)c(the)g(\014rst)f(time)i Fs(readline\(\))c +Ft(is)i(called,)j(it)e(should)f(set)h(this)g(v)-5 b(ariable)34 +b(to)f(a)g(non-zero)g(v)-5 b(alue)390 2880 y(after)38 +b(displa)m(ying)h(the)f(prompt.)63 b(The)37 b(prompt)g(m)m(ust)h(also)h +(b)s(e)e(passed)g(as)i(the)f(argumen)m(t)g(to)390 2990 +y Fs(readline\(\))30 b Ft(so)j(the)h(redispla)m(y)f(functions)f(can)i +(up)s(date)e(the)h(displa)m(y)g(prop)s(erly)-8 b(.)48 +b(The)32 b(calling)390 3099 y(application)g(is)e(resp)s(onsible)g(for)g +(managing)h(the)f(v)-5 b(alue;)31 b(Readline)g(nev)m(er)g(sets)g(it.) +3371 3306 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_library_version)390 3416 y Ft(The)30 b(v)m(ersion)h(n)m(um)m(b)s +(er)e(of)h(this)h(revision)f(of)h(the)f(library)-8 b(.)3371 +3623 y([V)g(ariable])-3598 b Fh(int)53 b(rl_readline_version)390 +3733 y Ft(An)34 b(in)m(teger)h(enco)s(ding)f(the)g(curren)m(t)g(v)m +(ersion)h(of)f(the)g(library)-8 b(.)52 b(The)34 b(enco)s(ding)g(is)g +(of)g(the)g(form)390 3842 y(0x)p Fj(MMmm)p Ft(,)39 b(where)d +Fj(MM)47 b Ft(is)36 b(the)h(t)m(w)m(o-digit)i(ma)5 b(jor)36 +b(v)m(ersion)h(n)m(um)m(b)s(er,)g(and)f Fj(mm)g Ft(is)h(the)f(t)m(w)m +(o-)390 3952 y(digit)i(minor)f(v)m(ersion)h(n)m(um)m(b)s(er.)60 +b(F)-8 b(or)38 b(example,)i(for)d(Readline-4.2,)k Fs +(rl_readline_version)390 4061 y Ft(w)m(ould)30 b(ha)m(v)m(e)i(the)e(v) +-5 b(alue)31 b(0x0402.)3371 4268 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_gnu_readline_p)390 4378 y Ft(Alw)m(a)m(ys)32 +b(set)f(to)g(1,)g(denoting)f(that)h(this)g(is)f Fm(gnu)g +Ft(Readline)h(rather)f(than)h(some)f(em)m(ulation.)3371 +4585 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_terminal_name)390 4695 y Ft(The)28 b(terminal)g(t)m(yp)s(e,)h(used) +e(for)h(initialization.)43 b(If)28 b(not)g(set)h(b)m(y)e(the)i +(application,)h(Readline)f(sets)390 4804 y(this)h(to)h(the)g(v)-5 +b(alue)31 b(of)f(the)h Fs(TERM)e Ft(en)m(vironmen)m(t)i(v)-5 +b(ariable)31 b(the)g(\014rst)e(time)j(it)e(is)h(called.)3371 +5011 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_readline_name)390 5121 y Ft(This)30 b(v)-5 b(ariable)32 +b(is)g(set)f(to)h(a)g(unique)e(name)h(b)m(y)g(eac)m(h)i(application)f +(using)f(Readline.)44 b(The)30 b(v)-5 b(alue)390 5230 +y(allo)m(ws)29 b(conditional)h(parsing)d(of)h(the)h(inputrc)e(\014le)h +(\(see)h(Section)g(1.3.2)g([Conditional)g(Init)f(Con-)390 +5340 y(structs],)j(page)g(13\).)p eop end +%%Page: 31 35 +TeXDict begin 31 34 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(31)3371 +299 y([V)-8 b(ariable])-3598 b Fh(FILE)54 b(*)e(rl_instream)390 +408 y Ft(The)40 b(stdio)i(stream)f(from)g(whic)m(h)f(Readline)i(reads)f +(input.)71 b(If)41 b Fs(NULL)p Ft(,)i(Readline)e(defaults)g(to)390 +518 y Fj(stdin)p Ft(.)3371 704 y([V)-8 b(ariable])-3598 +b Fh(FILE)54 b(*)e(rl_outstream)390 814 y Ft(The)34 b(stdio)h(stream)f +(to)i(whic)m(h)e(Readline)h(p)s(erforms)e(output.)52 +b(If)34 b Fs(NULL)p Ft(,)h(Readline)g(defaults)f(to)390 +924 y Fj(stdout)p Ft(.)3371 1110 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_prefer_env_winsize)390 1219 y Ft(If)28 +b(non-zero,)h(Readline)g(giv)m(es)h(v)-5 b(alues)29 b(found)e(in)h(the) +g Fs(LINES)f Ft(and)h Fs(COLUMNS)e Ft(en)m(vironmen)m(t)j(v)-5 +b(ari-)390 1329 y(ables)41 b(greater)h(precedence)g(than)e(v)-5 +b(alues)41 b(fetc)m(hed)h(from)e(the)h(k)m(ernel)h(when)e(computing)h +(the)390 1439 y(screen)30 b(dimensions.)3371 1625 y([V)-8 +b(ariable])-3598 b Fh(rl_command_func_t)57 b(*)c(rl_last_func)390 +1734 y Ft(The)34 b(address)g(of)h(the)g(last)h(command)e(function)g +(Readline)i(executed.)55 b(Ma)m(y)35 b(b)s(e)g(used)f(to)h(test)390 +1844 y(whether)30 b(or)g(not)h(a)f(function)h(is)f(b)s(eing)g(executed) +h(t)m(wice)h(in)e(succession,)h(for)f(example.)3371 2030 +y([V)-8 b(ariable])-3598 b Fh(rl_hook_func_t)57 b(*)52 +b(rl_startup_hook)390 2140 y Ft(If)34 b(non-zero,)i(this)e(is)h(the)f +(address)f(of)i(a)g(function)f(to)h(call)g(just)f(b)s(efore)g +Fs(readline)e Ft(prin)m(ts)i(the)390 2250 y(\014rst)c(prompt.)3371 +2436 y([V)-8 b(ariable])-3598 b Fh(rl_hook_func_t)57 +b(*)52 b(rl_pre_input_hook)390 2545 y Ft(If)35 b(non-zero,)j(this)d(is) +g(the)h(address)f(of)g(a)h(function)f(to)i(call)f(after)g(the)g +(\014rst)f(prompt)f(has)i(b)s(een)390 2655 y(prin)m(ted)30 +b(and)g(just)f(b)s(efore)h Fs(readline)f Ft(starts)h(reading)h(input)e +(c)m(haracters.)3371 2841 y([V)-8 b(ariable])-3598 b +Fh(rl_hook_func_t)57 b(*)52 b(rl_event_hook)390 2951 +y Ft(If)40 b(non-zero,)k(this)d(is)f(the)h(address)f(of)h(a)g(function) +f(to)h(call)h(p)s(erio)s(dically)f(when)f(Readline)h(is)390 +3061 y(w)m(aiting)30 b(for)f(terminal)h(input.)39 b(By)30 +b(default,)g(this)f(will)g(b)s(e)g(called)h(at)g(most)f(ten)h(times)f +(a)h(second)390 3170 y(if)g(there)h(is)f(no)h(k)m(eyb)s(oard)f(input.) +3371 3356 y([V)-8 b(ariable])-3598 b Fh(rl_getc_func_t)57 +b(*)52 b(rl_getc_function)390 3466 y Ft(If)30 b(non-zero,)h(Readline)g +(will)g(call)h(indirectly)e(through)g(this)h(p)s(oin)m(ter)f(to)h(get)h +(a)e(c)m(haracter)i(from)390 3576 y(the)21 b(input)g(stream.)38 +b(By)21 b(default,)j(it)e(is)f(set)h(to)g Fs(rl_getc)p +Ft(,)f(the)h(default)f(Readline)h(c)m(haracter)h(input)390 +3685 y(function)f(\(see)i(Section)g(2.4.8)g([Character)g(Input],)f +(page)h(42\).)39 b(In)22 b(general,)k(an)c(application)i(that)390 +3795 y(sets)31 b Fj(rl)p 635 3795 28 4 v 40 w(getc)p +835 3795 V 41 w(function)f Ft(should)g(consider)g(setting)h +Fj(rl)p 2234 3795 V 40 w(input)p 2487 3795 V 39 w(a)m(v)-5 +b(ailable)p 2867 3795 V 43 w(ho)s(ok)36 b Ft(as)30 b(w)m(ell.)3371 +3981 y([V)-8 b(ariable])-3598 b Fh(rl_hook_func_t)57 +b(*)52 b(rl_signal_event_hook)390 4091 y Ft(If)27 b(non-zero,)h(this)f +(is)g(the)g(address)f(of)i(a)f(function)g(to)g(call)i(if)e(a)g(read)g +(system)g(call)h(is)g(in)m(terrupted)390 4200 y(when)h(Readline)i(is)g +(reading)f(terminal)h(input.)3371 4387 y([V)-8 b(ariable])-3598 +b Fh(rl_hook_func_t)57 b(*)52 b(rl_timeout_event_hook)390 +4496 y Ft(If)25 b(non-zero,)i(this)e(is)g(the)h(address)e(of)h(a)h +(function)f(to)h(call)g(if)g(Readline)f(times)h(out)g(while)f(reading) +390 4606 y(input.)3371 4792 y([V)-8 b(ariable])-3598 +b Fh(rl_hook_func_t)57 b(*)52 b(rl_input_available_ho)q(ok)390 +4902 y Ft(If)28 b(non-zero,)j(Readline)e(will)g(use)g(this)g +(function's)g(return)f(v)-5 b(alue)29 b(when)f(it)i(needs)e(to)i +(determine)390 5011 y(whether)42 b(or)g(not)h(there)f(is)h(a)m(v)-5 +b(ailable)45 b(input)c(on)i(the)f(curren)m(t)g(input)g(source.)77 +b(The)42 b(default)390 5121 y(ho)s(ok)25 b(c)m(hec)m(ks)i +Fs(rl_instream)p Ft(;)d(if)i(an)f(application)i(is)e(using)g(a)h +(di\013eren)m(t)g(input)e(source,)j(it)f(should)390 5230 +y(set)34 b(the)f(ho)s(ok)h(appropriately)-8 b(.)50 b(Readline)34 +b(queries)f(for)h(a)m(v)-5 b(ailable)35 b(input)e(when)f(implemen)m +(ting)390 5340 y(in)m(tra-k)m(ey-sequence)f(timeouts)e(during)e(input)g +(and)h(incremen)m(tal)h(searc)m(hes.)41 b(This)27 b(ma)m(y)i(use)f(an)p +eop end +%%Page: 32 36 +TeXDict begin 32 35 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(32)390 +299 y(application-sp)s(eci\014c)22 b(timeout)g(b)s(efore)f(returning)f +(a)h(v)-5 b(alue;)25 b(Readline)c(uses)f(the)i(v)-5 b(alue)21 +b(passed)f(to)390 408 y Fs(rl_set_keyboard_input_ti)o(meou)o(t\(\))e +Ft(or)24 b(the)g(v)-5 b(alue)25 b(of)g(the)f(user-settable)i +Fj(k)m(eyseq-timeout)390 518 y Ft(v)-5 b(ariable.)48 +b(This)31 b(is)i(designed)f(for)g(use)g(b)m(y)g(applications)i(using)e +(Readline's)h(callbac)m(k)h(in)m(terface)390 628 y(\(see)d(Section)f +(2.4.12)i([Alternate)f(In)m(terface],)h(page)e(46\),)i(whic)m(h)d(ma)m +(y)h(not)g(use)g(the)g(traditional)390 737 y Fs(read\(2\))39 +b Ft(and)g(\014le)i(descriptor)f(in)m(terface,)45 b(or)c(other)f +(applications)i(using)e(a)h(di\013eren)m(t)g(input)390 +847 y(mec)m(hanism.)k(If)31 b(an)g(application)i(uses)e(an)h(input)e +(mec)m(hanism)i(or)g(ho)s(ok)f(that)h(can)g(p)s(oten)m(tially)390 +956 y(exceed)38 b(the)e(v)-5 b(alue)37 b(of)g Fj(k)m(eyseq-timeout)p +Ft(,)k(it)c(should)e(increase)j(the)e(timeout)i(or)f(set)g(this)f(ho)s +(ok)390 1066 y(appropriately)d(ev)m(en)g(when)e(not)h(using)g(the)h +(callbac)m(k)h(in)m(terface.)48 b(In)31 b(general,)j(an)f(application) +390 1176 y(that)e(sets)g Fj(rl)p 832 1176 28 4 v 40 w(getc)p +1032 1176 V 41 w(function)f Ft(should)g(consider)g(setting)h +Fj(rl)p 2431 1176 V 40 w(input)p 2684 1176 V 39 w(a)m(v)-5 +b(ailable)p 3064 1176 V 43 w(ho)s(ok)36 b Ft(as)30 b(w)m(ell.)3371 +1362 y([V)-8 b(ariable])-3598 b Fh(rl_voidfunc_t)56 b(*)d +(rl_redisplay_function)390 1471 y Ft(If)36 b(non-zero,)i(Readline)e +(will)h(call)g(indirectly)f(through)g(this)g(p)s(oin)m(ter)g(to)g(up)s +(date)g(the)g(displa)m(y)390 1581 y(with)27 b(the)g(curren)m(t)g(con)m +(ten)m(ts)h(of)f(the)h(editing)f(bu\013er.)39 b(By)27 +b(default,)h(it)g(is)f(set)g(to)h Fs(rl_redisplay)p Ft(,)390 +1691 y(the)j(default)f(Readline)h(redispla)m(y)g(function)f(\(see)h +(Section)g(2.4.6)h([Redispla)m(y],)g(page)f(40\).)3371 +1877 y([V)-8 b(ariable])-3598 b Fh(rl_vintfunc_t)56 b(*)d +(rl_prep_term_function)390 1987 y Ft(If)24 b(non-zero,)i(Readline)e +(will)h(call)g(indirectly)g(through)e(this)h(p)s(oin)m(ter)g(to)h +(initialize)h(the)e(terminal.)390 2096 y(The)37 b(function)f(tak)m(es)j +(a)e(single)h(argumen)m(t,)i(an)d Fs(int)f Ft(\015ag)h(that)h(sa)m(ys)g +(whether)e(or)h(not)g(to)h(use)390 2206 y(eigh)m(t-bit)e(c)m +(haracters.)53 b(By)35 b(default,)g(this)f(is)g(set)h(to)g +Fs(rl_prep_terminal)29 b Ft(\(see)35 b(Section)g(2.4.9)390 +2315 y([T)-8 b(erminal)31 b(Managemen)m(t],)i(page)e(43\).)3371 +2502 y([V)-8 b(ariable])-3598 b Fh(rl_voidfunc_t)56 b(*)d +(rl_deprep_term_functio)q(n)390 2611 y Ft(If)36 b(non-zero,)j(Readline) +e(will)g(call)h(indirectly)f(through)f(this)g(p)s(oin)m(ter)h(to)g +(reset)g(the)g(terminal.)390 2721 y(This)d(function)h(should)f(undo)g +(the)h(e\013ects)h(of)f Fs(rl_prep_term_function)p Ft(.)49 +b(By)35 b(default,)i(this)390 2830 y(is)30 b(set)h(to)g +Fs(rl_deprep_terminal)26 b Ft(\(see)31 b(Section)g(2.4.9)i([T)-8 +b(erminal)30 b(Managemen)m(t],)j(page)e(43\).)3371 3017 +y([V)-8 b(ariable])-3598 b Fh(Keymap)54 b(rl_executing_keymap)390 +3126 y Ft(This)35 b(v)-5 b(ariable)37 b(is)f(set)g(to)h(the)f(k)m +(eymap)h(\(see)g(Section)f(2.4.2)i([Keymaps],)g(page)e(35\))i(in)d +(whic)m(h)390 3236 y(the)c(curren)m(tly)f(executing)i(Readline)f +(function)f(w)m(as)g(found.)3371 3422 y([V)-8 b(ariable])-3598 +b Fh(Keymap)54 b(rl_binding_keymap)390 3532 y Ft(This)35 +b(v)-5 b(ariable)37 b(is)f(set)g(to)h(the)f(k)m(eymap)h(\(see)g +(Section)f(2.4.2)i([Keymaps],)g(page)e(35\))i(in)d(whic)m(h)390 +3641 y(the)c(last)g(k)m(ey)g(binding)e(o)s(ccurred.)3371 +3828 y([V)-8 b(ariable])-3598 b Fh(char)54 b(*)e(rl_executing_macro)390 +3937 y Ft(This)30 b(v)-5 b(ariable)31 b(is)f(set)h(to)g(the)g(text)g +(of)g(an)m(y)f(curren)m(tly-executing)i(macro.)3371 4124 +y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_executing_key)390 +4233 y Ft(The)30 b(k)m(ey)h(that)g(caused)f(the)h(dispatc)m(h)g(to)g +(the)f(curren)m(tly-executing)i(Readline)f(function.)3371 +4419 y([V)-8 b(ariable])-3598 b Fh(char)54 b(*)e(rl_executing_keyseq) +390 4529 y Ft(The)35 b(full)g(k)m(ey)h(sequence)g(that)g(caused)g(the)g +(dispatc)m(h)f(to)i(the)e(curren)m(tly-executing)i(Readline)390 +4639 y(function.)3371 4825 y([V)-8 b(ariable])-3598 b +Fh(int)53 b(rl_key_sequence_lengt)q(h)390 4934 y Ft(The)30 +b(n)m(um)m(b)s(er)f(of)h(c)m(haracters)i(in)e Fj(rl)p +1617 4934 V 40 w(executing)p 2032 4934 V 41 w(k)m(eyseq)p +Ft(.)3371 5121 y([V)-8 b(ariable])-3598 b Fh(int)53 b +(rl_readline_state)390 5230 y Ft(A)35 b(v)-5 b(ariable)35 +b(with)f(bit)g(v)-5 b(alues)35 b(that)g(encapsulate)h(the)e(curren)m(t) +h(Readline)g(state.)54 b(A)34 b(bit)h(is)f(set)390 5340 +y(with)k(the)g Fs(RL_SETSTATE)c Ft(macro,)41 b(and)c(unset)h(with)f +(the)h Fs(RL_UNSETSTATE)d Ft(macro.)63 b(Use)39 b(the)p +eop end +%%Page: 33 37 +TeXDict begin 33 36 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(33)390 +299 y Fs(RL_ISSTATE)34 b Ft(macro)k(to)g(test)g(whether)f(a)h +(particular)f(state)i(bit)e(is)g(set.)62 b(Curren)m(t)36 +b(state)j(bits)390 408 y(include:)390 561 y Fs(RL_STATE_NONE)870 +670 y Ft(Readline)31 b(has)f(not)h(y)m(et)g(b)s(een)f(called,)i(nor)e +(has)g(it)h(b)s(egun)e(to)i(initialize.)390 822 y Fs +(RL_STATE_INITIALIZING)870 932 y Ft(Readline)g(is)f(initializing)j(its) +e(in)m(ternal)g(data)g(structures.)390 1084 y Fs(RL_STATE_INITIALIZED) +870 1194 y Ft(Readline)g(has)f(completed)h(its)g(initialization.)390 +1346 y Fs(RL_STATE_TERMPREPPED)870 1456 y Ft(Readline)e(has)g(mo)s +(di\014ed)e(the)i(terminal)g(mo)s(des)f(to)i(do)e(its)i(o)m(wn)e(input) +g(and)g(redis-)870 1565 y(pla)m(y)-8 b(.)390 1717 y Fs +(RL_STATE_READCMD)870 1827 y Ft(Readline)31 b(is)f(reading)h(a)g +(command)f(from)g(the)g(k)m(eyb)s(oard.)390 1979 y Fs +(RL_STATE_METANEXT)870 2089 y Ft(Readline)h(is)f(reading)h(more)f +(input)g(after)h(reading)f(the)h(meta-pre\014x)f(c)m(haracter.)390 +2241 y Fs(RL_STATE_DISPATCHING)870 2351 y Ft(Readline)h(is)f(dispatc)m +(hing)h(to)g(a)g(command.)390 2503 y Fs(RL_STATE_MOREINPUT)870 +2612 y Ft(Readline)g(is)f(reading)h(more)f(input)g(while)g(executing)i +(an)e(editing)h(command.)390 2765 y Fs(RL_STATE_ISEARCH)870 +2874 y Ft(Readline)g(is)f(p)s(erforming)g(an)g(incremen)m(tal)i +(history)e(searc)m(h.)390 3026 y Fs(RL_STATE_NSEARCH)870 +3136 y Ft(Readline)h(is)f(p)s(erforming)g(a)g(non-incremen)m(tal)i +(history)e(searc)m(h.)390 3288 y Fs(RL_STATE_SEARCH)870 +3398 y Ft(Readline)21 b(is)f(searc)m(hing)i(bac)m(kw)m(ard)e(or)h(forw) +m(ard)e(through)h(the)h(history)f(for)g(a)h(string.)390 +3550 y Fs(RL_STATE_NUMERICARG)870 3660 y Ft(Readline)31 +b(is)f(reading)h(a)g(n)m(umeric)f(argumen)m(t.)390 3812 +y Fs(RL_STATE_MACROINPUT)870 3921 y Ft(Readline)25 b(is)f(curren)m(tly) +g(getting)i(its)f(input)e(from)h(a)g(previously-de\014ned)f(k)m(eyb)s +(oard)870 4031 y(macro.)390 4183 y Fs(RL_STATE_MACRODEF)870 +4293 y Ft(Readline)31 b(is)f(curren)m(tly)h(reading)f(c)m(haracters)i +(de\014ning)e(a)g(k)m(eyb)s(oard)h(macro.)390 4445 y +Fs(RL_STATE_OVERWRITE)870 4555 y Ft(Readline)g(is)f(in)g(o)m(v)m +(erwrite)i(mo)s(de.)390 4707 y Fs(RL_STATE_COMPLETING)870 +4816 y Ft(Readline)f(is)f(p)s(erforming)g(w)m(ord)g(completion.)390 +4969 y Fs(RL_STATE_SIGHANDLER)870 5078 y Ft(Readline)h(is)f(curren)m +(tly)h(executing)g(the)g(readline)g(signal)g(handler.)390 +5230 y Fs(RL_STATE_UNDOING)870 5340 y Ft(Readline)g(is)f(p)s(erforming) +g(an)g(undo.)p eop end +%%Page: 34 38 +TeXDict begin 34 37 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(34)390 +299 y Fs(RL_STATE_INPUTPENDING)870 408 y Ft(Readline)31 +b(has)f(input)g(p)s(ending)f(due)g(to)i(a)g(call)h(to)f +Fs(rl_execute_next\(\))p Ft(.)390 557 y Fs(RL_STATE_TTYCSAVED)870 +666 y Ft(Readline)g(has)f(sa)m(v)m(ed)i(the)e(v)-5 b(alues)31 +b(of)f(the)h(terminal's)g(sp)s(ecial)g(c)m(haracters.)390 +814 y Fs(RL_STATE_CALLBACK)870 924 y Ft(Readline)44 b(is)f(curren)m +(tly)g(using)f(the)h(alternate)i(\(callbac)m(k\))h(in)m(terface)e +(\(see)g(Sec-)870 1033 y(tion)31 b(2.4.12)h([Alternate)h(In)m +(terface],)f(page)f(46\).)390 1182 y Fs(RL_STATE_VIMOTION)870 +1291 y Ft(Readline)g(is)f(reading)h(the)f(argumen)m(t)h(to)g(a)g(vi-mo) +s(de)g Fs(")p Ft(motion)p Fs(")f Ft(command.)390 1439 +y Fs(RL_STATE_MULTIKEY)870 1549 y Ft(Readline)h(is)f(reading)h(a)g(m)m +(ultiple-k)m(eystrok)m(e)i(command.)390 1697 y Fs(RL_STATE_VICMDONCE) +870 1807 y Ft(Readline)40 b(has)f(en)m(tered)g(vi)g(command)g(\(mo)m(v) +m(emen)m(t\))j(mo)s(de)d(at)h(least)g(one)f(time)870 +1916 y(during)29 b(the)i(curren)m(t)f(call)i(to)f Fs(readline\(\))p +Ft(.)390 2064 y Fs(RL_STATE_DONE)870 2174 y Ft(Readline)d(has)g(read)f +(a)i(k)m(ey)f(sequence)g(b)s(ound)e(to)i Fs(accept-line)d +Ft(and)i(is)h(ab)s(out)f(to)870 2284 y(return)i(the)i(line)g(to)g(the)f +(caller.)390 2432 y Fs(RL_STATE_TIMEOUT)870 2541 y Ft(Readline)44 +b(has)f(timed)g(out)h(\(it)g(did)f(not)g(receiv)m(e)i(a)f(line)f(or)h +(sp)s(eci\014ed)e(n)m(um)m(b)s(er)870 2651 y(of)36 b(c)m(haracters)i(b) +s(efore)d(the)i(timeout)g(duration)e(sp)s(eci\014ed)h(b)m(y)g +Fs(rl_set_timeout)870 2760 y Ft(elapsed\))31 b(and)f(is)g(returning)g +(that)h(status)f(to)h(the)g(caller.)390 2909 y Fs(RL_STATE_EOF)870 +3018 y Ft(Readline)39 b(has)f(read)h(an)f(EOF)h(c)m(haracter)h(\(e.g.,) +i(the)d(stt)m(y)g(`)p Fs(EOF)p Ft(')f(c)m(haracter\))j(or)870 +3128 y(encoun)m(tered)k(a)h(read)e(error)h(and)f(is)h(ab)s(out)g(to)g +(return)f(a)h(NULL)g(line)g(to)h(the)870 3237 y(caller.)3371 +3405 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_explicit_arg)390 +3514 y Ft(Set)39 b(to)g(a)h(non-zero)f(v)-5 b(alue)39 +b(if)g(an)g(explicit)h(n)m(umeric)e(argumen)m(t)i(w)m(as)f(sp)s +(eci\014ed)f(b)m(y)g(the)h(user.)390 3624 y(Only)30 b(v)-5 +b(alid)30 b(in)h(a)f(bindable)g(command)g(function.)3371 +3791 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_numeric_arg)390 +3901 y Ft(Set)45 b(to)h(the)g(v)-5 b(alue)46 b(of)f(an)m(y)h(n)m +(umeric)f(argumen)m(t)h(explicitly)h(sp)s(eci\014ed)d(b)m(y)h(the)h +(user)e(b)s(efore)390 4010 y(executing)27 b(the)f(curren)m(t)g +(Readline)h(function.)38 b(Only)26 b(v)-5 b(alid)26 b(in)g(a)g +(bindable)f(command)h(function.)3371 4178 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_editing_mode)390 4287 y Ft(Set)25 b(to)h(a)g(v)-5 +b(alue)25 b(denoting)h(Readline's)f(curren)m(t)g(editing)h(mo)s(de.)39 +b(A)25 b(v)-5 b(alue)25 b(of)h Fj(1)32 b Ft(means)25 +b(Readline)390 4397 y(is)30 b(curren)m(tly)h(in)f(emacs)h(mo)s(de;)f +Fj(0)38 b Ft(means)31 b(that)f(vi)h(mo)s(de)f(is)g(activ)m(e.)150 +4626 y Fr(2.4)68 b(Readline)47 b(Con)l(v)l(enience)f(F)-11 +b(unctions)150 4845 y Fi(2.4.1)63 b(Naming)41 b(a)g(F)-10 +b(unction)150 4992 y Ft(The)24 b(user)h(can)g(dynamically)g(c)m(hange)h +(the)f(bindings)f(of)h(k)m(eys)h(while)e(using)h(Readline.)39 +b(This)24 b(is)h(done)g(b)m(y)150 5102 y(represen)m(ting)30 +b(the)h(function)f(with)g(a)g(descriptiv)m(e)h(name.)41 +b(The)30 b(user)f(is)i(able)f(to)h(t)m(yp)s(e)g(the)f(descriptiv)m(e) +150 5211 y(name)g(when)g(referring)g(to)h(the)f(function.)41 +b(Th)m(us,)29 b(in)h(an)h(init)f(\014le,)h(one)g(migh)m(t)g(\014nd)390 +5340 y Fs(Meta-Rubout:)92 b(backward-kill-word)p eop +end +%%Page: 35 39 +TeXDict begin 35 38 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(35)275 +299 y(This)84 b(binds)h(the)g(k)m(eystrok)m(e)j Fs(Meta-Rubout)82 +b Ft(to)87 b(the)e(function)h Fk(descriptively)94 b Ft(named)150 +408 y Fs(backward-kill-word)p Ft(.)63 b(Y)-8 b(ou,)43 +b(as)d(the)g(programmer,)i(should)c(bind)g(the)i(functions)f(y)m(ou)h +(write)g(to)150 518 y(descriptiv)m(e)31 b(names)g(as)f(w)m(ell.)42 +b(Readline)31 b(pro)m(vides)f(a)h(function)f(for)g(doing)h(that:)3350 +706 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_add_defun)c +Fg(\()p Ff(const)34 b(c)m(har)g(*name,)f(rl)p 1964 706 +30 5 v 43 w(command)p 2427 706 V 45 w(func)p 2656 706 +V 45 w(t)g(*function,)565 815 y(in)m(t)g(k)m(ey)p Fg(\))390 +925 y Ft(Add)h Fj(name)41 b Ft(to)36 b(the)f(list)h(of)g(named)e +(functions.)55 b(Mak)m(e)37 b Fj(function)e Ft(b)s(e)g(the)g(function)g +(that)h(gets)390 1034 y(called.)42 b(If)30 b Fj(k)m(ey)39 +b Ft(is)30 b(not)h(-1,)g(then)f(bind)f(it)i(to)g Fj(function)f +Ft(using)g Fs(rl_bind_key\(\))p Ft(.)275 1222 y(Using)g(this)g +(function)g(alone)h(is)f(su\016cien)m(t)g(for)g(most)h(applications.)42 +b(It)30 b(is)g(the)g(recommended)g(w)m(a)m(y)150 1332 +y(to)e(add)e(a)h(few)g(functions)g(to)g(the)g(default)h(functions)e +(that)i(Readline)f(has)g(built)g(in.)39 b(If)26 b(y)m(ou)i(need)e(to)i +(do)150 1441 y(something)34 b(other)g(than)f(adding)h(a)g(function)f +(to)h(Readline,)i(y)m(ou)e(ma)m(y)g(need)f(to)i(use)e(the)h(underlying) +150 1551 y(functions)c(describ)s(ed)f(b)s(elo)m(w.)150 +1752 y Fi(2.4.2)63 b(Selecting)41 b(a)f(Keymap)150 1899 +y Ft(Key)f(bindings)e(tak)m(e)j(place)g(on)f(a)g Fj(k)m(eymap)p +Ft(.)66 b(The)38 b(k)m(eymap)h(is)g(the)g(asso)s(ciation)h(b)s(et)m(w)m +(een)f(the)g(k)m(eys)150 2008 y(that)29 b(the)g(user)e(t)m(yp)s(es)i +(and)f(the)g(functions)g(that)h(get)h(run.)39 b(Y)-8 +b(ou)29 b(can)f(mak)m(e)i(y)m(our)e(o)m(wn)h(k)m(eymaps,)g(cop)m(y)150 +2118 y(existing)i(k)m(eymaps,)g(and)f(tell)i(Readline)f(whic)m(h)f(k)m +(eymap)h(to)g(use.)3350 2305 y([F)-8 b(unction])-3599 +b Fh(Keymap)54 b(rl_make_bare_keymap)d Fg(\()p Ff(v)m(oid)p +Fg(\))390 2415 y Ft(Returns)23 b(a)i(new,)g(empt)m(y)f(k)m(eymap.)40 +b(The)23 b(space)i(for)f(the)g(k)m(eymap)h(is)f(allo)s(cated)i(with)e +Fs(malloc\(\))p Ft(;)390 2524 y(the)31 b(caller)g(should)f(free)g(it)h +(b)m(y)f(calling)i Fs(rl_free_keymap\(\))26 b Ft(when)j(done.)3350 +2712 y([F)-8 b(unction])-3599 b Fh(Keymap)54 b(rl_copy_keymap)c +Fg(\()p Ff(Keymap)34 b(map)p Fg(\))390 2822 y Ft(Return)c(a)g(new)g(k)m +(eymap)h(whic)m(h)f(is)h(a)f(cop)m(y)h(of)g Fj(map)p +Ft(.)3350 3009 y([F)-8 b(unction])-3599 b Fh(Keymap)54 +b(rl_make_keymap)c Fg(\()p Ff(v)m(oid)p Fg(\))390 3119 +y Ft(Return)31 b(a)g(new)g(k)m(eymap)h(with)f(the)h(prin)m(ting)f(c)m +(haracters)i(b)s(ound)c(to)j(rl)p 2909 3119 28 4 v 40 +w(insert,)g(the)g(lo)m(w)m(ercase)390 3228 y(Meta)24 +b(c)m(haracters)g(b)s(ound)d(to)i(run)e(their)i(equiv)-5 +b(alen)m(ts,)25 b(and)d(the)h(Meta)h(digits)f(b)s(ound)e(to)i(pro)s +(duce)390 3338 y(n)m(umeric)30 b(argumen)m(ts.)3350 3525 +y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_discard_keymap)c +Fg(\()p Ff(Keymap)34 b(k)m(eymap)p Fg(\))390 3635 y Ft(F)-8 +b(ree)30 b(the)g(storage)h(asso)s(ciated)g(with)e(the)g(data)h(in)f +Fj(k)m(eymap)p Ft(.)41 b(The)29 b(caller)h(should)f(free)g +Fj(k)m(eymap)p Ft(.)3350 3823 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_free_keymap)49 b Fg(\()p Ff(Keymap)34 +b(k)m(eymap)p Fg(\))390 3932 y Ft(F)-8 b(ree)32 b(all)g(storage)g(asso) +s(ciated)g(with)f Fj(k)m(eymap)p Ft(.)42 b(This)30 b(calls)i +Fs(rl_discard_keymap)26 b Ft(to)32 b(free)f(sub-)390 +4042 y(ordindate)f(k)m(eymaps)h(and)f(macros.)3350 4229 +y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_empty_keymap)d +Fg(\()p Ff(Keymap)34 b(k)m(eymap)p Fg(\))390 4339 y Ft(Return)c +(non-zero)h(if)g(there)g(are)g(no)f(k)m(eys)i(b)s(ound)c(to)k +(functions)e(in)g Fj(k)m(eymap)s Ft(;)i(zero)f(if)g(there)g(are)390 +4449 y(an)m(y)g(k)m(eys)g(b)s(ound.)275 4636 y(Readline)45 +b(has)g(sev)m(eral)i(in)m(ternal)f(k)m(eymaps.)86 b(These)45 +b(functions)g(allo)m(w)h(y)m(ou)g(to)g(c)m(hange)g(whic)m(h)150 +4746 y(k)m(eymap)31 b(is)f(activ)m(e.)3350 4933 y([F)-8 +b(unction])-3599 b Fh(Keymap)54 b(rl_get_keymap)c Fg(\()p +Ff(v)m(oid)p Fg(\))390 5043 y Ft(Returns)29 b(the)i(curren)m(tly)f +(activ)m(e)j(k)m(eymap.)3350 5230 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_set_keymap)49 b Fg(\()p Ff(Keymap)34 +b(k)m(eymap)p Fg(\))390 5340 y Ft(Mak)m(es)e Fj(k)m(eymap)h +Ft(the)e(curren)m(tly)f(activ)m(e)j(k)m(eymap.)p eop +end +%%Page: 36 40 +TeXDict begin 36 39 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(36)3350 +299 y([F)-8 b(unction])-3599 b Fh(Keymap)54 b(rl_get_keymap_by_name)e +Fg(\()p Ff(const)34 b(c)m(har)g(*name)p Fg(\))390 408 +y Ft(Return)e(the)i(k)m(eymap)f(matc)m(hing)i Fj(name)p +Ft(.)49 b Fj(name)38 b Ft(is)c(one)f(whic)m(h)g(w)m(ould)g(b)s(e)f +(supplied)g(in)h(a)h Fs(set)390 518 y(keymap)29 b Ft(inputrc)g(line)i +(\(see)g(Section)g(1.3)h([Readline)f(Init)f(File],)i(page)f(4\).)3350 +692 y([F)-8 b(unction])-3599 b Fh(char)54 b(*)e(rl_get_keymap_name)f +Fg(\()p Ff(Keymap)34 b(k)m(eymap)p Fg(\))390 801 y Ft(Return)e(the)i +(name)f(matc)m(hing)h Fj(k)m(eymap)p Ft(.)50 b Fj(name)38 +b Ft(is)c(one)f(whic)m(h)g(w)m(ould)g(b)s(e)f(supplied)g(in)h(a)h +Fs(set)390 911 y(keymap)29 b Ft(inputrc)g(line)i(\(see)g(Section)g(1.3) +h([Readline)f(Init)f(File],)i(page)f(4\).)3350 1085 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_set_keymap_name)e Fg(\()p +Ff(const)34 b(c)m(har)g(*name,)f(Keymap)h(k)m(eymap)p +Fg(\))390 1194 y Ft(Set)g(the)f(name)h(of)g Fj(k)m(eymap)p +Ft(.)50 b(This)33 b(name)h(will)f(then)h(b)s(e)e Fs(")p +Ft(registered)p Fs(")i Ft(and)f(a)m(v)-5 b(ailable)36 +b(for)d(use)390 1304 y(in)i(a)g Fs(set)29 b(keymap)k +Ft(inputrc)h(directiv)m(e)j(see)e(Section)h(1.3)g([Readline)g(Init)e +(File],)k(page)e(4\).)54 b(The)390 1414 y Fj(name)27 +b Ft(ma)m(y)c(not)g(b)s(e)e(one)i(of)f(Readline's)h(builtin)f(k)m +(eymap)g(names;)j(y)m(ou)e(ma)m(y)g(not)f(add)g(a)g(di\013eren)m(t)390 +1523 y(name)36 b(for)g(one)g(of)g(Readline's)h(builtin)e(k)m(eymaps.)58 +b(Y)-8 b(ou)37 b(ma)m(y)f(replace)h(the)f(name)g(asso)s(ciated)390 +1633 y(with)31 b(a)g(giv)m(en)h(k)m(eymap)g(b)m(y)f(calling)h(this)f +(function)g(more)h(than)e(once)i(with)f(the)g(same)h +Fj(k)m(eymap)390 1742 y Ft(argumen)m(t.)50 b(Y)-8 b(ou)34 +b(ma)m(y)h(asso)s(ciate)g(a)f(registered)g Fj(name)39 +b Ft(with)33 b(a)h(new)f(k)m(eymap)h(b)m(y)f(calling)i(this)390 +1852 y(function)c(more)h(than)f(once)i(with)e(the)h(same)g +Fj(name)k Ft(argumen)m(t.)45 b(There)31 b(is)h(no)g(w)m(a)m(y)g(to)g +(remo)m(v)m(e)390 1962 y(a)k(named)e(k)m(eymap)i(once)g(the)f(name)g +(has)g(b)s(een)g(registered.)56 b(Readline)36 b(will)f(mak)m(e)h(a)g +(cop)m(y)g(of)390 2071 y Fj(name)p Ft(.)41 b(The)30 b(return)f(v)-5 +b(alue)31 b(is)g(greater)g(than)g(zero)g(unless)f Fj(name)35 +b Ft(is)c(one)g(of)f(Readline's)h(builtin)390 2181 y(k)m(eymap)g(names) +f(or)h Fj(k)m(eymap)i Ft(is)e(one)f(of)h(Readline's)g(builtin)f(k)m +(eymaps.)150 2373 y Fi(2.4.3)63 b(Binding)42 b(Keys)150 +2520 y Ft(Key)34 b(sequences)g(are)h(asso)s(ciate)h(with)e(functions)f +(through)h(the)g(k)m(eymap.)52 b(Readline)35 b(has)f(sev)m(eral)h(in-) +150 2629 y(ternal)30 b(k)m(eymaps:)40 b Fs(emacs_standard_keymap)p +Ft(,)24 b Fs(emacs_meta_keymap)p Ft(,)h Fs(emacs_ctlx_keymap)p +Ft(,)g Fs(vi_)150 2739 y(movement_keymap)p Ft(,)41 b(and)h +Fs(vi_insertion_keymap)p Ft(.)71 b Fs(emacs_standard_keymap)37 +b Ft(is)42 b(the)g(default,)150 2849 y(and)30 b(the)g(examples)h(in)f +(this)h(man)m(ual)f(assume)g(that.)275 2980 y(Since)d +Fs(readline\(\))e Ft(installs)j(a)g(set)g(of)g(default)g(k)m(ey)g +(bindings)f(the)h(\014rst)e(time)j(it)f(is)f(called,)j(there)e(is)150 +3089 y(alw)m(a)m(ys)34 b(the)f(danger)f(that)i(a)f(custom)g(binding)e +(installed)j(b)s(efore)e(the)h(\014rst)e(call)j(to)g +Fs(readline\(\))c Ft(will)150 3199 y(b)s(e)25 b(o)m(v)m(erridden.)39 +b(An)26 b(alternate)h(mec)m(hanism)f(is)g(to)g(install)h(custom)f(k)m +(ey)g(bindings)f(in)g(an)h(initialization)150 3308 y(function)37 +b(assigned)g(to)h(the)f Fs(rl_startup_hook)c Ft(v)-5 +b(ariable)38 b(\(see)g(Section)g(2.3)g([Readline)g(V)-8 +b(ariables],)150 3418 y(page)31 b(29\).)275 3549 y(These)f(functions)g +(manage)h(k)m(ey)g(bindings.)3350 3723 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_bind_key)c Fg(\()p Ff(in)m(t)34 b(k)m(ey)-8 +b(,)32 b(rl)p 1441 3723 30 5 v 43 w(command)p 1904 3723 +V 45 w(func)p 2133 3723 V 45 w(t)h(*function)p Fg(\))390 +3832 y Ft(Binds)f Fj(k)m(ey)42 b Ft(to)34 b Fj(function)e +Ft(in)h(the)g(curren)m(tly)g(activ)m(e)i(k)m(eymap.)49 +b(Returns)32 b(non-zero)i(in)f(the)g(case)390 3942 y(of)e(an)f(in)m(v) +-5 b(alid)31 b Fj(k)m(ey)p Ft(.)3350 4116 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_bind_key_in_map)e Fg(\()p Ff(in)m(t)34 +b(k)m(ey)-8 b(,)32 b(rl)p 1807 4116 V 43 w(command)p +2270 4116 V 45 w(func)p 2499 4116 V 45 w(t)h(*function,)565 +4225 y(Keymap)h(map)p Fg(\))390 4335 y Ft(Bind)c Fj(k)m(ey)39 +b Ft(to)31 b Fj(function)f Ft(in)g Fj(map)p Ft(.)40 b(Returns)30 +b(non-zero)h(in)f(the)h(case)g(of)f(an)h(in)m(v)-5 b(alid)31 +b Fj(k)m(ey)p Ft(.)3350 4509 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_bind_key_if_unboun)q(d)e Fg(\()p Ff(in)m(t)34 +b(k)m(ey)-8 b(,)32 b(rl)p 2016 4509 V 44 w(command)p +2480 4509 V 44 w(func)p 2708 4509 V 45 w(t)565 4618 y(*function)p +Fg(\))390 4728 y Ft(Binds)43 b Fj(k)m(ey)53 b Ft(to)45 +b Fj(function)e Ft(if)h(it)h(is)f(not)g(already)g(b)s(ound)e(in)i(the)g +(curren)m(tly)g(activ)m(e)i(k)m(eymap.)390 4837 y(Returns)29 +b(non-zero)i(in)f(the)h(case)g(of)g(an)f(in)m(v)-5 b(alid)31 +b Fj(k)m(ey)39 b Ft(or)30 b(if)h Fj(k)m(ey)39 b Ft(is)30 +b(already)h(b)s(ound.)3350 5011 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_bind_key_if_unboun)q(d_in)q(_ma)q(p)e +Fg(\()p Ff(in)m(t)34 b(k)m(ey)-8 b(,)32 b(rl)p 2382 5011 +V 44 w(command)p 2846 5011 V 44 w(func)p 3074 5011 V +46 w(t)565 5121 y(*function,)i(Keymap)g(map)p Fg(\))390 +5230 y Ft(Binds)27 b Fj(k)m(ey)36 b Ft(to)28 b Fj(function)f +Ft(if)g(it)h(is)f(not)h(already)g(b)s(ound)d(in)i Fj(map)p +Ft(.)39 b(Returns)27 b(non-zero)g(in)g(the)h(case)390 +5340 y(of)j(an)f(in)m(v)-5 b(alid)31 b Fj(k)m(ey)39 b +Ft(or)30 b(if)g Fj(k)m(ey)39 b Ft(is)31 b(already)g(b)s(ound.)p +eop end +%%Page: 37 41 +TeXDict begin 37 40 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(37)3350 +299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_unbind_key)d +Fg(\()p Ff(in)m(t)33 b(k)m(ey)p Fg(\))390 408 y Ft(Bind)j +Fj(k)m(ey)45 b Ft(to)37 b(the)f(n)m(ull)g(function)g(in)g(the)h(curren) +m(tly)f(activ)m(e)i(k)m(eymap.)59 b(Returns)35 b(non-zero)i(in)390 +518 y(case)31 b(of)g(error.)3350 693 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_unbind_key_in_map)f Fg(\()p Ff(in)m(t)33 +b(k)m(ey)-8 b(,)33 b(Keymap)g(map)p Fg(\))390 803 y Ft(Bind)d +Fj(k)m(ey)39 b Ft(to)31 b(the)g(n)m(ull)f(function)g(in)g +Fj(map)p Ft(.)40 b(Returns)30 b(non-zero)h(in)f(case)h(of)g(error.)3350 +978 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_unbind_function_in)q +(_map)f Fg(\()p Ff(rl)p 1821 978 30 5 v 44 w(command)p +2285 978 V 45 w(func)p 2514 978 V 45 w(t)33 b(*function,)565 +1088 y(Keymap)h(map)p Fg(\))390 1198 y Ft(Un)m(bind)29 +b(all)i(k)m(eys)g(that)g(execute)h Fj(function)e Ft(in)g +Fj(map)p Ft(.)3350 1373 y([F)-8 b(unction])-3599 b Fh(int)53 +b(rl_unbind_command_in_)q(map)f Fg(\()p Ff(const)34 b(c)m(har)g +(*command,)f(Keymap)565 1482 y(map)p Fg(\))390 1592 y +Ft(Un)m(bind)c(all)i(k)m(eys)g(that)g(are)g(b)s(ound)e(to)i +Fj(command)i Ft(in)d Fj(map)p Ft(.)3350 1767 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_bind_keyseq)d Fg(\()p +Ff(const)34 b(c)m(har)g(*k)m(eyseq,)e(rl)p 2119 1767 +V 44 w(command)p 2583 1767 V 44 w(func)p 2811 1767 V +46 w(t)565 1877 y(*function)p Fg(\))390 1987 y Ft(Bind)43 +b(the)g(k)m(ey)h(sequence)f(represen)m(ted)g(b)m(y)g(the)g(string)g +Fj(k)m(eyseq)j Ft(to)e(the)f(function)g Fj(function)p +Ft(,)390 2096 y(b)s(eginning)27 b(in)h(the)h(curren)m(t)f(k)m(eymap.)40 +b(This)28 b(mak)m(es)h(new)e(k)m(eymaps)i(as)f(necessary)-8 +b(.)41 b(The)28 b(return)390 2206 y(v)-5 b(alue)31 b(is)f(non-zero)h +(if)g Fj(k)m(eyseq)i Ft(is)d(in)m(v)-5 b(alid.)3350 2381 +y([F)d(unction])-3599 b Fh(int)53 b(rl_bind_keyseq_in_map)f +Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)565 2491 +y(rl)p 639 2491 V 44 w(command)p 1103 2491 V 44 w(func)p +1331 2491 V 45 w(t)f(*function,)h(Keymap)g(map)p Fg(\))390 +2600 y Ft(Bind)25 b(the)g(k)m(ey)h(sequence)f(represen)m(ted)g(b)m(y)g +(the)g(string)g Fj(k)m(eyseq)j Ft(to)e(the)f(function)g +Fj(function)p Ft(.)39 b(This)390 2710 y(mak)m(es)30 b(new)f(k)m(eymaps) +g(as)g(necessary)-8 b(.)42 b(Initial)30 b(bindings)d(are)j(p)s +(erformed)e(in)g Fj(map)p Ft(.)40 b(The)29 b(return)390 +2819 y(v)-5 b(alue)31 b(is)f(non-zero)h(if)g Fj(k)m(eyseq)i +Ft(is)d(in)m(v)-5 b(alid.)3350 2995 y([F)d(unction])-3599 +b Fh(int)53 b(rl_set_key)c Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,) +e(rl)p 1910 2995 V 44 w(command)p 2374 2995 V 44 w(func)p +2602 2995 V 45 w(t)h(*function,)565 3104 y(Keymap)h(map)p +Fg(\))390 3214 y Ft(Equiv)-5 b(alen)m(t)31 b(to)g Fs +(rl_bind_keyseq_in_map)p Ft(.)3350 3389 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_bind_keyseq_if_unb)q(ound)f Fg(\()p +Ff(const)34 b(c)m(har)g(*k)m(eyseq,)565 3499 y(rl)p 639 +3499 V 44 w(command)p 1103 3499 V 44 w(func)p 1331 3499 +V 45 w(t)f(*function)p Fg(\))390 3608 y Ft(Binds)i Fj(k)m(eyseq)k +Ft(to)d Fj(function)f Ft(if)g(it)h(is)g(not)g(already)g(b)s(ound)d(in)i +(the)h(curren)m(tly)f(activ)m(e)j(k)m(eymap.)390 3718 +y(Returns)29 b(non-zero)i(in)f(the)h(case)g(of)g(an)f(in)m(v)-5 +b(alid)31 b Fj(k)m(eyseq)j Ft(or)c(if)g Fj(k)m(eyseq)k +Ft(is)c(already)h(b)s(ound.)3350 3893 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_bind_keyseq_if_unb)q(ound)q(_in)q(_ma)q(p)e +Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)565 4003 +y(rl)p 639 4003 V 44 w(command)p 1103 4003 V 44 w(func)p +1331 4003 V 45 w(t)f(*function,)h(Keymap)g(map)p Fg(\))390 +4113 y Ft(Binds)d Fj(k)m(eyseq)k Ft(to)e Fj(function)f +Ft(if)g(it)g(is)g(not)g(already)h(b)s(ound)d(in)h Fj(map)p +Ft(.)46 b(Returns)31 b(non-zero)h(in)g(the)390 4222 y(case)f(of)g(an)f +(in)m(v)-5 b(alid)31 b Fj(k)m(eyseq)j Ft(or)c(if)g Fj(k)m(eyseq)k +Ft(is)c(already)h(b)s(ound.)3350 4398 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_generic_bind)d Fg(\()p Ff(in)m(t)34 +b(t)m(yp)s(e,)f(const)g(c)m(har)h(*k)m(eyseq,)f(c)m(har)h(*data,)565 +4507 y(Keymap)g(map)p Fg(\))390 4617 y Ft(Bind)27 b(the)g(k)m(ey)h +(sequence)f(represen)m(ted)g(b)m(y)g(the)g(string)g Fj(k)m(eyseq)j +Ft(to)e(the)f(arbitrary)g(p)s(oin)m(ter)g Fj(data)p Ft(.)390 +4726 y Fj(t)m(yp)s(e)34 b Ft(sa)m(ys)29 b(what)f(kind)g(of)g(data)h(is) +g(p)s(oin)m(ted)f(to)h(b)m(y)g Fj(data)p Ft(;)h(this)e(can)h(b)s(e)f(a) +g(function)g(\()p Fs(ISFUNC)p Ft(\),)h(a)390 4836 y(macro)h(\()p +Fs(ISMACR)p Ft(\),)f(or)g(a)h(k)m(eymap)g(\()p Fs(ISKMAP)p +Ft(\).)40 b(This)28 b(mak)m(es)j(new)e(k)m(eymaps)g(as)h(necessary)-8 +b(.)41 b(The)390 4945 y(initial)32 b(k)m(eymap)e(in)h(whic)m(h)f(to)h +(do)f(bindings)f(is)i Fj(map)p Ft(.)3350 5121 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_parse_and_bind)e Fg(\()p +Ff(c)m(har)34 b(*line)p Fg(\))390 5230 y Ft(P)m(arse)c +Fj(line)35 b Ft(as)29 b(if)h(it)g(had)e(b)s(een)h(read)g(from)g(the)h +Fs(inputrc)d Ft(\014le)j(and)e(p)s(erform)g(an)m(y)i(k)m(ey)g(bindings) +390 5340 y(and)g(v)-5 b(ariable)31 b(assignmen)m(ts)g(found)e(\(see)i +(Section)h(1.3)f([Readline)g(Init)f(File],)j(page)e(4\).)p +eop end +%%Page: 38 42 +TeXDict begin 38 41 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(38)3350 +299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_read_init_file)e +Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename)p Fg(\))390 +408 y Ft(Read)e(k)m(eybindings)f(and)g(v)-5 b(ariable)32 +b(assignmen)m(ts)g(from)f Fj(\014lename)37 b Ft(\(see)32 +b(Section)g(1.3)h([Readline)390 518 y(Init)d(File],)i(page)f(4\).)150 +726 y Fi(2.4.4)63 b(Asso)s(ciating)41 b(F)-10 b(unction)42 +b(Names)f(and)g(Bindings)150 873 y Ft(These)30 b(functions)g(allo)m(w)h +(y)m(ou)g(to)f(\014nd)f(out)h(what)g(k)m(eys)h(in)m(v)m(ok)m(e)h(named) +e(functions)g(and)f(the)h(functions)150 983 y(in)m(v)m(ok)m(ed)f(b)m(y) +e(a)h(particular)g(k)m(ey)g(sequence.)40 b(Y)-8 b(ou)28 +b(ma)m(y)g(also)h(asso)s(ciate)g(a)f(new)f(function)g(name)h(with)f(an) +150 1092 y(arbitrary)j(function.)3350 1295 y([F)-8 b(unction])-3599 +b Fh(rl_command_func_t)57 b(*)c(rl_named_function)e Fg(\()p +Ff(const)34 b(c)m(har)g(*name)p Fg(\))390 1404 y Ft(Return)c(the)g +(function)g(with)g(name)h Fj(name)p Ft(.)3350 1606 y([F)-8 +b(unction])-3599 b Fh(rl_command_func_t)57 b(*)c(rl_function_of_keyseq) +f Fg(\()p Ff(const)34 b(c)m(har)565 1716 y(*k)m(eyseq,)f(Keymap)g(map,) +g(in)m(t)h(*t)m(yp)s(e)p Fg(\))390 1826 y Ft(Return)e(the)g(function)h +(in)m(v)m(ok)m(ed)h(b)m(y)e Fj(k)m(eyseq)k Ft(in)c(k)m(eymap)h +Fj(map)p Ft(.)47 b(If)32 b Fj(map)j Ft(is)d Fs(NULL)p +Ft(,)g(the)h(curren)m(t)390 1935 y(k)m(eymap)k(is)g(used.)60 +b(If)37 b Fj(t)m(yp)s(e)42 b Ft(is)37 b(not)g Fs(NULL)p +Ft(,)h(the)f(t)m(yp)s(e)g(of)g(the)g(ob)5 b(ject)38 b(is)f(returned)f +(in)h(the)g Fs(int)390 2045 y Ft(v)-5 b(ariable)30 b(it)g(p)s(oin)m(ts) +g(to)g(\(one)g(of)g Fs(ISFUNC)p Ft(,)e Fs(ISKMAP)p Ft(,)g(or)i +Fs(ISMACR)p Ft(\).)39 b(It)30 b(tak)m(es)h(a)f Fs(")p +Ft(translated)p Fs(")f Ft(k)m(ey)390 2154 y(sequence)i(and)f(should)f +(not)i(b)s(e)e(used)h(if)g(the)h(k)m(ey)g(sequence)g(can)f(include)g +(NUL.)3350 2356 y([F)-8 b(unction])-3599 b Fh(rl_command_func_t)57 +b(*)c(rl_function_of_keyseq_)q(len)f Fg(\()p Ff(const)34 +b(c)m(har)565 2466 y(*k)m(eyseq,)f(size)p 1121 2466 30 +5 v 44 w(t)g(len,)g(Keymap)h(map,)f(in)m(t)g(*t)m(yp)s(e)p +Fg(\))390 2576 y Ft(Return)20 b(the)h(function)g(in)m(v)m(ok)m(ed)i(b)m +(y)e Fj(k)m(eyseq)j Ft(of)d(length)g Fj(len)h Ft(in)e(k)m(eymap)i +Fj(map)p Ft(.)37 b(Equiv)-5 b(alen)m(t)22 b(to)g Fs(rl_)390 +2685 y(function_of_keyseq)g Ft(with)28 b(the)f(addition)h(of)f(the)h +Fj(len)f Ft(parameter.)41 b(It)27 b(tak)m(es)i(a)f Fs(")p +Ft(translated)p Fs(")390 2795 y Ft(k)m(ey)j(sequence)g(and)f(should)f +(b)s(e)h(used)f(if)i(the)f(k)m(ey)h(sequence)g(can)g(include)f(NUL.) +3350 2997 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_trim_arg_from_keys) +q(eq)f Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)e(size)p +2678 2997 V 44 w(t)h(len,)565 3107 y(Keymap)h(map)p Fg(\))390 +3216 y Ft(If)e(there)h(is)f(a)h(n)m(umeric)g(argumen)m(t)g(at)g(the)g +(b)s(eginning)e(of)i Fj(k)m(eyseq)p Ft(,)h(p)s(ossibly)e(including)g +(digits,)390 3326 y(return)24 b(the)h(index)f(of)i(the)f(\014rst)f(c)m +(haracter)i(in)f Fj(k)m(eyseq)j Ft(follo)m(wing)e(the)g(n)m(umeric)e +(argumen)m(t.)40 b(This)390 3435 y(can)24 b(b)s(e)g(used)f(to)h(skip)g +(o)m(v)m(er)h(the)f(n)m(umeric)g(argumen)m(t)g(\(whic)m(h)g(is)g(a)m(v) +-5 b(ailable)27 b(as)d Fs(rl_numeric_arg)390 3545 y Ft(while)30 +b(tra)m(v)m(ersing)i(the)f(k)m(ey)g(sequence)g(that)g(in)m(v)m(ok)m(ed) +g(the)g(curren)m(t)f(command.)3350 3747 y([F)-8 b(unction])-3599 +b Fh(char)54 b(**)e(rl_invoking_keyseqs)g Fg(\()p Ff(rl)p +1717 3747 V 44 w(command)p 2181 3747 V 44 w(func)p 2409 +3747 V 45 w(t)33 b(*function)p Fg(\))390 3857 y Ft(Return)d(an)i(arra)m +(y)f(of)h(strings)f(represen)m(ting)g(the)g(k)m(ey)h(sequences)g(used)e +(to)i(in)m(v)m(ok)m(e)h Fj(function)e Ft(in)390 3966 +y(the)g(curren)m(t)f(k)m(eymap.)3350 4168 y([F)-8 b(unction])-3599 +b Fh(char)54 b(**)e(rl_invoking_keyseqs_i)q(n_m)q(ap)g +Fg(\()p Ff(rl)p 2083 4168 V 44 w(command)p 2547 4168 +V 44 w(func)p 2775 4168 V 45 w(t)565 4278 y(*function,)34 +b(Keymap)g(map)p Fg(\))390 4388 y Ft(Return)c(an)i(arra)m(y)f(of)h +(strings)f(represen)m(ting)g(the)g(k)m(ey)h(sequences)g(used)e(to)i(in) +m(v)m(ok)m(e)h Fj(function)e Ft(in)390 4497 y(the)g(k)m(eymap)f +Fj(map)p Ft(.)3350 4699 y([F)-8 b(unction])-3599 b Fh(void)54 +b(rl_function_dumper)c Fg(\()p Ff(in)m(t)34 b(readable)p +Fg(\))390 4809 y Ft(Prin)m(t)i(the)g(Readline)g(function)g(names)f(and) +g(the)h(k)m(ey)h(sequences)f(curren)m(tly)g(b)s(ound)d(to)k(them)390 +4919 y(to)32 b Fs(rl_outstream)p Ft(.)40 b(If)31 b Fj(readable)36 +b Ft(is)c(non-zero,)g(the)f(list)h(is)f(formatted)h(in)f(suc)m(h)g(a)g +(w)m(a)m(y)i(that)e(it)390 5028 y(can)g(b)s(e)e(made)i(part)f(of)h(an)f +Fs(inputrc)e Ft(\014le)j(and)e(re-read.)3350 5230 y([F)-8 +b(unction])-3599 b Fh(void)54 b(rl_list_funmap_names)d +Fg(\()p Ff(v)m(oid)p Fg(\))390 5340 y Ft(Prin)m(t)30 +b(the)h(names)f(of)h(all)g(bindable)f(Readline)h(functions)f(to)h +Fs(rl_outstream)p Ft(.)p eop end +%%Page: 39 43 +TeXDict begin 39 42 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(39)3350 +299 y([F)-8 b(unction])-3599 b Fh(const)54 b(char)f(**)g +(rl_funmap_names)d Fg(\()p Ff(v)m(oid)p Fg(\))390 408 +y Ft(Return)25 b(a)i(NULL)f(terminated)g(arra)m(y)h(of)f(kno)m(wn)f +(function)h(names.)39 b(The)26 b(arra)m(y)g(is)g(sorted.)39 +b(The)390 518 y(arra)m(y)28 b(itself)h(is)f(allo)s(cated,)j(but)c(not)h +(the)h(strings)e(inside.)40 b(Y)-8 b(ou)29 b(should)e(free)h(the)g +(arra)m(y)-8 b(,)29 b(but)f(not)390 628 y(the)j(p)s(oin)m(ters,)f +(using)g Fs(free)f Ft(or)i Fs(rl_free)d Ft(when)h(y)m(ou)i(are)g(done.) +3350 813 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_add_funmap_entry)e +Fg(\()p Ff(const)34 b(c)m(har)g(*name,)g(rl)p 2331 813 +30 5 v 43 w(command)p 2794 813 V 45 w(func)p 3023 813 +V 45 w(t)565 923 y(*function)p Fg(\))390 1033 y Ft(Add)e +Fj(name)38 b Ft(to)33 b(the)g(list)h(of)f(bindable)f(Readline)h +(command)g(names,)g(and)f(mak)m(e)i Fj(function)f Ft(the)390 +1142 y(function)d(to)h(b)s(e)f(called)h(when)f Fj(name)35 +b Ft(is)c(in)m(v)m(ok)m(ed.)150 1342 y Fi(2.4.5)63 b(Allo)m(wing)41 +b(Undoing)150 1489 y Ft(Supp)s(orting)34 b(the)i(undo)e(command)i(is)g +(a)g(painless)g(thing,)h(and)e(mak)m(es)i(y)m(our)f(functions)f(m)m(uc) +m(h)h(more)150 1599 y(useful.)k(It)30 b(is)h(certainly)g(easy)g(to)g +(try)g(something)g(if)f(y)m(ou)h(kno)m(w)f(y)m(ou)h(can)f(undo)g(it.) +275 1734 y(If)40 b(y)m(our)h(function)f(simply)g(inserts)h(text)h +(once,)i(or)d(deletes)h(text)g(once,)i(and)c(uses)h Fs(rl_insert_)150 +1844 y(text\(\))26 b Ft(or)i Fs(rl_delete_text\(\))23 +b Ft(to)29 b(do)f(it,)h(then)f(undoing)f(is)g(already)i(done)f(for)f(y) +m(ou)h(automatically)-8 b(.)275 1979 y(If)20 b(y)m(ou)g(do)h(m)m +(ultiple)g(insertions)f(or)h(m)m(ultiple)g(deletions,)j(or)c(an)m(y)h +(com)m(bination)h(of)e(these)h(op)s(erations,)150 2088 +y(y)m(ou)38 b(should)f(group)h(them)g(together)h(in)m(to)g(one)f(op)s +(eration.)64 b(This)37 b(is)h(done)g(with)g Fs(rl_begin_undo_)150 +2198 y(group\(\))28 b Ft(and)i Fs(rl_end_undo_group\(\))p +Ft(.)275 2333 y(The)f(t)m(yp)s(es)i(of)f(ev)m(en)m(ts)i(that)f(can)g(b) +s(e)e(undone)h(are:)390 2446 y Fe(enum)40 b(undo_code)h({)f +(UNDO_DELETE,)i(UNDO_INSERT,)g(UNDO_BEGIN,)g(UNDO_END)f(};)275 +2581 y Ft(Notice)32 b(that)f Fs(UNDO_DELETE)c Ft(means)j(to)h(insert)f +(some)h(text,)h(and)d Fs(UNDO_INSERT)e Ft(means)k(to)g(delete)150 +2691 y(some)d(text.)41 b(That)27 b(is,)i(the)e(undo)g(co)s(de)h(tells)g +(what)g(to)g(undo,)f(not)h(ho)m(w)g(to)g(undo)e(it.)41 +b Fs(UNDO_BEGIN)25 b Ft(and)150 2800 y Fs(UNDO_END)j +Ft(are)j(tags)g(added)f(b)m(y)g Fs(rl_begin_undo_group\(\))25 +b Ft(and)30 b Fs(rl_end_undo_group\(\))p Ft(.)3350 2986 +y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_begin_undo_group)e +Fg(\()p Ff(v)m(oid)p Fg(\))390 3096 y Ft(Begins)32 b(sa)m(ving)g(undo)d +(information)j(in)e(a)i(group)e(construct.)43 b(The)30 +b(undo)g(information)h(usually)390 3205 y(comes)42 b(from)f(calls)i(to) +f Fs(rl_insert_text\(\))37 b Ft(and)k Fs(rl_delete_text\(\))p +Ft(,)f(but)h(could)h(b)s(e)f(the)390 3315 y(result)30 +b(of)h(calls)g(to)g Fs(rl_add_undo\(\))p Ft(.)3350 3501 +y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_end_undo_group)e +Fg(\()p Ff(v)m(oid)p Fg(\))390 3610 y Ft(Closes)29 b(the)h(curren)m(t)e +(undo)g(group)h(started)g(with)g Fs(rl_begin_undo_group)c(\(\))p +Ft(.)39 b(There)29 b(should)390 3720 y(b)s(e)h(one)g(call)i(to)f +Fs(rl_end_undo_group\(\))25 b Ft(for)30 b(eac)m(h)i(call)g(to)f +Fs(rl_begin_undo_group\(\))p Ft(.)3350 3906 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_add_undo)48 b Fg(\()p Ff(en)m(um)35 +b(undo)p 1558 3906 V 45 w(co)s(de)e(what,)g(in)m(t)g(start,)g(in)m(t)g +(end,)h(c)m(har)565 4015 y(*text)p Fg(\))390 4125 y Ft(Remem)m(b)s(er)g +(ho)m(w)g(to)h(undo)d(an)i(ev)m(en)m(t)i(\(according)f(to)g +Fj(what)r Ft(\).)52 b(The)33 b(a\013ected)j(text)f(runs)d(from)390 +4235 y Fj(start)h Ft(to)e Fj(end)p Ft(,)f(and)g(encompasses)h +Fj(text)p Ft(.)3350 4420 y([F)-8 b(unction])-3599 b Fh(void)54 +b(rl_free_undo_list)c Fg(\()p Ff(v)m(oid)p Fg(\))390 +4530 y Ft(F)-8 b(ree)31 b(the)g(existing)g(undo)f(list.)3350 +4716 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_do_undo)c +Fg(\()p Ff(v)m(oid)p Fg(\))390 4825 y Ft(Undo)22 b(the)h(\014rst)g +(thing)f(on)h(the)g(undo)f(list.)39 b(Returns)22 b Fs(0)g +Ft(if)h(there)g(w)m(as)g(nothing)g(to)h(undo,)f(non-zero)390 +4935 y(if)30 b(something)h(w)m(as)g(undone.)275 5121 +y(Finally)-8 b(,)32 b(if)f(y)m(ou)h(neither)f(insert)g(nor)f(delete)j +(text,)f(but)f(directly)g(mo)s(dify)g(the)g(existing)h(text)g(\(e.g.,) +150 5230 y(c)m(hange)40 b(its)f(case\),)j(call)e Fs(rl_modifying\(\))35 +b Ft(once,)42 b(just)c(b)s(efore)g(y)m(ou)h(mo)s(dify)f(the)h(text.)67 +b(Y)-8 b(ou)39 b(m)m(ust)150 5340 y(supply)29 b(the)h(indices)h(of)f +(the)h(text)g(range)g(that)g(y)m(ou)g(are)g(going)g(to)g(mo)s(dify)-8 +b(.)p eop end +%%Page: 40 44 +TeXDict begin 40 43 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(40)3350 +299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_modifying)c +Fg(\()p Ff(in)m(t)34 b(start,)e(in)m(t)i(end)p Fg(\))390 +408 y Ft(T)-8 b(ell)41 b(Readline)g(to)g(sa)m(v)m(e)g(the)g(text)g(b)s +(et)m(w)m(een)g Fj(start)i Ft(and)c Fj(end)k Ft(as)e(a)f(single)h(undo) +e(unit.)70 b(It)40 b(is)390 518 y(assumed)30 b(that)h(y)m(ou)f(will)h +(subsequen)m(tly)f(mo)s(dify)f(that)i(text.)150 712 y +Fi(2.4.6)63 b(Redispla)m(y)3350 903 y Ft([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_redisplay)49 b Fg(\()p Ff(v)m(oid)p +Fg(\))390 1013 y Ft(Change)38 b(what's)f(displa)m(y)m(ed)i(on)e(the)h +(screen)g(to)h(re\015ect)f(the)g(curren)m(t)g(con)m(ten)m(ts)h(of)f +Fs(rl_line_)390 1123 y(buffer)p Ft(.)3350 1299 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_forced_update_disp)q(lay)f +Fg(\()p Ff(v)m(oid)p Fg(\))390 1409 y Ft(F)-8 b(orce)41 +b(the)f(line)g(to)h(b)s(e)e(up)s(dated)f(and)h(redispla)m(y)m(ed,)k +(whether)c(or)g(not)h(Readline)h(thinks)e(the)390 1518 +y(screen)30 b(displa)m(y)h(is)f(correct.)3350 1695 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_on_new_line)d Fg(\()p +Ff(v)m(oid)p Fg(\))390 1804 y Ft(T)-8 b(ell)31 b(the)f(up)s(date)f +(functions)g(that)i(w)m(e)f(ha)m(v)m(e)h(mo)m(v)m(ed)g(on)m(to)g(a)f +(new)f(\(empt)m(y\))i(line,)g(usually)e(after)390 1914 +y(outputting)i(a)f(newline.)3350 2090 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_on_new_line_with_p)q(romp)q(t)f Fg(\()p +Ff(v)m(oid)p Fg(\))390 2200 y Ft(T)-8 b(ell)25 b(the)f(up)s(date)f +(functions)h(that)h(w)m(e)f(ha)m(v)m(e)h(mo)m(v)m(ed)g(on)m(to)h(a)e +(new)g(line,)i(with)d Fj(rl)p 3106 2200 28 4 v 40 w(prompt)i +Ft(already)390 2309 y(displa)m(y)m(ed.)41 b(This)28 b(could)g(b)s(e)g +(used)g(b)m(y)g(applications)i(that)f(w)m(an)m(t)h(to)f(output)f(the)h +(prompt)f(string)390 2419 y(themselv)m(es,)h(but)e(still)h(need)g +(Readline)g(to)g(kno)m(w)f(the)h(prompt)e(string)h(length)h(for)f +(redispla)m(y)-8 b(.)41 b(It)390 2528 y(should)29 b(b)s(e)h(used)g +(after)h(setting)g Fj(rl)p 1590 2528 V 40 w(already)p +1920 2528 V 41 w(prompted)p Ft(.)3350 2705 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_clear_visible_line)f Fg(\()p Ff(v)m(oid)p +Fg(\))390 2814 y Ft(Clear)31 b(the)f(screen)h(lines)f(corresp)s(onding) +g(to)h(the)f(curren)m(t)g(line's)h(con)m(ten)m(ts.)3350 +2991 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_reset_line_state)e +Fg(\()p Ff(v)m(oid)p Fg(\))390 3100 y Ft(Reset)36 b(the)e(displa)m(y)h +(state)h(to)g(a)f(clean)g(state)h(and)e(redispla)m(y)h(the)g(curren)m +(t)g(line)g(starting)g(on)g(a)390 3210 y(new)30 b(line.)3350 +3386 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_crlf)48 +b Fg(\()p Ff(v)m(oid)p Fg(\))390 3496 y Ft(Mo)m(v)m(e)32 +b(the)f(cursor)f(to)h(the)f(start)h(of)g(the)f(next)h(screen)f(line.) +3350 3672 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_show_char)c +Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 3782 y Ft(Displa)m(y)g(c)m +(haracter)g Fj(c)k Ft(on)32 b Fs(rl_outstream)p Ft(.)44 +b(If)32 b(Readline)h(has)g(not)f(b)s(een)g(set)h(to)g(displa)m(y)g +(meta)390 3891 y(c)m(haracters)27 b(directly)-8 b(,)29 +b(this)c(will)i(con)m(v)m(ert)g(meta)g(c)m(haracters)h(to)e(a)h +(meta-pre\014xed)f(k)m(ey)g(sequence.)390 4001 y(This)k(is)g(in)m +(tended)g(for)g(use)g(b)m(y)h(applications)g(whic)m(h)f(wish)g(to)h(do) +f(their)h(o)m(wn)f(redispla)m(y)-8 b(.)3350 4177 y([F)g(unction])-3599 +b Fh(int)53 b(rl_message)c Fg(\()p Ff(const)34 b(c)m(har)g(*,)k(.)24 +b(.)g(.)12 b Fg(\))390 4287 y Ft(The)20 b(argumen)m(ts)h(are)g(a)g +(format)g(string)g(as)f(w)m(ould)h(b)s(e)f(supplied)f(to)j +Fs(printf)p Ft(,)f(p)s(ossibly)e(con)m(taining)390 4396 +y(con)m(v)m(ersion)45 b(sp)s(eci\014cations)g(suc)m(h)f(as)g(`)p +Fs(\045d)p Ft(',)k(and)c(an)m(y)g(additional)h(argumen)m(ts)g +(necessary)f(to)390 4506 y(satisfy)e(the)f(con)m(v)m(ersion)i(sp)s +(eci\014cations.)74 b(The)41 b(resulting)h(string)f(is)g(displa)m(y)m +(ed)h(in)f(the)h Fj(ec)m(ho)390 4616 y(area)p Ft(.)63 +b(The)37 b(ec)m(ho)i(area)f(is)g(also)g(used)f(to)h(displa)m(y)g(n)m +(umeric)f(argumen)m(ts)h(and)f(searc)m(h)h(strings.)390 +4725 y(Y)-8 b(ou)34 b(should)e(call)j Fs(rl_save_prompt)29 +b Ft(to)34 b(sa)m(v)m(e)h(the)f(prompt)e(information)i(b)s(efore)f +(calling)i(this)390 4835 y(function.)3350 5011 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_clear_message)e Fg(\()p +Ff(v)m(oid)p Fg(\))390 5121 y Ft(Clear)29 b(the)g(message)h(in)f(the)g +(ec)m(ho)h(area.)41 b(If)29 b(the)g(prompt)f(w)m(as)h(sa)m(v)m(ed)h +(with)f(a)g(call)i(to)e Fs(rl_save_)390 5230 y(prompt)38 +b Ft(b)s(efore)h(the)g(last)h(call)h(to)f Fs(rl_message)p +Ft(,)f(call)i Fs(rl_restore_prompt)34 b Ft(b)s(efore)39 +b(calling)390 5340 y(this)30 b(function.)p eop end +%%Page: 41 45 +TeXDict begin 41 44 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(41)3350 +299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_save_prompt)49 +b Fg(\()p Ff(v)m(oid)p Fg(\))390 408 y Ft(Sa)m(v)m(e)44 +b(the)f(lo)s(cal)i(Readline)e(prompt)f(displa)m(y)i(state)g(in)f +(preparation)g(for)g(displa)m(ying)g(a)g(new)390 518 +y(message)31 b(in)g(the)f(message)i(area)f(with)f Fs(rl_message\(\))p +Ft(.)3350 722 y([F)-8 b(unction])-3599 b Fh(void)54 b +(rl_restore_prompt)c Fg(\()p Ff(v)m(oid)p Fg(\))390 832 +y Ft(Restore)44 b(the)e(lo)s(cal)i(Readline)g(prompt)d(displa)m(y)i +(state)h(sa)m(v)m(ed)g(b)m(y)f(the)f(most)h(recen)m(t)h(call)g(to)390 +941 y Fs(rl_save_prompt)p Ft(.)69 b(if)41 b Fs(rl_save_prompt)d +Ft(w)m(as)j(called)i(to)f(sa)m(v)m(e)h(the)e(prompt)f(b)s(efore)h(a)h +(call)390 1051 y(to)37 b Fs(rl_message)p Ft(,)f(this)h(function)f +(should)g(b)s(e)g(called)i(b)s(efore)f(the)g(corresp)s(onding)e(call)j +(to)g Fs(rl_)390 1161 y(clear_message)p Ft(.)3350 1365 +y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_expand_prompt)e +Fg(\()p Ff(c)m(har)34 b(*prompt)p Fg(\))390 1474 y Ft(Expand)41 +b(an)m(y)j(sp)s(ecial)f(c)m(haracter)h(sequences)f(in)g +Fj(prompt)g Ft(and)f(set)i(up)d(the)i(lo)s(cal)h(Readline)390 +1584 y(prompt)35 b(redispla)m(y)h(v)-5 b(ariables.)57 +b(This)35 b(function)h(is)g(called)h(b)m(y)e Fs(readline\(\))p +Ft(.)55 b(It)35 b(ma)m(y)i(also)g(b)s(e)390 1694 y(called)22 +b(to)g(expand)f(the)g(primary)f(prompt)g(if)i(the)f Fs +(rl_on_new_line_with_prom)o(pt\()o(\))15 b Ft(function)390 +1803 y(or)25 b Fs(rl_already_prompted)c Ft(v)-5 b(ariable)26 +b(is)f(used.)39 b(It)25 b(returns)f(the)i(n)m(um)m(b)s(er)e(of)i +(visible)f(c)m(haracters)390 1913 y(on)34 b(the)g(last)g(line)g(of)g +(the)g(\(p)s(ossibly)f(m)m(ulti-line\))j(prompt.)50 b(Applications)34 +b(ma)m(y)h(indicate)f(that)390 2022 y(the)28 b(prompt)f(con)m(tains)i +(c)m(haracters)g(that)g(tak)m(e)g(up)e(no)h(ph)m(ysical)g(screen)g +(space)g(when)f(displa)m(y)m(ed)390 2132 y(b)m(y)41 b(brac)m(k)m(eting) +i(a)e(sequence)g(of)g(suc)m(h)g(c)m(haracters)h(with)f(the)g(sp)s +(ecial)h(mark)m(ers)f Fs(RL_PROMPT_)390 2242 y(START_IGNORE)34 +b Ft(and)j Fs(RL_PROMPT_END_IGNORE)32 b Ft(\(declared)39 +b(in)e Fs(readline.h)e Ft(as)j(`)p Fs(\\001)p Ft(')f(and)390 +2351 y(`)p Fs(\\002)p Ft(',)31 b(resp)s(ectiv)m(ely\).)46 +b(This)31 b(ma)m(y)h(b)s(e)f(used)f(to)j(em)m(b)s(ed)e(terminal-sp)s +(eci\014c)h(escap)s(e)g(sequences)390 2461 y(in)e(prompts.)3350 +2665 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_set_prompt)d +Fg(\()p Ff(const)34 b(c)m(har)g(*prompt)p Fg(\))390 2775 +y Ft(Mak)m(e)28 b(Readline)g(use)f Fj(prompt)h Ft(for)e(subsequen)m(t)h +(redispla)m(y)-8 b(.)40 b(This)26 b(calls)i Fs(rl_expand_prompt\(\))390 +2884 y Ft(to)j(expand)f(the)g(prompt)g(and)g(sets)g Fs(rl_prompt)e +Ft(to)j(the)g(result.)150 3093 y Fi(2.4.7)63 b(Mo)s(difying)43 +b(T)-10 b(ext)3350 3300 y Ft([F)i(unction])-3599 b Fh(int)53 +b(rl_insert_text)d Fg(\()p Ff(const)34 b(c)m(har)g(*text)p +Fg(\))390 3410 y Ft(Insert)d Fj(text)k Ft(in)m(to)d(the)g(line)g(at)g +(the)g(curren)m(t)f(cursor)g(p)s(osition.)45 b(Returns)30 +b(the)i(n)m(um)m(b)s(er)f(of)g(c)m(har-)390 3519 y(acters)g(inserted.) +3350 3723 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_delete_text)d +Fg(\()p Ff(in)m(t)33 b(start,)g(in)m(t)g(end)p Fg(\))390 +3833 y Ft(Delete)40 b(the)e(text)h(b)s(et)m(w)m(een)f +Fj(start)i Ft(and)d Fj(end)k Ft(in)c(the)h(curren)m(t)g(line.)63 +b(Returns)36 b(the)i(n)m(um)m(b)s(er)f(of)390 3943 y(c)m(haracters)32 +b(deleted.)3350 4147 y([F)-8 b(unction])-3599 b Fh(char)54 +b(*)e(rl_copy_text)d Fg(\()p Ff(in)m(t)34 b(start,)e(in)m(t)h(end)p +Fg(\))390 4256 y Ft(Return)d(a)g(cop)m(y)h(of)g(the)g(text)g(b)s(et)m +(w)m(een)g Fj(start)i Ft(and)d Fj(end)j Ft(in)d(the)h(curren)m(t)f +(line.)3350 4461 y([F)-8 b(unction])-3599 b Fh(int)53 +b(rl_kill_text)c Fg(\()p Ff(in)m(t)34 b(start,)e(in)m(t)i(end)p +Fg(\))390 4570 y Ft(Cop)m(y)g(the)g(text)i(b)s(et)m(w)m(een)e +Fj(start)j Ft(and)d Fj(end)j Ft(in)d(the)g(curren)m(t)g(line)g(to)h +(the)f(kill)h(ring,)g(app)s(ending)390 4680 y(or)f(prep)s(ending)e(to)j +(the)f(last)h(kill)f(if)g(the)g(last)h(command)f(w)m(as)g(a)h(kill)f +(command.)51 b(The)34 b(text)h(is)390 4789 y(deleted.)51 +b(If)33 b Fj(start)j Ft(is)e(less)g(than)f Fj(end)p Ft(,)h(the)g(text)g +(is)g(app)s(ended,)f(otherwise)h(prep)s(ended.)48 b(If)33 +b(the)390 4899 y(last)e(command)f(w)m(as)h(not)g(a)f(kill,)i(a)f(new)e +(kill)i(ring)g(slot)g(is)f(used.)3350 5103 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_push_macro_input)e Fg(\()p Ff(c)m(har)35 +b(*macro)p Fg(\))390 5213 y Ft(Cause)28 b Fj(macro)33 +b Ft(to)c(b)s(e)f(inserted)g(in)m(to)h(the)g(line,)g(as)f(if)h(it)f +(had)g(b)s(een)g(in)m(v)m(ok)m(ed)h(b)m(y)f(a)h(k)m(ey)g(b)s(ound)d(to) +390 5322 y(a)31 b(macro.)41 b(Not)31 b(esp)s(ecially)h(useful;)e(use)g +Fs(rl_insert_text\(\))c Ft(instead.)p eop end +%%Page: 42 46 +TeXDict begin 42 45 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(42)150 +299 y Fi(2.4.8)63 b(Character)39 b(Input)3350 505 y Ft([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_read_key)c Fg(\()p +Ff(v)m(oid)p Fg(\))390 615 y Ft(Return)29 b(the)g(next)h(c)m(haracter)h +(a)m(v)-5 b(ailable)32 b(from)d(Readline's)h(curren)m(t)f(input)g +(stream.)41 b(This)28 b(han-)390 724 y(dles)e(input)g(inserted)g(in)m +(to)i(the)e(input)g(stream)h(via)g Fj(rl)p 2226 724 28 +4 v 40 w(p)s(ending)p 2583 724 V 38 w(input)h Ft(\(see)f(Section)h(2.3) +f([Read-)390 834 y(line)40 b(V)-8 b(ariables],)43 b(page)d(29\))g(and)f +Fs(rl_stuff_char\(\))p Ft(,)f(macros,)k(and)d(c)m(haracters)h(read)f +(from)390 943 y(the)34 b(k)m(eyb)s(oard.)52 b(While)35 +b(w)m(aiting)g(for)f(input,)g(this)g(function)g(will)g(call)i(an)m(y)e +(function)g(assigned)390 1053 y(to)d(the)g Fs(rl_event_hook)26 +b Ft(v)-5 b(ariable.)3350 1256 y([F)d(unction])-3599 +b Fh(int)53 b(rl_getc)48 b Fg(\()p Ff(FILE)33 b(*stream)p +Fg(\))390 1365 y Ft(Return)20 b(the)i(next)f(c)m(haracter)i(a)m(v)-5 +b(ailable)24 b(from)c Fj(stream)p Ft(,)k(whic)m(h)d(is)g(assumed)g(to)h +(b)s(e)e(the)i(k)m(eyb)s(oard.)3350 1568 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_stuff_char)d Fg(\()p Ff(in)m(t)33 b(c)p +Fg(\))390 1678 y Ft(Insert)f Fj(c)39 b Ft(in)m(to)34 +b(the)f(Readline)g(input)f(stream.)49 b(It)33 b(will)g(b)s(e)f +Fs(")p Ft(read)p Fs(")g Ft(b)s(efore)h(Readline)g(attempts)390 +1787 y(to)27 b(read)g(c)m(haracters)h(from)f(the)g(terminal)g(with)f +Fs(rl_read_key\(\))p Ft(.)36 b(Up)27 b(to)g(512)h(c)m(haracters)g(ma)m +(y)390 1897 y(b)s(e)i(pushed)f(bac)m(k.)42 b Fs(rl_stuff_char)27 +b Ft(returns)i(1)i(if)f(the)h(c)m(haracter)h(w)m(as)f(successfully)g +(inserted;)390 2007 y(0)g(otherwise.)3350 2209 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_execute_next)d Fg(\()p +Ff(in)m(t)34 b(c)p Fg(\))390 2319 y Ft(Mak)m(e)j Fj(c)42 +b Ft(b)s(e)35 b(the)h(next)f(command)h(to)g(b)s(e)f(executed)i(when)d +Fs(rl_read_key\(\))e Ft(is)k(called.)58 b(This)390 2429 +y(sets)31 b Fj(rl)p 635 2429 V 40 w(p)s(ending)p 992 +2429 V 38 w(input)p Ft(.)3350 2631 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_clear_pending_inpu)q(t)e Fg(\()p Ff(v)m(oid)p +Fg(\))390 2741 y Ft(Unset)42 b Fj(rl)p 729 2741 V 40 +w(p)s(ending)p 1086 2741 V 38 w(input)p Ft(,)i(e\013ectiv)m(ely)h +(negating)e(the)f(e\013ect)h(of)f(an)m(y)g(previous)f(call)i(to)g +Fs(rl_)390 2851 y(execute_next\(\))p Ft(.)59 b(This)36 +b(w)m(orks)i(only)g(if)f(the)h(p)s(ending)e(input)h(has)g(not)h +(already)g(b)s(een)f(read)390 2960 y(with)30 b Fs(rl_read_key\(\))p +Ft(.)3350 3163 y([F)-8 b(unction])-3599 b Fh(int)53 b +(rl_set_keyboard_input)q(_tim)q(eou)q(t)e Fg(\()p Ff(in)m(t)34 +b(u)p Fg(\))390 3273 y Ft(While)41 b(w)m(aiting)g(for)f(k)m(eyb)s(oard) +g(input)f(in)h Fs(rl_read_key\(\))p Ft(,)f(Readline)i(will)f(w)m(ait)h +(for)f Fj(u)g Ft(mi-)390 3382 y(croseconds)31 b(for)g(input)f(b)s +(efore)g(calling)j(an)m(y)e(function)f(assigned)i(to)f +Fs(rl_event_hook)p Ft(.)39 b Fj(u)30 b Ft(m)m(ust)390 +3492 y(b)s(e)h(greater)i(than)f(or)g(equal)g(to)h(zero)f(\(a)h +(zero-length)g(timeout)g(is)f(equiv)-5 b(alen)m(t)33 +b(to)g(a)f(p)s(oll\).)45 b(The)390 3601 y(default)31 +b(w)m(aiting)g(p)s(erio)s(d)e(is)i(one-ten)m(th)g(of)g(a)g(second.)40 +b(Returns)30 b(the)g(old)h(timeout)g(v)-5 b(alue.)3350 +3804 y([F)d(unction])-3599 b Fh(int)53 b(rl_set_timeout)d +Fg(\()p Ff(unsigned)35 b(in)m(t)e(secs,)h(unsigned)h(in)m(t)e(usecs)p +Fg(\))390 3914 y Ft(Set)f(a)g(timeout)h(for)f(subsequen)m(t)f(calls)j +(to)e Fs(readline\(\))p Ft(.)43 b(If)31 b(Readline)i(do)s(es)f(not)g +(read)g(a)g(com-)390 4024 y(plete)37 b(line,)h(or)e(the)g(n)m(um)m(b)s +(er)f(of)h(c)m(haracters)i(sp)s(eci\014ed)d(b)m(y)h Fs +(rl_num_chars_to_read)p Ft(,)c(b)s(efore)390 4133 y(the)h(duration)g +(sp)s(eci\014ed)g(b)m(y)g Fj(secs)38 b Ft(\(in)33 b(seconds\))h(and)e +Fj(usecs)37 b Ft(\(microseconds\),)f(it)d(returns)g(and)390 +4243 y(sets)22 b Fs(RL_STATE_TIMEOUT)17 b Ft(in)k Fs(rl_readline_state) +p Ft(.)33 b(P)m(assing)22 b(0)g(for)f Fs(secs)g Ft(and)g +Fs(usecs)f Ft(cancels)390 4352 y(an)m(y)k(previously)f(set)h(timeout;)j +(the)d(con)m(v)m(enience)h(macro)f Fs(rl_clear_timeout\(\))19 +b Ft(is)k(shorthand)390 4462 y(for)30 b(this.)41 b(Returns)29 +b(0)i(if)f(the)h(timeout)g(is)g(set)g(successfully)-8 +b(.)3350 4665 y([F)g(unction])-3599 b Fh(int)53 b(rl_timeout_remaining) +f Fg(\()p Ff(unsigned)33 b(in)m(t)f(*secs,)h(unsigned)g(in)m(t)f +(*usecs)p Fg(\))390 4774 y Ft(Return)38 b(the)h(n)m(um)m(b)s(er)e(of)i +(seconds)f(and)g(microseconds)h(remaining)g(in)f(the)h(curren)m(t)f +(timeout)390 4884 y(duration)26 b(in)g Fj(*secs)31 b +Ft(and)26 b Fj(*usecs)p Ft(,)i(resp)s(ectiv)m(ely)-8 +b(.)41 b(Both)27 b Fj(*secs)k Ft(and)26 b Fj(*usecs)k +Ft(m)m(ust)c(b)s(e)g(non-NULL)390 4994 y(to)j(return)f(an)m(y)h(v)-5 +b(alues.)40 b(The)29 b(return)e(v)-5 b(alue)29 b(is)g(-1)g(on)g(error)f +(or)h(when)e(there)i(is)g(no)f(timeout)i(set,)390 5103 +y(0)35 b(when)e(the)i(timeout)h(has)e(expired)g(\(lea)m(ving)j +Fj(*secs)i Ft(and)34 b Fj(*usecs)39 b Ft(unc)m(hanged\),)c(and)f(1)h +(if)g(the)390 5213 y(timeout)27 b(has)e(not)h(expired.)38 +b(If)26 b(either)g(of)f Fj(secs)30 b Ft(and)25 b Fj(usecs)k +Ft(is)d Fs(NULL)p Ft(,)g(the)f(return)g(v)-5 b(alue)26 +b(indicates)390 5322 y(whether)k(the)g(timeout)i(has)e(expired.)p +eop end +%%Page: 43 47 +TeXDict begin 43 46 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(43)150 +299 y Fi(2.4.9)63 b(T)-10 b(erminal)41 b(Managemen)m(t)3350 +496 y Ft([F)-8 b(unction])-3599 b Fh(void)54 b(rl_prep_terminal)c +Fg(\()p Ff(in)m(t)33 b(meta)p 1704 496 30 5 v 44 w(\015ag)p +Fg(\))390 606 y Ft(Mo)s(dify)42 b(the)h(terminal)g(settings)g(for)f +(Readline's)i(use,)h(so)e Fs(readline\(\))c Ft(can)k(read)f(a)h(single) +390 716 y(c)m(haracter)32 b(at)g(a)f(time)h(from)e(the)h(k)m(eyb)s +(oard.)43 b(The)30 b Fj(meta)p 2376 716 28 4 v 41 w(\015ag)39 +b Ft(argumen)m(t)31 b(should)f(b)s(e)g(non-zero)390 825 +y(if)g(Readline)h(should)f(read)g(eigh)m(t-bit)i(input.)3350 +1011 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_deprep_terminal)c +Fg(\()p Ff(v)m(oid)p Fg(\))390 1121 y Ft(Undo)31 b(the)h(e\013ects)h +(of)f Fs(rl_prep_terminal\(\))p Ft(,)27 b(lea)m(ving)33 +b(the)f(terminal)g(in)f(the)h(state)h(in)e(whic)m(h)390 +1230 y(it)g(w)m(as)g(b)s(efore)f(the)g(most)h(recen)m(t)g(call)h(to)f +Fs(rl_prep_terminal\(\))p Ft(.)3350 1416 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_tty_set_default_bindi)q(ngs)e Fg(\()p +Ff(Keymap)34 b(kmap)p Fg(\))390 1526 y Ft(Read)j(the)g(op)s(erating)h +(system's)f(terminal)g(editing)h(c)m(haracters)g(\(as)g(w)m(ould)e(b)s +(e)h(displa)m(y)m(ed)g(b)m(y)390 1635 y Fs(stty)p Ft(\))30 +b(to)h(their)f(Readline)h(equiv)-5 b(alen)m(ts.)42 b(The)30 +b(bindings)f(are)i(p)s(erformed)e(in)h Fj(kmap)p Ft(.)3350 +1821 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_tty_unset_default_bin)q +(din)q(gs)e Fg(\()p Ff(Keymap)34 b(kmap)p Fg(\))390 1931 +y Ft(Reset)f(the)f(bindings)e(manipulated)i(b)m(y)g Fs +(rl_tty_set_default_bind)o(ing)o(s)26 b Ft(so)32 b(that)g(the)g(ter-) +390 2040 y(minal)40 b(editing)g(c)m(haracters)h(are)f(b)s(ound)e(to)i +Fs(rl_insert)p Ft(.)66 b(The)39 b(bindings)f(are)i(p)s(erformed)e(in) +390 2150 y Fj(kmap)p Ft(.)3350 2336 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_tty_set_echoing)e Fg(\()p Ff(in)m(t)34 +b(v)-6 b(alue)p Fg(\))390 2445 y Ft(Set)48 b(Readline's)g(idea)g(of)g +(whether)f(or)g(not)h(it)g(is)f(ec)m(hoing)i(output)e(to)i(its)e +(output)h(stream)390 2555 y(\()p Fj(rl)p 492 2555 V 40 +w(outstream)p Ft(\).)j(If)32 b Fj(v)-5 b(alue)39 b Ft(is)34 +b(0,)g(Readline)g(do)s(es)f(not)h(displa)m(y)f(output)g(to)h +Fj(rl)p 3115 2555 V 40 w(outstream)p Ft(;)i(an)m(y)390 +2665 y(other)43 b(v)-5 b(alue)43 b(enables)h(output.)77 +b(The)43 b(initial)h(v)-5 b(alue)43 b(is)g(set)g(when)f(Readline)i +(initializes)h(the)390 2774 y(terminal)31 b(settings.)42 +b(This)29 b(function)h(returns)f(the)i(previous)f(v)-5 +b(alue.)3350 2960 y([F)d(unction])-3599 b Fh(int)53 b +(rl_reset_terminal)e Fg(\()p Ff(const)34 b(c)m(har)g(*terminal)p +2232 2960 30 5 v 43 w(name)p Fg(\))390 3070 y Ft(Reinitialize)26 +b(Readline's)f(idea)f(of)g(the)g(terminal)h(settings)f(using)g +Fj(terminal)p 2977 3070 28 4 v 40 w(name)29 b Ft(as)24 +b(the)g(termi-)390 3179 y(nal)32 b(t)m(yp)s(e)g(\(e.g.,)i +Fs(vt100)p Ft(\).)44 b(If)31 b Fj(terminal)p 1753 3179 +V 41 w(name)37 b Ft(is)31 b Fs(NULL)p Ft(,)h(the)g(v)-5 +b(alue)32 b(of)g(the)g Fs(TERM)e Ft(en)m(vironmen)m(t)390 +3289 y(v)-5 b(ariable)31 b(is)g(used.)150 3489 y Fi(2.4.10)63 +b(Utilit)m(y)40 b(F)-10 b(unctions)3350 3686 y Ft([F)i(unction])-3599 +b Fh(int)53 b(rl_save_state)d Fg(\()p Ff(struct)34 b(readline)p +1759 3686 30 5 v 44 w(state)f(*sp)p Fg(\))390 3796 y +Ft(Sa)m(v)m(e)d(a)f(snapshot)e(of)i(Readline's)g(in)m(ternal)g(state)h +(to)f Fj(sp)p Ft(.)40 b(The)28 b(con)m(ten)m(ts)i(of)e(the)h +Fj(readline)p 3518 3796 28 4 v 40 w(state)390 3906 y +Ft(structure)g(are)g(do)s(cumen)m(ted)g(in)g Fs(readline.h)p +Ft(.)38 b(The)28 b(caller)j(is)e(resp)s(onsible)f(for)h(allo)s(cating)j +(the)390 4015 y(structure.)3350 4201 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_restore_state)e Fg(\()p Ff(struct)34 +b(readline)p 1916 4201 30 5 v 44 w(state)f(*sp)p Fg(\))390 +4311 y Ft(Restore)23 b(Readline's)g(in)m(ternal)g(state)g(to)g(that)g +(stored)f(in)g Fj(sp)p Ft(,)i(whic)m(h)d(m)m(ust)h(ha)m(v)m(e)i(b)s +(een)d(sa)m(v)m(ed)i(b)m(y)g(a)390 4420 y(call)30 b(to)g +Fs(rl_save_state)p Ft(.)37 b(The)28 b(con)m(ten)m(ts)j(of)e(the)g +Fj(readline)p 2470 4420 28 4 v 41 w(state)35 b Ft(structure)29 +b(are)g(do)s(cumen)m(ted)390 4530 y(in)h Fs(readline.h)p +Ft(.)38 b(The)30 b(caller)i(is)e(resp)s(onsible)f(for)i(freeing)f(the)h +(structure.)3350 4716 y([F)-8 b(unction])-3599 b Fh(void)54 +b(rl_free)47 b Fg(\()p Ff(v)m(oid)33 b(*mem)p Fg(\))390 +4825 y Ft(Deallo)s(cate)25 b(the)c(memory)g(p)s(oin)m(ted)g(to)h(b)m(y) +f Fj(mem)p Ft(.)38 b Fj(mem)21 b Ft(m)m(ust)g(ha)m(v)m(e)i(b)s(een)d +(allo)s(cated)j(b)m(y)e Fs(malloc)p Ft(.)3350 5011 y([F)-8 +b(unction])-3599 b Fh(void)54 b(rl_replace_line)c Fg(\()p +Ff(const)34 b(c)m(har)f(*text,)g(in)m(t)g(clear)p 2406 +5011 30 5 v 44 w(undo)p Fg(\))390 5121 y Ft(Replace)41 +b(the)e(con)m(ten)m(ts)i(of)f Fs(rl_line_buffer)35 b +Ft(with)k Fj(text)p Ft(.)69 b(The)39 b(p)s(oin)m(t)h(and)e(mark)h(are)h +(pre-)390 5230 y(serv)m(ed,)27 b(if)e(p)s(ossible.)39 +b(If)25 b Fj(clear)p 1422 5230 28 4 v 41 w(undo)k Ft(is)d(non-zero,)h +(the)f(undo)e(list)i(asso)s(ciated)h(with)e(the)h(curren)m(t)390 +5340 y(line)31 b(is)f(cleared.)p eop end +%%Page: 44 48 +TeXDict begin 44 47 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(44)3350 +299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_extend_line_buffer)d +Fg(\()p Ff(in)m(t)34 b(len)p Fg(\))390 408 y Ft(Ensure)29 +b(that)h Fs(rl_line_buffer)d Ft(has)j(enough)f(space)i(to)g(hold)f +Fj(len)g Ft(c)m(haracters,)i(p)s(ossibly)d(real-)390 +518 y(lo)s(cating)j(it)f(if)f(necessary)-8 b(.)3350 756 +y([F)g(unction])-3599 b Fh(int)53 b(rl_initialize)d Fg(\()p +Ff(v)m(oid)p Fg(\))390 865 y Ft(Initialize)39 b(or)e(re-initialize)i +(Readline's)f(in)m(ternal)f(state.)62 b(It's)37 b(not)g(strictly)h +(necessary)f(to)h(call)390 975 y(this;)31 b Fs(readline\(\))c +Ft(calls)32 b(it)f(b)s(efore)f(reading)g(an)m(y)h(input.)3350 +1212 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_ding)48 +b Fg(\()p Ff(v)m(oid)p Fg(\))390 1322 y Ft(Ring)30 b(the)h(terminal)g +(b)s(ell,)f(ob)s(eying)h(the)f(setting)i(of)e Fs(bell-style)p +Ft(.)3350 1559 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_alphabetic)d +Fg(\()p Ff(in)m(t)33 b(c)p Fg(\))390 1669 y Ft(Return)d(1)g(if)h +Fj(c)36 b Ft(is)30 b(an)h(alphab)s(etic)g(c)m(haracter.)3350 +1906 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_display_match_list)d +Fg(\()p Ff(c)m(har)35 b(**matc)m(hes,)e(in)m(t)g(len,)h(in)m(t)f(max)p +Fg(\))390 2016 y Ft(A)i(con)m(v)m(enience)h(function)e(for)g(displa)m +(ying)h(a)g(list)g(of)g(strings)f(in)g(columnar)g(format)h(on)f(Read-) +390 2126 y(line's)g(output)f(stream.)51 b Fs(matches)31 +b Ft(is)j(the)f(list)i(of)e(strings,)i(in)e(argv)h(format,)h(suc)m(h)e +(as)h(a)g(list)g(of)390 2235 y(completion)26 b(matc)m(hes.)39 +b Fs(len)24 b Ft(is)g(the)g(n)m(um)m(b)s(er)f(of)i(strings)f(in)g +Fs(matches)p Ft(,)f(and)h Fs(max)f Ft(is)i(the)f(length)h(of)390 +2345 y(the)h(longest)i(string)e(in)g Fs(matches)p Ft(.)37 +b(This)25 b(function)h(uses)g(the)g(setting)i(of)e Fs +(print-completions-)390 2454 y(horizontally)33 b Ft(to)k(select)h(ho)m +(w)e(the)g(matc)m(hes)i(are)e(displa)m(y)m(ed)h(\(see)g(Section)g +(1.3.1)h([Readline)390 2564 y(Init)30 b(File)h(Syn)m(tax],)g(page)g +(4\).)42 b(When)29 b(displa)m(ying)i(completions,)h(this)e(function)g +(sets)g(the)g(n)m(um-)390 2674 y(b)s(er)23 b(of)g(columns)g(used)g(for) +h(displa)m(y)f(to)i(the)e(v)-5 b(alue)24 b(of)g Fs +(completion-display-width)p Ft(,)19 b(the)k(v)-5 b(alue)390 +2783 y(of)31 b(the)f(en)m(vironmen)m(t)h(v)-5 b(ariable)31 +b Fs(COLUMNS)p Ft(,)e(or)h(the)h(screen)f(width,)g(in)g(that)h(order.) +275 3021 y(The)g(follo)m(wing)j(are)e(implemen)m(ted)h(as)f(macros,)h +(de\014ned)e(in)h Fs(chardefs.h)p Ft(.)43 b(Applications)33 +b(should)150 3130 y(refrain)d(from)g(using)g(them.)3350 +3368 y([F)-8 b(unction])-3599 b Fh(int)53 b(_rl_uppercase_p)d +Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 3477 y Ft(Return)c(1)g(if)h +Fj(c)36 b Ft(is)30 b(an)h(upp)s(ercase)e(alphab)s(etic)i(c)m(haracter.) +3350 3715 y([F)-8 b(unction])-3599 b Fh(int)53 b(_rl_lowercase_p)d +Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 3824 y Ft(Return)c(1)g(if)h +Fj(c)36 b Ft(is)30 b(a)h(lo)m(w)m(ercase)i(alphab)s(etic)e(c)m +(haracter.)3350 4062 y([F)-8 b(unction])-3599 b Fh(int)53 +b(_rl_digit_p)c Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 +4171 y Ft(Return)c(1)g(if)h Fj(c)36 b Ft(is)30 b(a)h(n)m(umeric)f(c)m +(haracter.)3350 4409 y([F)-8 b(unction])-3599 b Fh(int)53 +b(_rl_to_upper)c Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 +4519 y Ft(If)23 b Fj(c)30 b Ft(is)24 b(a)g(lo)m(w)m(ercase)i(alphab)s +(etic)e(c)m(haracter,)j(return)c(the)h(corresp)s(onding)e(upp)s(ercase) +h(c)m(haracter.)3350 4756 y([F)-8 b(unction])-3599 b +Fh(int)53 b(_rl_to_lower)c Fg(\()p Ff(in)m(t)34 b(c)p +Fg(\))390 4866 y Ft(If)28 b Fj(c)35 b Ft(is)29 b(an)g(upp)s(ercase)f +(alphab)s(etic)h(c)m(haracter,)i(return)d(the)h(corresp)s(onding)f(lo)m +(w)m(ercase)j(c)m(harac-)390 4975 y(ter.)3350 5213 y([F)-8 +b(unction])-3599 b Fh(int)53 b(_rl_digit_value)d Fg(\()p +Ff(in)m(t)34 b(c)p Fg(\))390 5322 y Ft(If)c Fj(c)36 b +Ft(is)31 b(a)f(n)m(um)m(b)s(er,)g(return)f(the)h(v)-5 +b(alue)31 b(it)g(represen)m(ts.)p eop end +%%Page: 45 49 +TeXDict begin 45 48 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(45)150 +299 y Fi(2.4.11)63 b(Miscellaneous)42 b(F)-10 b(unctions)3350 +489 y Ft([F)i(unction])-3599 b Fh(int)53 b(rl_macro_bind)d +Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)e(const)i(c)m(har)g +(*macro,)565 598 y(Keymap)g(map)p Fg(\))390 708 y Ft(Bind)23 +b(the)g(k)m(ey)h(sequence)g Fj(k)m(eyseq)i Ft(to)e(in)m(v)m(ok)m(e)h +(the)f(macro)f Fj(macro)p Ft(.)39 b(The)23 b(binding)f(is)i(p)s +(erformed)d(in)390 817 y Fj(map)p Ft(.)39 b(When)28 b +Fj(k)m(eyseq)i Ft(is)e(in)m(v)m(ok)m(ed,)i(the)d Fj(macro)33 +b Ft(will)28 b(b)s(e)f(inserted)g(in)m(to)i(the)e(line.)41 +b(This)26 b(function)390 927 y(is)k(deprecated;)i(use)e +Fs(rl_generic_bind\(\))25 b Ft(instead.)3350 1101 y([F)-8 +b(unction])-3599 b Fh(void)54 b(rl_macro_dumper)c Fg(\()p +Ff(in)m(t)33 b(readable)p Fg(\))390 1210 y Ft(Prin)m(t)27 +b(the)g(k)m(ey)h(sequences)g(b)s(ound)d(to)j(macros)f(and)g(their)g(v) +-5 b(alues,)28 b(using)f(the)g(curren)m(t)g(k)m(eymap,)390 +1320 y(to)32 b Fs(rl_outstream)p Ft(.)40 b(If)31 b Fj(readable)36 +b Ft(is)c(non-zero,)g(the)f(list)h(is)f(formatted)h(in)f(suc)m(h)g(a)g +(w)m(a)m(y)i(that)e(it)390 1429 y(can)g(b)s(e)e(made)i(part)f(of)h(an)f +Fs(inputrc)e Ft(\014le)j(and)e(re-read.)3350 1603 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_variable_bind)e Fg(\()p +Ff(const)34 b(c)m(har)f(*v)-6 b(ariable,)33 b(const)h(c)m(har)f(*v)-6 +b(alue)p Fg(\))390 1713 y Ft(Mak)m(e)28 b(the)f(Readline)g(v)-5 +b(ariable)27 b Fj(v)-5 b(ariable)32 b Ft(ha)m(v)m(e)c +Fj(v)-5 b(alue)p Ft(.)40 b(This)25 b(b)s(eha)m(v)m(es)i(as)g(if)f(the)h +(Readline)g(com-)390 1822 y(mand)j(`)p Fs(set)g Fl(variable)e(value)p +Ft(')h(had)h(b)s(een)h(executed)g(in)g(an)f Fs(inputrc)f +Ft(\014le)i(\(see)h(Section)f(1.3.1)390 1932 y([Readline)g(Init)f(File) +i(Syn)m(tax],)f(page)g(4\).)3350 2106 y([F)-8 b(unction])-3599 +b Fh(char)54 b(*)e(rl_variable_value)f Fg(\()p Ff(const)34 +b(c)m(har)g(*v)-6 b(ariable)p Fg(\))390 2215 y Ft(Return)28 +b(a)i(string)f(represen)m(ting)h(the)f(v)-5 b(alue)30 +b(of)f(the)h(Readline)g(v)-5 b(ariable)30 b Fj(v)-5 b(ariable)p +Ft(.)41 b(F)-8 b(or)30 b(b)s(o)s(olean)390 2325 y(v)-5 +b(ariables,)31 b(this)g(string)f(is)g(either)h(`)p Fs(on)p +Ft(')f(or)h(`)p Fs(off)p Ft('.)3350 2499 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_variable_dumper)c Fg(\()p Ff(in)m(t)34 +b(readable)p Fg(\))390 2608 y Ft(Prin)m(t)44 b(the)h(Readline)g(v)-5 +b(ariable)45 b(names)f(and)g(their)g(curren)m(t)g(v)-5 +b(alues)45 b(to)g Fs(rl_outstream)p Ft(.)79 b(If)390 +2718 y Fj(readable)37 b Ft(is)32 b(non-zero,)h(the)e(list)i(is)e +(formatted)h(in)g(suc)m(h)f(a)h(w)m(a)m(y)h(that)f(it)g(can)g(b)s(e)f +(made)g(part)h(of)390 2827 y(an)e Fs(inputrc)f Ft(\014le)h(and)g +(re-read.)3350 3001 y([F)-8 b(unction])-3599 b Fh(int)53 +b(rl_set_paren_blink_ti)q(meou)q(t)f Fg(\()p Ff(in)m(t)33 +b(u)p Fg(\))390 3111 y Ft(Set)25 b(the)h(time)f(in)m(terv)-5 +b(al)27 b(\(in)e(microseconds\))h(that)g(Readline)f(w)m(aits)h(when)e +(sho)m(wing)i(a)f(balancing)390 3220 y(c)m(haracter)32 +b(when)d Fs(blink-matching-paren)c Ft(has)30 b(b)s(een)g(enabled.)3350 +3394 y([F)-8 b(unction])-3599 b Fh(char)54 b(*)e(rl_get_termcap)e +Fg(\()p Ff(const)34 b(c)m(har)g(*cap)p Fg(\))390 3504 +y Ft(Retriev)m(e)29 b(the)e(string)g(v)-5 b(alue)27 b(of)g(the)h +(termcap)f(capabilit)m(y)i Fj(cap)p Ft(.)40 b(Readline)27 +b(fetc)m(hes)h(the)g(termcap)390 3613 y(en)m(try)34 b(for)f(the)h +(curren)m(t)f(terminal)h(name)g(and)f(uses)g(those)h(capabilities)h(to) +f(mo)m(v)m(e)h(around)e(the)390 3723 y(screen)21 b(line)h(and)e(p)s +(erform)g(other)h(terminal-sp)s(eci\014c)h(op)s(erations,)h(lik)m(e)f +(erasing)g(a)f(line.)38 b(Readline)390 3832 y(do)s(es)d(not)g(use)g +(all)g(of)h(a)f(terminal's)g(capabilities,)k(and)34 b(this)h(function)g +(will)g(return)f(v)-5 b(alues)35 b(for)390 3942 y(only)30 +b(those)h(capabilities)i(Readline)e(uses.)3350 4116 y([F)-8 +b(unction])-3599 b Fh(void)54 b(rl_clear_history)c Fg(\()p +Ff(v)m(oid)p Fg(\))390 4225 y Ft(Clear)27 b(the)h(history)f(list)h(b)m +(y)f(deleting)h(all)g(of)f(the)h(en)m(tries,)h(in)d(the)i(same)f +(manner)g(as)g(the)g(History)390 4335 y(library's)42 +b Fs(clear_history\(\))d Ft(function.)78 b(This)42 b(di\013ers)g(from)g +Fs(clear_history)e Ft(b)s(ecause)i(it)390 4445 y(frees)30 +b(priv)-5 b(ate)31 b(data)g(Readline)g(sa)m(v)m(es)h(in)e(the)h +(history)f(list.)3350 4618 y([F)-8 b(unction])-3599 b +Fh(void)54 b(rl_activate_mark)c Fg(\()p Ff(v)m(oid)p +Fg(\))390 4728 y Ft(Enable)30 b(an)f Fk(active)37 b Ft(mark.)j(When)30 +b(this)f(is)h(enabled,)g(the)g(text)h(b)s(et)m(w)m(een)f(p)s(oin)m(t)g +(and)f(mark)g(\(the)390 4837 y Fj(region)p Ft(\))c(is)f(displa)m(y)m +(ed)h(in)f(the)g(terminal's)h(standout)f(mo)s(de)f(\(a)i +Fj(face)5 b Ft(\).)40 b(This)24 b(is)g(called)h(b)m(y)f(v)-5 +b(arious)390 4947 y(Readline)28 b(functions)f(that)h(set)g(the)f(mark)g +(and)g(insert)g(text,)j(and)c(is)i(a)m(v)-5 b(ailable)30 +b(for)d(applications)390 5057 y(to)k(call.)3350 5230 +y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_deactivate_mark)c +Fg(\()p Ff(v)m(oid)p Fg(\))390 5340 y Ft(T)-8 b(urn)29 +b(o\013)i(the)f(activ)m(e)j(mark.)p eop end +%%Page: 46 50 +TeXDict begin 46 49 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(46)3350 +299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_keep_mark_active)d +Fg(\()p Ff(v)m(oid)p Fg(\))390 408 y Ft(Indicate)45 b(that)g(the)g +(mark)f(should)g(remain)g(activ)m(e)j(when)c(the)i(curren)m(t)f +(Readline)h(function)390 518 y(completes)28 b(and)e(after)h(redispla)m +(y)g(o)s(ccurs.)40 b(In)26 b(most)h(cases,)h(the)f(mark)g(remains)f +(activ)m(e)j(for)e(only)390 628 y(the)k(duration)f(of)g(a)h(single)g +(bindable)f(Readline)h(function.)3350 799 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_mark_active_p)e Fg(\()p Ff(v)m(oid)p +Fg(\))390 909 y Ft(Return)30 b(a)g(non-zero)h(v)-5 b(alue)31 +b(if)f(the)h(mark)f(is)h(curren)m(tly)f(activ)m(e;)j(zero)e(otherwise.) +150 1100 y Fi(2.4.12)63 b(Alternate)40 b(In)m(terface)150 +1247 y Ft(An)21 b(alternate)j(in)m(terface)f(is)f(a)m(v)-5 +b(ailable)24 b(to)e(plain)g Fs(readline\(\))p Ft(.)35 +b(Some)21 b(applications)i(need)f(to)g(in)m(terlea)m(v)m(e)150 +1356 y(k)m(eyb)s(oard)35 b(I/O)h(with)f(\014le,)i(device,)h(or)e(windo) +m(w)f(system)g(I/O,)h(t)m(ypically)i(b)m(y)d(using)g(a)h(main)g(lo)s +(op)f(to)150 1466 y Fs(select\(\))40 b Ft(on)i(v)-5 b(arious)42 +b(\014le)g(descriptors.)76 b(T)-8 b(o)43 b(accommo)s(date)h(this)e +(need,)j(Readline)e(can)f(also)i(b)s(e)150 1576 y(in)m(v)m(ok)m(ed)33 +b(as)e(a)h(`callbac)m(k')h(function)e(from)g(an)g(ev)m(en)m(t)h(lo)s +(op.)44 b(There)30 b(are)i(functions)f(a)m(v)-5 b(ailable)33 +b(to)f(mak)m(e)150 1685 y(this)e(easy)-8 b(.)3350 1857 +y([F)g(unction])-3599 b Fh(void)54 b(rl_callback_handler_inst)q(all)e +Fg(\()p Ff(const)34 b(c)m(har)g(*prompt,)565 1966 y(rl)p +639 1966 30 5 v 44 w(v)m(cpfunc)p 1016 1966 V 45 w(t)f(*lhandler)p +Fg(\))390 2076 y Ft(Set)23 b(up)e(the)i(terminal)g(for)f(Readline)h +(I/O)g(and)f(displa)m(y)h(the)f(initial)i(expanded)e(v)-5 +b(alue)23 b(of)g Fj(prompt)p Ft(.)390 2186 y(Sa)m(v)m(e)34 +b(the)f(v)-5 b(alue)33 b(of)g Fj(lhandler)39 b Ft(to)34 +b(use)e(as)h(a)g(handler)f(function)h(to)g(call)h(when)e(a)h(complete)i +(line)390 2295 y(of)h(input)f(has)g(b)s(een)g(en)m(tered.)57 +b(The)35 b(handler)g(function)g(receiv)m(es)j(the)e(text)g(of)g(the)g +(line)g(as)g(an)390 2405 y(argumen)m(t.)k(As)29 b(with)f +Fs(readline\(\))p Ft(,)e(the)j(handler)e(function)h(should)g +Fs(free)f Ft(the)h(line)h(when)e(it)i(it)390 2514 y(\014nished)g(with)h +(it.)3350 2686 y([F)-8 b(unction])-3599 b Fh(void)54 +b(rl_callback_read_char)d Fg(\()p Ff(v)m(oid)p Fg(\))390 +2796 y Ft(Whenev)m(er)34 b(an)g(application)h(determines)e(that)i(k)m +(eyb)s(oard)e(input)g(is)h(a)m(v)-5 b(ailable,)37 b(it)d(should)f(call) +390 2905 y Fs(rl_callback_read_char\(\))p Ft(,)17 b(whic)m(h)22 +b(will)g(read)f(the)h(next)g(c)m(haracter)h(from)f(the)f(curren)m(t)h +(input)390 3015 y(source.)40 b(If)27 b(that)i(c)m(haracter)g(completes) +h(the)e(line,)h Fs(rl_callback_read_char)22 b Ft(will)28 +b(in)m(v)m(ok)m(e)i(the)390 3124 y Fj(lhandler)47 b Ft(function)40 +b(installed)i(b)m(y)e Fs(rl_callback_handler_insta)o(ll)35 +b Ft(to)41 b(pro)s(cess)f(the)h(line.)390 3234 y(Before)j(calling)h +(the)e Fj(lhandler)49 b Ft(function,)e(the)c(terminal)h(settings)g(are) +g(reset)f(to)h(the)g(v)-5 b(alues)390 3344 y(they)44 +b(had)e(b)s(efore)h(calling)i Fs(rl_callback_handler_insta)o(ll)p +Ft(.)73 b(If)43 b(the)h Fj(lhandler)49 b Ft(function)390 +3453 y(returns,)27 b(and)h(the)g(line)g(handler)f(remains)h(installed,) +i(the)e(terminal)g(settings)h(are)f(mo)s(di\014ed)f(for)390 +3563 y(Readline's)k(use)f(again.)42 b Fs(EOF)29 b Ft(is)i(indicated)g +(b)m(y)f(calling)i Fj(lhandler)k Ft(with)30 b(a)h Fs(NULL)e +Ft(line.)3350 3735 y([F)-8 b(unction])-3599 b Fh(void)54 +b(rl_callback_sigcleanup)e Fg(\()p Ff(v)m(oid)p Fg(\))390 +3844 y Ft(Clean)26 b(up)e(an)m(y)i(in)m(ternal)g(state)h(the)e(callbac) +m(k)j(in)m(terface)f(uses)e(to)h(main)m(tain)g(state)h(b)s(et)m(w)m +(een)f(calls)390 3954 y(to)35 b(rl)p 572 3954 28 4 v +40 w(callbac)m(k)p 928 3954 V 42 w(read)p 1142 3954 V +40 w(c)m(har)f(\(e.g.,)j(the)e(state)g(of)f(an)m(y)h(activ)m(e)h +(incremen)m(tal)f(searc)m(hes\).)54 b(This)33 b(is)390 +4063 y(in)m(tended)f(to)h(b)s(e)e(used)g(b)m(y)h(applications)h(that)g +(wish)e(to)i(p)s(erform)d(their)j(o)m(wn)f(signal)g(handling;)390 +4173 y(Readline's)f(in)m(ternal)g(signal)g(handler)f(calls)h(this)g +(when)e(appropriate.)3350 4345 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_callback_handler_remo)q(ve)e Fg(\()p +Ff(v)m(oid)p Fg(\))390 4454 y Ft(Restore)37 b(the)f(terminal)g(to)g +(its)h(initial)g(state)g(and)e(remo)m(v)m(e)i(the)f(line)g(handler.)56 +b(Y)-8 b(ou)36 b(ma)m(y)h(call)390 4564 y(this)25 b(function)g(from)g +(within)g(a)h(callbac)m(k)i(as)d(w)m(ell)i(as)f(indep)s(enden)m(tly)-8 +b(.)38 b(If)25 b(the)h Fj(lhandler)31 b Ft(installed)390 +4673 y(b)m(y)25 b Fs(rl_callback_handler_insta)o(ll)19 +b Ft(do)s(es)25 b(not)h(exit)g(the)g(program,)g(either)g(this)f +(function)g(or)390 4783 y(the)32 b(function)f(referred)f(to)i(b)m(y)g +(the)f(v)-5 b(alue)32 b(of)g Fs(rl_deprep_term_function)25 +b Ft(should)30 b(b)s(e)h(called)390 4893 y(b)s(efore)f(the)h(program)f +(exits)h(to)g(reset)g(the)f(terminal)h(settings.)150 +5083 y Fi(2.4.13)63 b(A)41 b(Readline)f(Example)150 5230 +y Ft(Here)34 b(is)g(a)g(function)g(whic)m(h)g(c)m(hanges)g(lo)m(w)m +(ercase)j(c)m(haracters)e(to)f(their)g(upp)s(ercase)f(equiv)-5 +b(alen)m(ts,)37 b(and)150 5340 y(upp)s(ercase)d(c)m(haracters)j(to)f +(lo)m(w)m(ercase.)58 b(If)35 b(this)g(function)g(w)m(as)h(b)s(ound)d +(to)j(`)p Fs(M-c)p Ft(',)h(then)e(t)m(yping)g(`)p Fs(M-c)p +Ft(')p eop end +%%Page: 47 51 +TeXDict begin 47 50 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(47)150 +299 y(w)m(ould)31 b(c)m(hange)i(the)f(case)g(of)g(the)g(c)m(haracter)h +(under)d(p)s(oin)m(t.)44 b(T)m(yping)31 b(`)p Fs(M-1)f(0)g(M-c)p +Ft(')h(w)m(ould)g(c)m(hange)i(the)150 408 y(case)e(of)g(the)g(follo)m +(wing)g(10)h(c)m(haracters,)g(lea)m(ving)g(the)e(cursor)g(on)g(the)h +(last)g(c)m(haracter)h(c)m(hanged.)390 628 y Fs(/*)47 +b(Invert)f(the)h(case)g(of)g(the)g(COUNT)f(following)g(characters.)e +(*/)390 737 y(int)390 847 y(invert_case_line)f(\(count,)j(key\))629 +956 y(int)h(count,)f(key;)390 1066 y({)485 1176 y(register)g(int)h +(start,)f(end,)h(i;)485 1395 y(start)g(=)g(rl_point;)485 +1614 y(if)h(\(rl_point)d(>=)i(rl_end\))581 1724 y(return)f(\(0\);)485 +1943 y(if)i(\(count)e(<)h(0\))581 2052 y({)676 2162 y(direction)f(=)h +(-1;)676 2271 y(count)g(=)g(-count;)581 2381 y(})485 +2491 y(else)581 2600 y(direction)e(=)j(1;)485 2819 y(/*)g(Find)e(the)h +(end)g(of)g(the)g(range)g(to)g(modify.)f(*/)485 2929 +y(end)h(=)h(start)e(+)i(\(count)e(*)h(direction\);)485 +3148 y(/*)h(Force)e(it)h(to)g(be)h(within)e(range.)g(*/)485 +3258 y(if)i(\(end)e(>)i(rl_end\))581 3367 y(end)f(=)g(rl_end;)485 +3477 y(else)g(if)g(\(end)g(<)g(0\))581 3587 y(end)g(=)g(0;)485 +3806 y(if)h(\(start)e(==)h(end\))581 3915 y(return)f(\(0\);)485 +4134 y(if)i(\(start)e(>)h(end\))581 4244 y({)676 4354 +y(int)g(temp)g(=)g(start;)676 4463 y(start)g(=)g(end;)676 +4573 y(end)g(=)h(temp;)581 4682 y(})485 4902 y(/*)g(Tell)e(readline)g +(that)g(we)i(are)f(modifying)e(the)i(line,)629 5011 y(so)g(it)g(will)g +(save)f(the)h(undo)g(information.)d(*/)485 5121 y(rl_modifying)h +(\(start,)h(end\);)485 5340 y(for)h(\(i)h(=)f(start;)f(i)i(!=)f(end;)f +(i++\))p eop end +%%Page: 48 52 +TeXDict begin 48 51 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(48)581 +299 y Fs({)676 408 y(if)48 b(\(_rl_uppercase_p)43 b +(\(rl_line_buffer[i]\)\))772 518 y(rl_line_buffer[i])g(=)k +(_rl_to_lower)e(\(rl_line_buffer[i]\);)676 628 y(else)i(if)g +(\(_rl_lowercase_p)d(\(rl_line_buffer[i]\)\))772 737 +y(rl_line_buffer[i])f(=)k(_rl_to_upper)e(\(rl_line_buffer[i]\);)581 +847 y(})485 956 y(/*)j(Move)e(point)h(to)g(on)g(top)g(of)g(the)g(last)g +(character)e(changed.)g(*/)485 1066 y(rl_point)h(=)h(\(direction)e(==)j +(1\))f(?)g(end)g(-)h(1)f(:)h(start;)485 1176 y(return)f(\(0\);)390 +1285 y(})150 1518 y Fi(2.4.14)63 b(Alternate)40 b(In)m(terface)g +(Example)150 1665 y Ft(Here)f(is)g(a)g(complete)h(program)e(that)h +(illustrates)h(Readline's)f(alternate)h(in)m(terface.)67 +b(It)38 b(reads)h(lines)150 1775 y(from)30 b(the)i(terminal)f(and)f +(displa)m(ys)h(them,)h(pro)m(viding)f(the)g(standard)f(history)h(and)f +(T)-8 b(AB)32 b(completion)150 1884 y(functions.)40 b(It)31 +b(understands)d(the)j(EOF)f(c)m(haracter)i(or)e Fs(")p +Ft(exit)p Fs(")h Ft(to)g(exit)g(the)g(program.)390 2052 +y Fs(/*)47 b(Standard)f(include)g(files.)g(stdio.h)f(is)j(required.)d +(*/)390 2162 y(#include)h()390 2271 y(#include)g() +390 2381 y(#include)g()390 2491 y(#include)g()390 +2710 y(/*)h(Used)g(for)g(select\(2\))e(*/)390 2819 y(#include)h +()390 2929 y(#include)g()390 +3148 y(#include)g()390 3367 y(#include)g()390 +3587 y(/*)h(Standard)f(readline)f(include)h(files.)g(*/)390 +3696 y(#include)g()390 3806 y(#include)g +()390 4025 y(static)g(void)h(cb_linehandler)d +(\(char)i(*\);)390 4134 y(static)g(void)h(sighandler)e(\(int\);)390 +4354 y(int)i(running;)390 4463 y(int)g(sigwinch_received;)390 +4573 y(const)f(char)h(*prompt)f(=)h("rltest$)f(";)390 +4792 y(/*)h(Handle)f(SIGWINCH)g(and)h(window)f(size)g(changes)g(when)h +(readline)e(is)j(not)f(active)f(and)p 3922 4812 42 84 +v 533 4902 a(reading)g(a)h(character.)e(*/)390 5011 y(static)h(void)390 +5121 y(sighandler)f(\(int)i(sig\))390 5230 y({)485 5340 +y(sigwinch_received)d(=)j(1;)p eop end +%%Page: 49 53 +TeXDict begin 49 52 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(49)390 +299 y Fs(})390 518 y(/*)47 b(Callback)f(function)f(called)h(for)h(each) +g(line)g(when)f(accept-line)f(executed,)g(EOF)533 628 +y(seen,)i(or)g(EOF)g(character)e(read.)94 b(This)47 b(sets)f(a)i(flag)e +(and)h(returns;)f(it)h(could)533 737 y(also)g(call)f(exit\(3\).)g(*/) +390 847 y(static)g(void)390 956 y(cb_linehandler)e(\(char)i(*line\))390 +1066 y({)485 1176 y(/*)i(Can)f(use)f(^D)i(\(stty)e(eof\))h(or)g(`exit') +f(to)h(exit.)f(*/)485 1285 y(if)i(\(line)e(==)h(NULL)g(||)g(strcmp)f +(\(line,)g("exit"\))g(==)h(0\))581 1395 y({)676 1504 +y(if)h(\(line)e(==)h(0\))772 1614 y(printf)f(\("\\n"\);)676 +1724 y(printf)g(\("exit\\n"\);)676 1833 y(/*)i(This)e(function)g(needs) +g(to)h(be)g(called)g(to)g(reset)f(the)h(terminal)f(settings,)p +3874 1853 42 84 v 820 1943 a(and)g(calling)g(it)h(from)g(the)g(line)g +(handler)e(keeps)i(one)g(extra)f(prompt)g(from)p 3874 +1963 42 76 v 820 2052 a(being)g(displayed.)f(*/)676 2162 +y(rl_callback_handler_remove)c(\(\);)676 2381 y(running)46 +b(=)i(0;)581 2491 y(})485 2600 y(else)581 2710 y({)676 +2819 y(if)g(\(*line\))772 2929 y(add_history)d(\(line\);)676 +3039 y(printf)h(\("input)g(line:)h(\045s\\n",)f(line\);)676 +3148 y(free)h(\(line\);)581 3258 y(})390 3367 y(})390 +3587 y(int)390 3696 y(main)g(\(int)f(c,)h(char)g(**v\))390 +3806 y({)485 3915 y(fd_set)g(fds;)485 4025 y(int)g(r;)485 +4244 y(/*)h(Set)f(the)f(default)g(locale)g(values)g(according)g(to)h +(environment)e(variables.)g(*/)p 3874 4264 42 84 v 485 +4354 a(setlocale)h(\(LC_ALL,)f(""\);)485 4573 y(/*)j(Handle)e(window)g +(size)g(changes)g(when)h(readline)e(is)j(not)f(active)f(and)h(reading) +629 4682 y(characters.)d(*/)485 4792 y(signal)j(\(SIGWINCH,)e +(sighandler\);)485 5011 y(/*)j(Install)d(the)i(line)g(handler.)f(*/)485 +5121 y(rl_callback_handler_instal)o(l)c(\(prompt,)j(cb_linehandler\);) +485 5340 y(/*)j(Enter)e(a)h(simple)g(event)f(loop.)94 +b(This)47 b(waits)f(until)g(something)g(is)h(available)p +eop end +%%Page: 50 54 +TeXDict begin 50 53 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(50)629 +299 y Fs(to)47 b(read)f(on)i(readline's)d(input)h(stream)g(\(defaults)f +(to)j(standard)d(input\))h(and)629 408 y(calls)g(the)h(builtin)f +(character)f(read)i(callback)e(to)i(read)g(it.)95 b(It)47 +b(does)f(not)629 518 y(have)g(to)h(modify)g(the)f(user's)h(terminal)e +(settings.)g(*/)485 628 y(running)h(=)i(1;)485 737 y(while)f +(\(running\))581 847 y({)676 956 y(FD_ZERO)f(\(&fds\);)676 +1066 y(FD_SET)g(\(fileno)g(\(rl_instream\),)e(&fds\);)676 +1285 y(r)k(=)f(select)f(\(FD_SETSIZE,)f(&fds,)h(NULL,)h(NULL,)f +(NULL\);)676 1395 y(if)i(\(r)f(<)g(0)h(&&)f(errno)f(!=)h(EINTR\))772 +1504 y({)867 1614 y(perror)f(\("rltest:)g(select"\);)867 +1724 y(rl_callback_handler_remov)o(e)c(\(\);)867 1833 +y(break;)772 1943 y(})676 2052 y(if)48 b(\(sigwinch_received\))390 +2162 y({)485 2271 y(rl_resize_terminal)43 b(\(\);)485 +2381 y(sigwinch_received)h(=)j(0;)390 2491 y(})676 2600 +y(if)h(\(r)f(<)g(0\))390 2710 y(continue;)676 2929 y(if)h(\(FD_ISSET)d +(\(fileno)h(\(rl_instream\),)e(&fds\)\))772 3039 y +(rl_callback_read_char)e(\(\);)581 3148 y(})485 3367 +y(printf)47 b(\("rltest:)e(Event)h(loop)h(has)g(exited\\n"\);)485 +3477 y(return)g(0;)390 3587 y(})150 3835 y Fr(2.5)68 +b(Readline)47 b(Signal)e(Handling)150 3995 y Ft(Signals)31 +b(are)f(async)m(hronous)g(ev)m(en)m(ts)i(sen)m(t)f(to)g(a)g(pro)s(cess) +f(b)m(y)h(the)f(Unix)g(k)m(ernel,)i(sometimes)f(on)g(b)s(ehalf)150 +4104 y(of)24 b(another)f(pro)s(cess.)38 b(They)23 b(are)h(in)m(tended)f +(to)h(indicate)h(exceptional)g(ev)m(en)m(ts,)i(lik)m(e)d(a)g(user)f +(pressing)g(the)150 4214 y(terminal's)33 b(in)m(terrupt)f(k)m(ey)-8 +b(,)34 b(or)e(a)g(net)m(w)m(ork)h(connection)h(b)s(eing)e(brok)m(en.)46 +b(There)31 b(is)h(a)h(class)g(of)f(signals)150 4323 y(that)f(can)g(b)s +(e)e(sen)m(t)i(to)g(the)g(pro)s(cess)f(curren)m(tly)g(reading)h(input)e +(from)h(the)g(k)m(eyb)s(oard.)41 b(Since)30 b(Readline)150 +4433 y(c)m(hanges)41 b(the)e(terminal)i(attributes)f(when)f(it)h(is)f +(called,)44 b(it)c(needs)f(to)i(p)s(erform)d(sp)s(ecial)i(pro)s +(cessing)150 4543 y(when)33 b(suc)m(h)h(a)h(signal)g(is)f(receiv)m(ed)i +(in)e(order)g(to)h(restore)f(the)h(terminal)g(to)g(a)f(sane)h(state,)i +(or)d(pro)m(vide)150 4652 y(application)e(writers)e(with)g(functions)g +(to)h(do)f(so)h(man)m(ually)-8 b(.)275 4792 y(Readline)40 +b(con)m(tains)i(an)e(in)m(ternal)h(signal)g(handler)f(that)h(is)f +(installed)h(for)f(a)h(n)m(um)m(b)s(er)e(of)h(signals)150 +4902 y(\()p Fs(SIGINT)p Ft(,)e Fs(SIGQUIT)p Ft(,)f Fs(SIGTERM)p +Ft(,)g Fs(SIGHUP)p Ft(,)g Fs(SIGALRM)p Ft(,)g Fs(SIGTSTP)p +Ft(,)g Fs(SIGTTIN)p Ft(,)g(and)g Fs(SIGTTOU)p Ft(\).)59 +b(When)150 5011 y(one)27 b(of)g(these)g(signals)g(is)g(receiv)m(ed,)i +(the)e(signal)g(handler)f(will)h(reset)h(the)e(terminal)i(attributes)f +(to)g(those)150 5121 y(that)33 b(w)m(ere)g(in)f(e\013ect)h(b)s(efore)f +Fs(readline\(\))e Ft(w)m(as)i(called,)j(reset)d(the)h(signal)g +(handling)f(to)h(what)f(it)h(w)m(as)150 5230 y(b)s(efore)26 +b Fs(readline\(\))e Ft(w)m(as)j(called,)i(and)d(resend)g(the)h(signal)g +(to)h(the)f(calling)h(application.)41 b(If)26 b(and)g(when)150 +5340 y(the)34 b(calling)i(application's)f(signal)g(handler)e(returns,)h +(Readline)g(will)h(reinitialize)h(the)e(terminal)h(and)p +eop end +%%Page: 51 55 +TeXDict begin 51 54 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(51)150 +299 y(con)m(tin)m(ue)29 b(to)g(accept)h(input.)39 b(When)28 +b(a)h Fs(SIGINT)d Ft(is)j(receiv)m(ed,)h(the)e(Readline)h(signal)g +(handler)f(p)s(erforms)150 408 y(some)39 b(additional)h(w)m(ork,)h +(whic)m(h)d(will)h(cause)g(an)m(y)h(partially-en)m(tered)g(line)f(to)h +(b)s(e)e(ab)s(orted)g(\(see)i(the)150 518 y(description)30 +b(of)h Fs(rl_free_line_state\(\))25 b Ft(b)s(elo)m(w\).)275 +656 y(There)e(is)i(an)f(additional)h(Readline)g(signal)g(handler,)g +(for)f Fs(SIGWINCH)p Ft(,)g(whic)m(h)g(the)g(k)m(ernel)h(sends)e(to)j +(a)150 765 y(pro)s(cess)i(whenev)m(er)h(the)g(terminal's)g(size)h(c)m +(hanges)g(\(for)f(example,)h(if)f(a)g(user)f(resizes)i(an)e +Fs(xterm)p Ft(\).)39 b(The)150 875 y(Readline)d Fs(SIGWINCH)e +Ft(handler)g(up)s(dates)h(Readline's)h(in)m(ternal)h(screen)e(size)i +(information,)g(and)e(then)150 984 y(calls)g(an)m(y)f +Fs(SIGWINCH)e Ft(signal)i(handler)f(the)h(calling)h(application)g(has)f +(installed.)51 b(Readline)35 b(calls)g(the)150 1094 y(application's)i +Fs(SIGWINCH)c Ft(signal)i(handler)g(without)g(resetting)h(the)g +(terminal)f(to)h(its)g(original)g(state.)150 1204 y(If)31 +b(the)i(application's)g(signal)g(handler)e(do)s(es)g(more)h(than)g(up)s +(date)f(its)i(idea)f(of)g(the)g(terminal)h(size)g(and)150 +1313 y(return)28 b(\(for)i(example,)h(a)f Fs(longjmp)d +Ft(bac)m(k)k(to)f(a)g(main)g(pro)s(cessing)f(lo)s(op\),)h(it)g +Fk(must)39 b Ft(call)31 b Fs(rl_cleanup_)150 1423 y(after_signal\(\))26 +b Ft(\(describ)s(ed)k(b)s(elo)m(w\),)h(to)g(restore)g(the)g(terminal)g +(state.)275 1560 y(When)38 b(an)h(application)h(is)f(using)g(the)g +(callbac)m(k)i(in)m(terface)f(\(see)g(Section)g(2.4.12)h([Alternate)f +(In-)150 1670 y(terface],)48 b(page)c(46\),)j(Readline)c(installs)h +(signal)g(handlers)e(only)h(for)f(the)h(duration)g(of)g(the)g(call)h +(to)150 1779 y Fs(rl_callback_read_char)p Ft(.)c(Applications)33 +b(using)f(the)g(callbac)m(k)j(in)m(terface)e(should)f(b)s(e)f(prepared) +g(to)150 1889 y(clean)d(up)d(Readline's)j(state)g(if)e(they)h(wish)f +(to)h(handle)f(the)h(signal)h(b)s(efore)e(the)h(line)g(handler)f +(completes)150 1999 y(and)k(restores)h(the)f(terminal)h(state.)275 +2136 y(If)k(an)g(application)i(using)f(the)g(callbac)m(k)h(in)m +(terface)h(wishes)d(to)h(ha)m(v)m(e)h(Readline)g(install)f(its)g +(signal)150 2246 y(handlers)22 b(at)h(the)g(time)h(the)e(application)j +(calls)e Fs(rl_callback_handler_instal)o(l)17 b Ft(and)22 +b(remo)m(v)m(e)i(them)150 2355 y(only)f(when)g(a)g(complete)i(line)f +(of)f(input)f(has)h(b)s(een)g(read,)i(it)e(should)g(set)g(the)h +Fs(rl_persistent_signal_)150 2465 y(handlers)c Ft(v)-5 +b(ariable)23 b(to)f(a)h(non-zero)f(v)-5 b(alue.)39 b(This)21 +b(allo)m(ws)i(an)f(application)i(to)f(defer)e(all)i(of)f(the)h +(handling)150 2575 y(of)j(the)h(signals)f(Readline)h(catc)m(hes)h(to)f +(Readline.)39 b(Applications)27 b(should)f(use)f(this)h(v)-5 +b(ariable)27 b(with)f(care;)150 2684 y(it)d(can)g(result)g(in)f +(Readline)h(catc)m(hing)i(signals)e(and)f(not)h(acting)h(on)f(them)f +(\(or)h(allo)m(wing)i(the)e(application)150 2794 y(to)36 +b(react)g(to)g(them\))g(un)m(til)f(the)h(application)g(calls)h +Fs(rl_callback_read_char)p Ft(.)49 b(This)35 b(can)g(result)g(in)150 +2903 y(an)30 b(application)h(b)s(ecoming)f(less)g(resp)s(onsiv)m(e)f +(to)i(k)m(eyb)s(oard)e(signals)h(lik)m(e)h(SIGINT.)f(If)f(an)h +(application)150 3013 y(do)s(es)24 b(not)g(w)m(an)m(t)h(or)g(need)f(to) +h(p)s(erform)d(an)m(y)j(signal)g(handling,)g(or)f(do)s(es)g(not)h(need) +f(to)g(do)h(an)m(y)f(pro)s(cessing)150 3123 y(b)s(et)m(w)m(een)31 +b(calls)h(to)f Fs(rl_callback_read_char)p Ft(,)24 b(setting)32 +b(this)e(v)-5 b(ariable)31 b(ma)m(y)g(b)s(e)f(desirable.)275 +3260 y(Readline)f(pro)m(vides)f(t)m(w)m(o)i(v)-5 b(ariables)29 +b(that)h(allo)m(w)g(application)g(writers)e(to)h(con)m(trol)h(whether)e +(or)h(not)150 3370 y(it)34 b(will)f(catc)m(h)i(certain)f(signals)f(and) +g(act)h(on)f(them)g(when)f(they)i(are)f(receiv)m(ed.)51 +b(It)33 b(is)g(imp)s(ortan)m(t)g(that)150 3479 y(applications)38 +b(c)m(hange)g(the)e(v)-5 b(alues)37 b(of)g(these)g(v)-5 +b(ariables)37 b(only)g(when)f(calling)i Fs(readline\(\))p +Ft(,)d(not)i(in)g(a)150 3589 y(signal)31 b(handler,)f(so)g(Readline's)i +(in)m(ternal)f(signal)g(state)h(is)e(not)h(corrupted.)3371 +3779 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_catch_signals)390 +3889 y Ft(If)28 b(this)h(v)-5 b(ariable)30 b(is)f(non-zero,)h(Readline) +f(will)g(install)h(signal)f(handlers)f(for)h Fs(SIGINT)p +Ft(,)f Fs(SIGQUIT)p Ft(,)390 3998 y Fs(SIGTERM)p Ft(,)h +Fs(SIGHUP)p Ft(,)g Fs(SIGALRM)p Ft(,)f Fs(SIGTSTP)p Ft(,)h +Fs(SIGTTIN)p Ft(,)f(and)i Fs(SIGTTOU)p Ft(.)390 4136 +y(The)g(default)g(v)-5 b(alue)31 b(of)g Fs(rl_catch_signals)26 +b Ft(is)k(1.)3371 4326 y([V)-8 b(ariable])-3598 b Fh(int)53 +b(rl_catch_sigwinch)390 4436 y Ft(If)37 b(this)h(v)-5 +b(ariable)38 b(is)g(set)g(to)g(a)g(non-zero)g(v)-5 b(alue,)40 +b(Readline)f(will)f(install)g(a)g(signal)g(handler)f(for)390 +4546 y Fs(SIGWINCH)p Ft(.)390 4683 y(The)30 b(default)g(v)-5 +b(alue)31 b(of)g Fs(rl_catch_sigwinch)25 b Ft(is)31 b(1.)3371 +4874 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_persistent_signal_)q +(hand)q(ler)q(s)390 4983 y Ft(If)31 b(an)h(application)g(using)g(the)f +(callbac)m(k)j(in)m(terface)f(wishes)e(Readline's)h(signal)h(handlers)d +(to)j(b)s(e)390 5093 y(installed)21 b(and)f(activ)m(e)j(during)d(the)h +(set)g(of)f(calls)i(to)g Fs(rl_callback_read_char)14 +b Ft(that)22 b(constitutes)390 5202 y(an)30 b(en)m(tire)i(single)f +(line,)g(it)f(should)g(set)h(this)f(v)-5 b(ariable)31 +b(to)g(a)g(non-zero)g(v)-5 b(alue.)390 5340 y(The)30 +b(default)g(v)-5 b(alue)31 b(of)g Fs(rl_persistent_signal_han)o(dle)o +(rs)24 b Ft(is)31 b(0.)p eop end +%%Page: 52 56 +TeXDict begin 52 55 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(52)3371 +299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_change_environment)390 +408 y Ft(If)31 b(this)g(v)-5 b(ariable)32 b(is)f(set)h(to)g(a)g +(non-zero)g(v)-5 b(alue,)32 b(and)f(Readline)h(is)f(handling)g +Fs(SIGWINCH)p Ft(,)e(Read-)390 518 y(line)h(will)h(mo)s(dify)e(the)h +Fj(LINES)35 b Ft(and)29 b Fj(COLUMNS)35 b Ft(en)m(vironmen)m(t)30 +b(v)-5 b(ariables)31 b(up)s(on)d(receipt)j(of)g(a)390 +628 y Fs(SIGWINCH)390 766 y Ft(The)f(default)g(v)-5 b(alue)31 +b(of)g Fs(rl_change_environment)24 b Ft(is)31 b(1.)275 +957 y(If)f(an)h(application)h(do)s(es)f(not)g(wish)f(to)i(ha)m(v)m(e)g +(Readline)g(catc)m(h)g(an)m(y)f(signals,)h(or)f(to)h(handle)e(signals) +150 1067 y(other)39 b(than)f(those)h(Readline)h(catc)m(hes)g(\()p +Fs(SIGHUP)p Ft(,)g(for)e(example\),)k(Readline)d(pro)m(vides)g(con)m(v) +m(enience)150 1177 y(functions)30 b(to)h(do)f(the)h(necessary)g +(terminal)g(and)e(in)m(ternal)i(state)h(clean)m(up)f(up)s(on)e(receipt) +i(of)g(a)f(signal.)3350 1368 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_pending_signal)e Fg(\()p Ff(v)m(oid)p +Fg(\))390 1478 y Ft(Return)27 b(the)g(signal)h(n)m(um)m(b)s(er)e(of)i +(the)f(most)h(recen)m(t)h(signal)f(Readline)g(receiv)m(ed)g(but)f(has)g +(not)h(y)m(et)390 1587 y(handled,)i(or)g(0)h(if)f(there)h(is)f(no)g(p)s +(ending)f(signal.)3350 1779 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_cleanup_after_signal)e Fg(\()p Ff(v)m(oid)p +Fg(\))390 1889 y Ft(This)33 b(function)h(will)g(reset)g(the)g(state)i +(of)e(the)g(terminal)g(to)h(what)f(it)g(w)m(as)g(b)s(efore)g +Fs(readline\(\))390 1998 y Ft(w)m(as)c(called,)h(and)d(remo)m(v)m(e)j +(the)f(Readline)g(signal)g(handlers)e(for)h(all)h(signals,)h(dep)s +(ending)d(on)h(the)390 2108 y(v)-5 b(alues)31 b(of)f +Fs(rl_catch_signals)c Ft(and)k Fs(rl_catch_sigwinch)p +Ft(.)3350 2300 y([F)-8 b(unction])-3599 b Fh(void)54 +b(rl_free_line_state)c Fg(\()p Ff(v)m(oid)p Fg(\))390 +2409 y Ft(This)38 b(will)i(free)f(an)m(y)h(partial)g(state)g(asso)s +(ciated)h(with)e(the)g(curren)m(t)g(input)f(line)i(\(undo)e(infor-)390 +2519 y(mation,)46 b(an)m(y)d(partial)h(history)e(en)m(try)-8 +b(,)47 b(an)m(y)42 b(partially-en)m(tered)j(k)m(eyb)s(oard)d(macro,)47 +b(and)42 b(an)m(y)390 2628 y(partially-en)m(tered)50 +b(n)m(umeric)d(argumen)m(t\).)94 b(This)47 b(should)g(b)s(e)g(called)i +(b)s(efore)e Fs(rl_cleanup_)390 2738 y(after_signal\(\))p +Ft(.)74 b(The)42 b(Readline)h(signal)g(handler)f(for)h +Fs(SIGINT)e Ft(calls)i(this)g(to)g(ab)s(ort)g(the)390 +2847 y(curren)m(t)30 b(input)g(line.)3350 3039 y([F)-8 +b(unction])-3599 b Fh(void)54 b(rl_reset_after_signal)d +Fg(\()p Ff(v)m(oid)p Fg(\))390 3149 y Ft(This)28 b(will)g(reinitialize) +j(the)e(terminal)g(and)f(reinstall)h(an)m(y)g(Readline)g(signal)g +(handlers,)f(dep)s(end-)390 3258 y(ing)j(on)f(the)g(v)-5 +b(alues)31 b(of)g Fs(rl_catch_signals)26 b Ft(and)j Fs +(rl_catch_sigwinch)p Ft(.)275 3450 y(If)j(an)g(application)i(w)m(an)m +(ts)g(to)f(force)g(Readline)h(to)f(handle)g(an)m(y)g(signals)g(that)g +(ha)m(v)m(e)h(arriv)m(ed)f(while)150 3560 y(it)j(has)g(b)s(een)f +(executing,)j Fs(rl_check_signals\(\))31 b Ft(will)36 +b(call)h(Readline's)g(in)m(ternal)g(signal)f(handler)f(if)150 +3669 y(there)i(are)g(an)m(y)g(p)s(ending)e(signals.)61 +b(This)36 b(is)g(primarily)h(in)m(tended)f(for)h(those)g(applications)h +(that)f(use)150 3779 y(a)h(custom)g Fs(rl_getc_function)33 +b Ft(\(see)39 b(Section)g(2.3)g([Readline)f(V)-8 b(ariables],)42 +b(page)c(29\))h(and)e(wish)g(to)150 3888 y(handle)30 +b(signals)h(receiv)m(ed)h(while)e(w)m(aiting)i(for)e(input.)3350 +4080 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_check_signals)c +Fg(\()p Ff(v)m(oid)p Fg(\))390 4190 y Ft(If)40 b(there)h(are)g(an)m(y)g +(p)s(ending)e(signals,)44 b(call)e(Readline's)g(in)m(ternal)f(signal)g +(handling)f(functions)390 4299 y(to)j(pro)s(cess)g(them.)77 +b Fs(rl_pending_signal\(\))38 b Ft(can)43 b(b)s(e)f(used)g(indep)s +(enden)m(tly)f(to)j(determine)390 4409 y(whether)30 b(or)g(not)h(there) +f(are)h(an)m(y)g(p)s(ending)e(signals.)275 4600 y(If)38 +b(an)i(application)g(do)s(es)f(not)h(wish)f(Readline)h(to)g(catc)m(h)h +Fs(SIGWINCH)p Ft(,)e(it)h(ma)m(y)g(call)h Fs(rl_resize_)150 +4710 y(terminal\(\))24 b Ft(or)j Fs(rl_set_screen_size\(\))22 +b Ft(to)28 b(force)g(Readline)f(to)h(up)s(date)f(its)g(idea)h(of)f(the) +g(terminal)150 4820 y(size)k(when)f(it)h(receiv)m(es)h(a)e +Fs(SIGWINCH)p Ft(.)3350 5011 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_echo_signal_char)d Fg(\()p Ff(in)m(t)33 +b(sig)p Fg(\))390 5121 y Ft(If)41 b(an)g(application)h(wishes)f(to)h +(install)g(its)f(o)m(wn)g(signal)h(handlers,)h(but)e(still)h(ha)m(v)m +(e)g(Readline)390 5230 y(displa)m(y)31 b(c)m(haracters)h(that)f +(generate)h(signals,)f(calling)h(this)e(function)g(with)g +Fj(sig)39 b Ft(set)31 b(to)g Fs(SIGINT)p Ft(,)390 5340 +y Fs(SIGQUIT)p Ft(,)e(or)h Fs(SIGTSTP)e Ft(will)j(displa)m(y)g(the)f(c) +m(haracter)i(generating)g(that)f(signal.)p eop end +%%Page: 53 57 +TeXDict begin 53 56 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(53)3350 +299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_resize_terminal)c +Fg(\()p Ff(v)m(oid)p Fg(\))390 408 y Ft(Up)s(date)30 +b(Readline's)h(in)m(ternal)g(screen)g(size)g(b)m(y)f(reading)h(v)-5 +b(alues)31 b(from)f(the)g(k)m(ernel.)3350 592 y([F)-8 +b(unction])-3599 b Fh(void)54 b(rl_set_screen_size)c +Fg(\()p Ff(in)m(t)34 b(ro)m(ws,)f(in)m(t)g(cols)p Fg(\))390 +702 y Ft(Set)28 b(Readline's)h(idea)f(of)g(the)g(terminal)g(size)h(to)g +Fj(ro)m(ws)i Ft(ro)m(ws)d(and)f Fj(cols)33 b Ft(columns.)40 +b(If)27 b(either)h Fj(ro)m(ws)390 811 y Ft(or)35 b Fj(columns)k +Ft(is)c(less)g(than)g(or)g(equal)h(to)g(0,)h(Readline's)f(idea)g(of)f +(that)h(terminal)f(dimension)g(is)390 921 y(unc)m(hanged.)k(This)27 +b(is)h(in)m(tended)g(to)g(tell)h(Readline)f(the)g(ph)m(ysical)g +(dimensions)f(of)h(the)g(terminal,)390 1031 y(and)44 +b(is)h(used)f(in)m(ternally)i(to)f(calculate)j(the)d(maxim)m(um)f(n)m +(um)m(b)s(er)g(of)h(c)m(haracters)h(that)f(ma)m(y)390 +1140 y(app)s(ear)30 b(on)g(a)h(single)g(line)g(and)e(on)i(the)f +(screen.)275 1324 y(If)i(an)i(application)g(do)s(es)f(not)h(w)m(an)m(t) +g(to)g(install)g(a)g Fs(SIGWINCH)d Ft(handler,)j(but)e(is)i(still)g(in) +m(terested)g(in)150 1434 y(the)d(screen)f(dimensions,)g(it)h(ma)m(y)g +(query)f(Readline's)h(idea)g(of)f(the)h(screen)f(size.)3350 +1618 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_get_screen_size)c +Fg(\()p Ff(in)m(t)34 b(*ro)m(ws,)f(in)m(t)g(*cols)p Fg(\))390 +1727 y Ft(Return)c(Readline's)i(idea)g(of)f(the)g(terminal's)h(size)g +(in)f(the)g(v)-5 b(ariables)31 b(p)s(oin)m(ted)f(to)g(b)m(y)g(the)h +(argu-)390 1837 y(men)m(ts.)3350 2021 y([F)-8 b(unction])-3599 +b Fh(void)54 b(rl_reset_screen_size)d Fg(\()p Ff(v)m(oid)p +Fg(\))390 2130 y Ft(Cause)30 b(Readline)h(to)g(reobtain)g(the)g(screen) +f(size)h(and)f(recalculate)j(its)e(dimensions.)275 2314 +y(The)e(follo)m(wing)j(functions)e(install)h(and)f(remo)m(v)m(e)i +(Readline's)f(signal)g(handlers.)3350 2498 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_set_signals)d Fg(\()p Ff(v)m(oid)p Fg(\))390 +2607 y Ft(Install)40 b(Readline's)h(signal)f(handler)f(for)h +Fs(SIGINT)p Ft(,)h Fs(SIGQUIT)p Ft(,)f Fs(SIGTERM)p Ft(,)h +Fs(SIGHUP)p Ft(,)g Fs(SIGALRM)p Ft(,)390 2717 y Fs(SIGTSTP)p +Ft(,)35 b Fs(SIGTTIN)p Ft(,)f Fs(SIGTTOU)p Ft(,)h(and)g +Fs(SIGWINCH)p Ft(,)f(dep)s(ending)g(on)h(the)g(v)-5 b(alues)36 +b(of)f Fs(rl_catch_)390 2827 y(signals)28 b Ft(and)i +Fs(rl_catch_sigwinch)p Ft(.)3350 3010 y([F)-8 b(unction])-3599 +b Fh(int)53 b(rl_clear_signals)e Fg(\()p Ff(v)m(oid)p +Fg(\))390 3120 y Ft(Remo)m(v)m(e)32 b(all)f(of)g(the)g(Readline)g +(signal)g(handlers)e(installed)i(b)m(y)f Fs(rl_set_signals\(\))p +Ft(.)150 3361 y Fr(2.6)68 b(Custom)45 b(Completers)150 +3520 y Ft(T)m(ypically)-8 b(,)47 b(a)c(program)g(that)g(reads)f +(commands)h(from)f(the)g(user)g(has)h(a)g(w)m(a)m(y)g(of)g(disam)m +(biguating)150 3630 y(commands)35 b(and)g(data.)56 b(If)35 +b(y)m(our)h(program)f(is)g(one)h(of)g(these,)h(then)e(it)h(can)g(pro)m +(vide)f(completion)i(for)150 3739 y(commands,)29 b(data,)i(or)e(b)s +(oth.)39 b(The)29 b(follo)m(wing)i(sections)f(describ)s(e)e(ho)m(w)i(y) +m(our)f(program)g(and)f(Readline)150 3849 y(co)s(op)s(erate)j(to)h(pro) +m(vide)e(this)g(service.)150 4048 y Fi(2.6.1)63 b(Ho)m(w)40 +b(Completing)i(W)-10 b(orks)150 4195 y Ft(In)26 b(order)f(to)i +(complete)h(some)f(text,)h(the)f(full)f(list)h(of)f(p)s(ossible)g +(completions)h(m)m(ust)g(b)s(e)e(a)m(v)-5 b(ailable.)42 +b(That)150 4304 y(is,)28 b(it)f(is)g(not)g(p)s(ossible)g(to)g +(accurately)i(expand)d(a)h(partial)h(w)m(ord)f(without)f(kno)m(wing)i +(all)f(of)g(the)g(p)s(ossible)150 4414 y(w)m(ords)33 +b(whic)m(h)g(mak)m(e)h(sense)f(in)g(that)g(con)m(text.)51 +b(The)33 b(Readline)h(library)e(pro)m(vides)i(the)f(user)f(in)m +(terface)150 4523 y(to)d(completion,)h(and)e(t)m(w)m(o)i(of)e(the)h +(most)f(common)h(completion)h(functions:)39 b(\014lename)29 +b(and)e(username.)150 4633 y(F)-8 b(or)39 b(completing)g(other)f(t)m +(yp)s(es)g(of)h(text,)i(y)m(ou)d(m)m(ust)g(write)g(y)m(our)g(o)m(wn)g +(completion)h(function.)64 b(This)150 4743 y(section)32 +b(describ)s(es)d(exactly)j(what)f(suc)m(h)f(functions)g(m)m(ust)g(do,)g +(and)g(pro)m(vides)g(an)h(example.)275 4877 y(There)e(are)i(three)g(ma) +5 b(jor)30 b(functions)g(used)g(to)h(p)s(erform)e(completion:)199 +5011 y(1.)61 b(The)43 b(user-in)m(terface)h(function)f +Fs(rl_complete\(\))p Ft(.)76 b(This)43 b(function)g(is)g(called)i(with) +e(the)h(same)330 5121 y(argumen)m(ts)36 b(as)g(other)g(bindable)f +(Readline)h(functions:)51 b Fj(coun)m(t)38 b Ft(and)d +Fj(in)m(v)m(oking)p 3107 5121 28 4 v 41 w(k)m(ey)p Ft(.)57 +b(It)36 b(isolates)330 5230 y(the)i(w)m(ord)f(to)h(b)s(e)f(completed)i +(and)d(calls)j Fs(rl_completion_matches\(\))31 b Ft(to)39 +b(generate)g(a)f(list)g(of)330 5340 y(p)s(ossible)31 +b(completions.)44 b(It)31 b(then)g(either)g(lists)h(the)f(p)s(ossible)g +(completions,)h(inserts)f(the)g(p)s(ossible)p eop end +%%Page: 54 58 +TeXDict begin 54 57 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(54)330 +299 y(completions,)50 b(or)45 b(actually)i(p)s(erforms)d(the)h +(completion,)50 b(dep)s(ending)44 b(on)h(whic)m(h)g(b)s(eha)m(vior)g +(is)330 408 y(desired.)199 552 y(2.)61 b(The)33 b(in)m(ternal)h +(function)g Fs(rl_completion_matches\(\))27 b Ft(uses)33 +b(an)g(application-supplied)h Fj(gener-)330 662 y(ator)44 +b Ft(function)37 b(to)h(generate)g(the)f(list)h(of)f(p)s(ossible)f +(matc)m(hes,)k(and)d(then)f(returns)g(the)h(arra)m(y)h(of)330 +771 y(these)h(matc)m(hes.)68 b(The)39 b(caller)h(should)e(place)i(the)f +(address)f(of)h(its)g(generator)i(function)d(in)h Fs(rl_)330 +881 y(completion_entry_functio)o(n)p Ft(.)199 1024 y(3.)61 +b(The)22 b(generator)i(function)f(is)g(called)h(rep)s(eatedly)f(from)g +Fs(rl_completion_matches\(\))o Ft(,)c(returning)330 1134 +y(a)33 b(string)g(eac)m(h)h(time.)48 b(The)32 b(argumen)m(ts)h(to)h +(the)f(generator)h(function)e(are)h Fj(text)j Ft(and)c +Fj(state)p Ft(.)49 b Fj(text)330 1244 y Ft(is)32 b(the)g(partial)h(w)m +(ord)f(to)h(b)s(e)e(completed.)47 b Fj(state)38 b Ft(is)32 +b(zero)h(the)f(\014rst)g(time)g(the)h(function)e(is)h(called,)330 +1353 y(allo)m(wing)46 b(the)e(generator)h(to)f(p)s(erform)f(an)m(y)h +(necessary)g(initialization,)51 b(and)43 b(a)h(p)s(ositiv)m(e)h(non-) +330 1463 y(zero)30 b(in)m(teger)h(for)d(eac)m(h)j(subsequen)m(t)d +(call.)42 b(The)29 b(generator)h(function)f(returns)f +Fs(\(char)h(*\)NULL)e Ft(to)330 1572 y(inform)37 b Fs +(rl_completion_matches\(\))32 b Ft(that)39 b(there)f(are)g(no)g(more)g +(p)s(ossibilities)h(left.)65 b(Usually)330 1682 y(the)39 +b(generator)h(function)e(computes)h(the)g(list)g(of)g(p)s(ossible)f +(completions)i(when)e Fj(state)45 b Ft(is)39 b(zero,)330 +1792 y(and)25 b(returns)f(them)i(one)f(at)i(a)f(time)g(on)f(subsequen)m +(t)g(calls.)40 b(Eac)m(h)26 b(string)g(the)g(generator)g(function)330 +1901 y(returns)31 b(as)h(a)g(matc)m(h)h(m)m(ust)f(b)s(e)f(allo)s(cated) +j(with)d Fs(malloc\(\))p Ft(;)g(Readline)h(frees)g(the)g(strings)g +(when)330 2011 y(it)i(has)g(\014nished)e(with)i(them.)51 +b(Suc)m(h)33 b(a)h(generator)h(function)f(is)g(referred)f(to)h(as)h(an) +e Fj(application-)330 2120 y(sp)s(eci\014c)d(completion)i(function)p +Ft(.)3350 2341 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_complete)c +Fg(\()p Ff(in)m(t)34 b(ignore,)e(in)m(t)i(in)m(v)m(oking)p +2020 2341 30 5 v 43 w(k)m(ey)p Fg(\))390 2451 y Ft(Complete)d(the)g(w)m +(ord)g(at)g(or)g(b)s(efore)f(p)s(oin)m(t.)41 b(Y)-8 b(ou)32 +b(ha)m(v)m(e)g(supplied)d(the)i(function)f(that)h(do)s(es)g(the)390 +2560 y(initial)42 b(simple)f(matc)m(hing)i(selection)f(algorithm)h +(\(see)f Fs(rl_completion_matches\(\))o Ft(\).)67 b(The)390 +2670 y(default)31 b(is)f(to)h(do)f(\014lename)h(completion.)3371 +2890 y([V)-8 b(ariable])-3598 b Fh(rl_compentry_func_t)58 +b(*)53 b(rl_completion_entry_fun)q(cti)q(on)390 3000 +y Ft(This)39 b(is)h(a)g(p)s(oin)m(ter)g(to)h(the)f(generator)h +(function)f(for)f Fs(rl_completion_matches\(\))p Ft(.)63 +b(If)40 b(the)390 3110 y(v)-5 b(alue)24 b(of)g Fs +(rl_completion_entry_funct)o(ion)17 b Ft(is)24 b Fs(NULL)f +Ft(then)g(the)h(default)g(\014lename)g(generator)390 +3219 y(function,)49 b Fs(rl_filename_completion_)o(fun)o(ctio)o(n\(\))p +Ft(,)42 b(is)j(used.)84 b(An)44 b Fj(application-sp)s(eci\014c)390 +3329 y(completion)22 b(function)f Ft(is)g(a)h(function)e(whose)h +(address)f(is)h(assigned)h(to)f Fs(rl_completion_entry_)390 +3438 y(function)28 b Ft(and)i(whose)g(return)f(v)-5 b(alues)31 +b(are)g(used)e(to)j(generate)f(p)s(ossible)f(completions.)150 +3656 y Fi(2.6.2)63 b(Completion)41 b(F)-10 b(unctions)150 +3803 y Ft(Here)31 b(is)f(the)h(complete)h(list)f(of)f(callable)j +(completion)e(functions)f(presen)m(t)h(in)f(Readline.)3350 +4023 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_complete_internal)f +Fg(\()p Ff(in)m(t)33 b(what)p 1861 4023 V 44 w(to)p 1994 +4023 V 43 w(do)p Fg(\))390 4133 y Ft(Complete)k(the)g(w)m(ord)f(at)i +(or)e(b)s(efore)g(p)s(oin)m(t.)60 b Fj(what)p 2208 4133 +28 4 v 40 w(to)p 2328 4133 V 41 w(do)41 b Ft(sa)m(ys)c(what)f(to)i(do)e +(with)g(the)h(com-)390 4243 y(pletion.)44 b(A)31 b(v)-5 +b(alue)32 b(of)f(`)p Fs(?)p Ft(')g(means)h(list)f(the)h(p)s(ossible)e +(completions.)45 b(`)p Fs(TAB)p Ft(')31 b(means)g(do)g(standard)390 +4352 y(completion.)44 b(`)p Fs(*)p Ft(')32 b(means)f(insert)g(all)h(of) +f(the)g(p)s(ossible)g(completions.)44 b(`)p Fs(!)p Ft(')32 +b(means)f(to)h(displa)m(y)f(all)390 4462 y(of)k(the)f(p)s(ossible)g +(completions,)j(if)d(there)h(is)f(more)g(than)h(one,)g(as)g(w)m(ell)g +(as)g(p)s(erforming)e(partial)390 4571 y(completion.)41 +b(`)p Fs(@)p Ft(')27 b(is)h(similar)f(to)h(`)p Fs(!)p +Ft(',)h(but)d(p)s(ossible)h(completions)i(are)e(not)h(listed)g(if)f +(the)g(p)s(ossible)390 4681 y(completions)32 b(share)e(a)g(common)h +(pre\014x.)3350 4902 y([F)-8 b(unction])-3599 b Fh(int)53 +b(rl_complete)c Fg(\()p Ff(in)m(t)34 b(ignore,)e(in)m(t)i(in)m(v)m +(oking)p 2020 4902 30 5 v 43 w(k)m(ey)p Fg(\))390 5011 +y Ft(Complete)42 b(the)f(w)m(ord)g(at)h(or)f(b)s(efore)g(p)s(oin)m(t.) +73 b(Y)-8 b(ou)41 b(ha)m(v)m(e)i(supplied)c(the)j(function)f(that)g(do) +s(es)390 5121 y(the)33 b(initial)h(simple)f(matc)m(hing)h(selection)h +(algorithm)f(\(see)g Fs(rl_completion_matches\(\))27 +b Ft(and)390 5230 y Fs(rl_completion_entry_func)o(tion)o +Ft(\).)52 b(The)35 b(default)h(is)g(to)h(do)e(\014lename)h(completion.) +59 b(This)390 5340 y(calls)32 b Fs(rl_complete_internal\(\))24 +b Ft(with)30 b(an)g(argumen)m(t)h(dep)s(ending)e(on)h +Fj(in)m(v)m(oking)p 3314 5340 28 4 v 41 w(k)m(ey)p Ft(.)p +eop end +%%Page: 55 59 +TeXDict begin 55 58 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(55)3350 +299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_possible_completio)q(ns)f +Fg(\()p Ff(in)m(t)33 b(coun)m(t,)h(in)m(t)f(in)m(v)m(oking)p +2622 299 30 5 v 43 w(k)m(ey)p Fg(\))390 408 y Ft(List)41 +b(the)f(p)s(ossible)g(completions.)73 b(See)40 b(description)h(of)g +Fs(rl_complete)27 b(\(\))p Ft(.)70 b(This)40 b(calls)i +Fs(rl_)390 518 y(complete_internal\(\))25 b Ft(with)30 +b(an)g(argumen)m(t)h(of)g(`)p Fs(?)p Ft('.)3350 718 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_insert_completions)f +Fg(\()p Ff(in)m(t)34 b(coun)m(t,)f(in)m(t)g(in)m(v)m(oking)p +2517 718 V 44 w(k)m(ey)p Fg(\))390 828 y Ft(Insert)g(the)h(list)g(of)g +(p)s(ossible)f(completions)i(in)m(to)f(the)g(line,)h(deleting)g(the)f +(partially-completed)390 937 y(w)m(ord.)44 b(See)32 b(description)g(of) +g Fs(rl_complete\(\))p Ft(.)41 b(This)31 b(calls)i Fs +(rl_complete_internal\(\))25 b Ft(with)390 1047 y(an)30 +b(argumen)m(t)h(of)g(`)p Fs(*)p Ft('.)3350 1247 y([F)-8 +b(unction])-3599 b Fh(int)53 b(rl_completion_mode)e Fg(\()p +Ff(rl)p 1455 1247 V 44 w(command)p 1919 1247 V 44 w(func)p +2147 1247 V 46 w(t)33 b(*cfunc)p Fg(\))390 1356 y Ft(Returns)40 +b(the)i(appropriate)g(v)-5 b(alue)41 b(to)i(pass)e(to)h +Fs(rl_complete_internal\(\))35 b Ft(dep)s(ending)40 b(on)390 +1466 y(whether)g Fj(cfunc)46 b Ft(w)m(as)41 b(called)h(t)m(wice)g(in)f +(succession)g(and)f(the)h(v)-5 b(alues)41 b(of)g(the)g +Fs(show-all-if-)390 1575 y(ambiguous)25 b Ft(and)i Fs +(show-all-if-unmodified)21 b Ft(v)-5 b(ariables.)41 b(Application-sp)s +(eci\014c)29 b(completion)390 1685 y(functions)h(ma)m(y)h(use)f(this)g +(function)g(to)h(presen)m(t)g(the)f(same)h(in)m(terface)h(as)f +Fs(rl_complete\(\))p Ft(.)3350 1885 y([F)-8 b(unction])-3599 +b Fh(char)54 b(**)e(rl_completion_matches)g Fg(\()p Ff(const)34 +b(c)m(har)g(*text,)565 1995 y(rl)p 639 1995 V 44 w(comp)s(en)m(try)p +1145 1995 V 44 w(func)p 1373 1995 V 45 w(t)f(*en)m(try)p +1767 1995 V 44 w(func)p Fg(\))390 2104 y Ft(Returns)k(an)h(arra)m(y)g +(of)g(strings)g(whic)m(h)f(is)h(a)g(list)h(of)f(completions)h(for)e +Fj(text)p Ft(.)64 b(If)38 b(there)g(are)g(no)390 2214 +y(completions,)f(returns)c Fs(NULL)p Ft(.)52 b(The)34 +b(\014rst)f(en)m(try)i(in)f(the)h(returned)e(arra)m(y)i(is)g(the)f +(substitution)390 2323 y(for)26 b Fj(text)p Ft(.)40 b(The)26 +b(remaining)h(en)m(tries)g(are)g(the)f(p)s(ossible)g(completions.)40 +b(The)26 b(arra)m(y)h(is)f(terminated)390 2433 y(with)k(a)h +Fs(NULL)e Ft(p)s(oin)m(ter.)390 2575 y Fj(en)m(try)p +603 2575 28 4 v 40 w(func)44 b Ft(is)c(a)g(function)f(of)h(t)m(w)m(o)g +(args,)j(and)38 b(returns)h(a)g Fs(char)30 b(*)p Ft(.)67 +b(The)39 b(\014rst)g(argumen)m(t)h(is)390 2685 y Fj(text)p +Ft(.)66 b(The)39 b(second)f(is)h(a)g(state)h(argumen)m(t;)j(it)c(is)g +(zero)g(on)g(the)g(\014rst)f(call,)k(and)c(non-zero)h(on)390 +2794 y(subsequen)m(t)33 b(calls.)52 b Fj(en)m(try)p 1320 +2794 V 41 w(func)38 b Ft(returns)33 b(a)h Fs(NULL)f Ft(p)s(oin)m(ter)g +(to)i(the)f(caller)h(when)e(there)h(are)g(no)390 2904 +y(more)d(matc)m(hes.)3350 3104 y([F)-8 b(unction])-3599 +b Fh(char)54 b(*)e(rl_filename_completion)q(_fu)q(nct)q(ion)g +Fg(\()p Ff(const)34 b(c)m(har)g(*text,)e(in)m(t)565 3213 +y(state)p Fg(\))390 3323 y Ft(A)26 b(generator)h(function)e(for)g +(\014lename)h(completion)h(in)e(the)h(general)h(case.)40 +b Fj(text)28 b Ft(is)e(a)g(partial)h(\014le-)390 3433 +y(name.)38 b(The)21 b(Bash)g(source)h(is)g(a)f(useful)g(reference)h +(for)f(writing)h(application-sp)s(eci\014c)h(completion)390 +3542 y(functions)30 b(\(the)h(Bash)f(completion)i(functions)e(call)i +(this)e(and)g(other)g(Readline)h(functions\).)3350 3742 +y([F)-8 b(unction])-3599 b Fh(char)54 b(*)e(rl_username_completion)q +(_fu)q(nct)q(ion)g Fg(\()p Ff(const)34 b(c)m(har)g(*text,)e(in)m(t)565 +3852 y(state)p Fg(\))390 3961 y Ft(A)d(completion)g(generator)h(for)e +(usernames.)40 b Fj(text)31 b Ft(con)m(tains)f(a)f(partial)g(username)f +(preceded)g(b)m(y)390 4071 y(a)j(random)f(c)m(haracter)i(\(usually)e(`) +p Fs(~)p Ft('\).)42 b(As)31 b(with)f(all)h(completion)h(generators,)g +Fj(state)37 b Ft(is)31 b(zero)g(on)390 4180 y(the)g(\014rst)e(call)j +(and)e(non-zero)h(for)f(subsequen)m(t)f(calls.)150 4388 +y Fi(2.6.3)63 b(Completion)41 b(V)-10 b(ariables)3371 +4592 y Ft([V)i(ariable])-3598 b Fh(rl_compentry_func_t)58 +b(*)53 b(rl_completion_entry_fun)q(cti)q(on)390 4702 +y Ft(A)34 b(p)s(oin)m(ter)f(to)h(the)g(generator)h(function)e(for)g +Fs(rl_completion_matches\(\))p Ft(.)44 b Fs(NULL)32 b +Ft(means)h(to)390 4811 y(use)d Fs(rl_filename_completion_fu)o(nct)o +(ion\()o(\))p Ft(,)25 b(the)30 b(default)h(\014lename)f(completer.)3371 +5011 y([V)-8 b(ariable])-3598 b Fh(rl_completion_func_t)58 +b(*)53 b(rl_attempted_completio)q(n_f)q(unct)q(ion)390 +5121 y Ft(A)35 b(p)s(oin)m(ter)g(to)g(an)g(alternativ)m(e)i(function)d +(to)i(create)g(matc)m(hes.)55 b(The)34 b(function)h(is)f(called)i(with) +390 5230 y Fj(text)p Ft(,)26 b Fj(start)p Ft(,)f(and)d +Fj(end)p Ft(.)38 b Fj(start)25 b Ft(and)e Fj(end)j Ft(are)d(indices)g +(in)g Fs(rl_line_buffer)c Ft(de\014ning)j(the)h(b)s(ound-)390 +5340 y(aries)j(of)h Fj(text)p Ft(,)h(whic)m(h)d(is)h(a)h(c)m(haracter)g +(string.)39 b(If)26 b(this)g(function)f(exists)i(and)e(returns)g +Fs(NULL)p Ft(,)h(or)g(if)p eop end +%%Page: 56 60 +TeXDict begin 56 59 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(56)390 +299 y(this)22 b(v)-5 b(ariable)22 b(is)g(set)h(to)f Fs(NULL)p +Ft(,)h(then)f Fs(rl_complete\(\))c Ft(will)k(call)h(the)f(v)-5 +b(alue)23 b(of)f Fs(rl_completion_)390 408 y(entry_function)i +Ft(to)30 b(generate)f(matc)m(hes,)i(otherwise)d(the)h(arra)m(y)g(of)f +(strings)h(returned)e(will)i(b)s(e)390 518 y(used.)37 +b(If)22 b(this)g(function)g(sets)h(the)g Fs(rl_attempted_completion)o +(_ove)o(r)16 b Ft(v)-5 b(ariable)24 b(to)f(a)f(non-zero)390 +628 y(v)-5 b(alue,)35 b(Readline)g(will)f(not)g(p)s(erform)f(its)h +(default)g(completion)h(ev)m(en)g(if)f(this)g(function)f(returns)390 +737 y(no)d(matc)m(hes.)3371 913 y([V)-8 b(ariable])-3598 +b Fh(rl_quote_func_t)57 b(*)52 b(rl_filename_quoting_)q(func)q(tio)q(n) +390 1022 y Ft(A)33 b(p)s(oin)m(ter)f(to)h(a)g(function)g(that)g(will)g +(quote)g(a)g(\014lename)f(in)h(an)f(application-sp)s(eci\014c)i +(fashion.)390 1132 y(This)k(is)i(called)g(if)f(\014lename)h(completion) +g(is)f(b)s(eing)g(attempted)i(and)d(one)i(of)f(the)g(c)m(haracters)390 +1241 y(in)33 b Fs(rl_filename_quote_charac)o(ter)o(s)27 +b Ft(app)s(ears)33 b(in)g(a)g(completed)h(\014lename.)50 +b(The)32 b(function)390 1351 y(is)37 b(called)h(with)e +Fj(text)p Ft(,)k Fj(matc)m(h)p 1438 1351 28 4 v 41 w(t)m(yp)s(e)p +Ft(,)f(and)d Fj(quote)p 2119 1351 V 41 w(p)s(oin)m(ter)p +Ft(.)60 b(The)36 b Fj(text)k Ft(is)d(the)g(\014lename)g(to)h(b)s(e)390 +1461 y(quoted.)76 b(The)42 b Fj(matc)m(h)p 1210 1461 +V 41 w(t)m(yp)s(e)48 b Ft(is)42 b(either)h Fs(SINGLE_MATCH)p +Ft(,)f(if)g(there)g(is)h(only)f(one)h(completion)390 +1570 y(matc)m(h,)33 b(or)e Fs(MULT_MATCH)p Ft(.)41 b(Some)31 +b(functions)g(use)g(this)h(to)g(decide)f(whether)g(or)h(not)f(to)h +(insert)g(a)390 1680 y(closing)22 b(quote)f(c)m(haracter.)40 +b(The)20 b Fj(quote)p 1751 1680 V 41 w(p)s(oin)m(ter)27 +b Ft(is)21 b(a)g(p)s(oin)m(ter)g(to)g(an)m(y)h(op)s(ening)e(quote)h(c)m +(haracter)390 1789 y(the)31 b(user)e(t)m(yp)s(ed.)41 +b(Some)30 b(functions)g(c)m(ho)s(ose)h(to)g(reset)g(this)g(c)m +(haracter.)3371 1965 y([V)-8 b(ariable])-3598 b Fh(rl_dequote_func_t)57 +b(*)c(rl_filename_dequoting_)q(fun)q(cti)q(on)390 2074 +y Ft(A)30 b(p)s(oin)m(ter)f(to)i(a)f(function)f(that)h(will)g(remo)m(v) +m(e)h(application-sp)s(eci\014c)g(quoting)f(c)m(haracters)h(from)390 +2184 y(a)i(\014lename)g(b)s(efore)f(completion)h(is)g(attempted,)h(so)f +(those)g(c)m(haracters)h(do)e(not)h(in)m(terfere)g(with)390 +2293 y(matc)m(hing)39 b(the)f(text)i(against)f(names)f(in)g(the)g +(\014lesystem.)64 b(It)38 b(is)g(called)i(with)d Fj(text)p +Ft(,)42 b(the)c(text)390 2403 y(of)k(the)h(w)m(ord)f(to)g(b)s(e)g +(dequoted,)j(and)d Fj(quote)p 2014 2403 V 41 w(c)m(har)p +Ft(,)j(whic)m(h)d(is)h(the)f(quoting)h(c)m(haracter)g(that)390 +2513 y(delimits)33 b(the)f(\014lename)g(\(usually)h(`)p +Fs(')p Ft(')f(or)g(`)p Fs(")p Ft('\).)46 b(If)32 b Fj(quote)p +2368 2513 V 41 w(c)m(har)39 b Ft(is)32 b(zero,)i(the)e(\014lename)g(w)m +(as)h(not)390 2622 y(in)d(an)g(em)m(b)s(edded)g(string.)3371 +2798 y([V)-8 b(ariable])-3598 b Fh(rl_linebuf_func_t)57 +b(*)c(rl_char_is_quoted_p)390 2907 y Ft(A)37 b(p)s(oin)m(ter)g(to)g(a)g +(function)g(to)g(call)h(that)g(determines)f(whether)f(or)h(not)g(a)g +(sp)s(eci\014c)f(c)m(haracter)390 3017 y(in)e(the)h(line)f(bu\013er)g +(is)g(quoted,)i(according)g(to)f(whatev)m(er)g(quoting)g(mec)m(hanism)g +(the)f(program)390 3126 y(calling)26 b(Readline)g(uses.)38 +b(The)24 b(function)h(is)g(called)h(with)e(t)m(w)m(o)i(argumen)m(ts:)39 +b Fj(text)p Ft(,)27 b(the)e(text)h(of)f(the)390 3236 +y(line,)31 b(and)g Fj(index)p Ft(,)f(the)h(index)f(of)h(the)g(c)m +(haracter)i(in)d(the)h(line.)42 b(It)31 b(is)g(used)f(to)h(decide)g +(whether)g(a)390 3345 y(c)m(haracter)h(found)d(in)g Fs +(rl_completer_word_break_ch)o(ara)o(cter)o(s)24 b Ft(should)29 +b(b)s(e)h(used)f(to)i(break)390 3455 y(w)m(ords)f(for)g(the)h +(completer.)3371 3630 y([V)-8 b(ariable])-3598 b Fh +(rl_compignore_func_t)58 b(*)53 b(rl_ignore_some_complet)q(ion)q(s_fu)q +(nct)q(ion)390 3740 y Ft(This)37 b(function,)i(if)f(de\014ned,)g(is)g +(called)h(b)m(y)e(the)h(completer)h(when)e(real)h(\014lename)g +(completion)390 3850 y(is)c(done,)h(after)f(all)h(the)g(matc)m(hing)g +(names)e(ha)m(v)m(e)j(b)s(een)d(generated.)53 b(It)34 +b(is)g(passed)f(a)i Fs(NULL)d Ft(ter-)390 3959 y(minated)f(arra)m(y)g +(of)g(matc)m(hes.)43 b(The)31 b(\014rst)f(elemen)m(t)i(\()p +Fs(matches[0])p Ft(\))d(is)h(the)h(maximal)h(substring)390 +4069 y(common)d(to)g(all)h(matc)m(hes.)41 b(This)28 b(function)h(can)g +(re-arrange)g(the)g(list)h(of)f(matc)m(hes)g(as)g(required,)390 +4178 y(but)h(eac)m(h)h(elemen)m(t)h(deleted)f(from)f(the)h(arra)m(y)g +(m)m(ust)f(b)s(e)g(freed.)3371 4354 y([V)-8 b(ariable])-3598 +b Fh(rl_icppfunc_t)56 b(*)d(rl_directory_completio)q(n_ho)q(ok)390 +4463 y Ft(This)44 b(function,)49 b(if)d(de\014ned,)i(is)d(allo)m(w)m +(ed)i(to)f(mo)s(dify)e(the)i(directory)g(p)s(ortion)e(of)i(\014lenames) +390 4573 y(Readline)35 b(completes.)56 b(It)35 b(could)g(b)s(e)f(used)g +(to)i(expand)e(sym)m(b)s(olic)h(links)g(or)g(shell)g(v)-5 +b(ariables)35 b(in)390 4682 y(pathnames.)70 b(It)41 b(is)f(called)h +(with)f(the)h(address)e(of)i(a)g(string)f(\(the)h(curren)m(t)f +(directory)h(name\))390 4792 y(as)d(an)f(argumen)m(t,)j(and)d(ma)m(y)i +(mo)s(dify)d(that)j(string.)62 b(If)37 b(the)h(string)f(is)h(replaced)g +(with)f(a)h(new)390 4902 y(string,)j(the)d(old)h(v)-5 +b(alue)39 b(should)e(b)s(e)h(freed.)64 b(An)m(y)39 b(mo)s(di\014ed)e +(directory)i(name)f(should)g(ha)m(v)m(e)i(a)390 5011 +y(trailing)c(slash.)54 b(The)35 b(mo)s(di\014ed)e(v)-5 +b(alue)36 b(will)f(b)s(e)f(used)g(as)i(part)e(of)h(the)h(completion,)h +(replacing)390 5121 y(the)32 b(directory)g(p)s(ortion)f(of)h(the)g +(pathname)f(the)h(user)f(t)m(yp)s(ed.)44 b(A)m(t)33 b(the)f(least,)h +(ev)m(en)g(if)e(no)h(other)390 5230 y(expansion)j(is)h(p)s(erformed,)f +(this)h(function)f(should)g(remo)m(v)m(e)i(an)m(y)f(quote)g(c)m +(haracters)h(from)e(the)390 5340 y(directory)c(name,)g(b)s(ecause)f +(its)h(result)f(will)h(b)s(e)e(passed)h(directly)h(to)g +Fs(opendir\(\))p Ft(.)p eop end +%%Page: 57 61 +TeXDict begin 57 60 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(57)390 +299 y(The)25 b(directory)i(completion)g(ho)s(ok)e(returns)g(an)h(in)m +(teger)h(that)f(should)f(b)s(e)g(non-zero)i(if)e(the)i(func-)390 +408 y(tion)35 b(mo)s(di\014es)e(its)i(directory)f(argumen)m(t.)53 +b(The)33 b(function)h(should)f(not)i(mo)s(dify)e(the)h(directory)390 +518 y(argumen)m(t)d(if)f(it)h(returns)e(0.)3371 720 y([V)-8 +b(ariable])-3598 b Fh(rl_icppfunc_t)56 b(*)d(rl_directory_rewrite_h)q +(ook;)390 830 y Ft(If)24 b(non-zero,)i(this)e(is)h(the)f(address)g(of)g +(a)h(function)f(to)h(call)g(when)f(completing)h(a)g(directory)g(name.) +390 939 y(This)h(function)g(tak)m(es)i(the)f(address)f(of)h(the)f +(directory)h(name)g(to)g(b)s(e)f(mo)s(di\014ed)g(as)h(an)f(argumen)m +(t.)390 1049 y(Unlik)m(e)40 b Fs(rl_directory_completion_h)o(ook)p +Ft(,)35 b(it)40 b(only)f(mo)s(di\014es)f(the)i(directory)f(name)h(used) +390 1159 y(in)35 b Fs(opendir)p Ft(,)g(not)g(what)h(is)f(displa)m(y)m +(ed)h(when)e(the)i(p)s(ossible)f(completions)h(are)g(prin)m(ted)f(or)g +(in-)390 1268 y(serted.)k(It)27 b(is)f(called)h(b)s(efore)f(rl)p +1463 1268 28 4 v 40 w(directory)p 1859 1268 V 41 w(completion)p +2333 1268 V 41 w(ho)s(ok.)39 b(A)m(t)27 b(the)g(least,)h(ev)m(en)f(if)g +(no)f(other)390 1378 y(expansion)35 b(is)h(p)s(erformed,)f(this)h +(function)f(should)g(remo)m(v)m(e)i(an)m(y)f(quote)g(c)m(haracters)h +(from)e(the)390 1487 y(directory)c(name,)g(b)s(ecause)f(its)h(result)f +(will)h(b)s(e)e(passed)h(directly)h(to)g Fs(opendir\(\))p +Ft(.)390 1631 y(The)37 b(directory)i(rewrite)f(ho)s(ok)f(returns)g(an)h +(in)m(teger)h(that)f(should)f(b)s(e)g(non-zero)i(if)e(the)i(func-)390 +1740 y(tion)c(mo)s(di\014es)e(its)i(directory)f(argumen)m(t.)53 +b(The)33 b(function)h(should)f(not)i(mo)s(dify)e(the)h(directory)390 +1850 y(argumen)m(t)d(if)f(it)h(returns)e(0.)3371 2052 +y([V)-8 b(ariable])-3598 b Fh(rl_icppfunc_t)56 b(*)d +(rl_filename_stat_hook)390 2162 y Ft(If)30 b(non-zero,)h(this)f(is)g +(the)g(address)f(of)h(a)h(function)f(for)f(the)i(completer)g(to)g(call) +g(b)s(efore)f(deciding)390 2271 y(whic)m(h)g(c)m(haracter)i(to)e(app)s +(end)f(to)i(a)f(completed)h(name.)41 b(This)29 b(function)h(mo)s +(di\014es)f(its)i(\014lename)390 2381 y(name)36 b(argumen)m(t,)h(and)e +(the)h(mo)s(di\014ed)e(v)-5 b(alue)36 b(is)g(passed)f(to)h +Fs(stat\(\))e Ft(to)i(determine)g(the)g(\014le's)390 +2491 y(t)m(yp)s(e)41 b(and)f(c)m(haracteristics.)73 b(This)40 +b(function)g(do)s(es)g(not)h(need)f(to)h(remo)m(v)m(e)h(quote)f(c)m +(haracters)390 2600 y(from)30 b(the)g(\014lename.)390 +2744 y(The)40 b(stat)h(ho)s(ok)f(returns)f(an)h(in)m(teger)h(that)g +(should)e(b)s(e)h(non-zero)g(if)h(the)f(function)g(mo)s(di\014es)390 +2853 y(its)32 b(directory)f(argumen)m(t.)44 b(The)31 +b(function)f(should)h(not)g(mo)s(dify)g(the)g(directory)h(argumen)m(t)f +(if)g(it)390 2963 y(returns)e(0.)3371 3165 y([V)-8 b(ariable])-3598 +b Fh(rl_dequote_func_t)57 b(*)c(rl_filename_rewrite_ho)q(ok)390 +3275 y Ft(If)39 b(non-zero,)k(this)d(is)f(the)h(address)f(of)h(a)g +(function)g(called)g(when)f(reading)h(directory)g(en)m(tries)390 +3384 y(from)f(the)h(\014lesystem)g(for)g(completion)h(and)e(comparing)i +(them)e(to)i(the)f(partial)h(w)m(ord)e(to)i(b)s(e)390 +3494 y(completed.)g(The)26 b(function)h(should)f(p)s(erform)f(an)m(y)j +(necessary)f(application)i(or)e(system-sp)s(eci\014c)390 +3603 y(con)m(v)m(ersion)35 b(on)g(the)f(\014lename,)i(suc)m(h)d(as)i +(con)m(v)m(erting)h(b)s(et)m(w)m(een)f(c)m(haracter)g(sets)g(or)f(con)m +(v)m(erting)390 3713 y(from)f(a)g(\014lesystem)h(format)g(to)g(a)f(c)m +(haracter)i(input)e(format.)50 b(The)32 b(function)h(tak)m(es)i(t)m(w)m +(o)g(argu-)390 3823 y(men)m(ts:)49 b Fj(fname)p Ft(,)36 +b(the)e(\014lename)h(to)g(b)s(e)f(con)m(v)m(erted,)j(and)d +Fj(fnlen)p Ft(,)h(its)g(length)g(in)f(b)m(ytes.)53 b(It)35 +b(m)m(ust)390 3932 y(either)24 b(return)e(its)h(\014rst)g(argumen)m(t)g +(\(if)h(no)f(con)m(v)m(ersion)h(tak)m(es)h(place\))g(or)e(the)g(con)m +(v)m(erted)i(\014lename)390 4042 y(in)j(newly-allo)s(cated)i(memory)-8 +b(.)41 b(The)27 b(con)m(v)m(erted)j(form)e(is)g(used)g(to)h(compare)f +(against)i(the)e(w)m(ord)390 4151 y(to)g(b)s(e)e(completed,)j(and,)f +(if)f(it)h(matc)m(hes,)h(is)e(added)f(to)i(the)g(list)f(of)h(matc)m +(hes.)41 b(Readline)27 b(will)h(free)390 4261 y(the)j(allo)s(cated)h +(string.)3371 4463 y([V)-8 b(ariable])-3598 b Fh(rl_compdisp_func_t)58 +b(*)52 b(rl_completion_display)q(_ma)q(tch)q(es_h)q(ook)390 +4573 y Ft(If)22 b(non-zero,)i(then)e(this)g(is)g(the)g(address)f(of)h +(a)g(function)g(to)h(call)g(when)e(completing)i(a)g(w)m(ord)e(w)m(ould) +390 4682 y(normally)h(displa)m(y)h(the)f(list)h(of)f(p)s(ossible)g +(matc)m(hes.)39 b(This)21 b(function)h(is)g(called)i(in)e(lieu)g(of)g +(Readline)390 4792 y(displa)m(ying)37 b(the)h(list.)61 +b(It)37 b(tak)m(es)i(three)e(argumen)m(ts:)54 b(\()p +Fs(char)30 b(**)p Fj(matc)m(hes)p Ft(,)39 b Fs(int)d +Fj(n)m(um)p 3370 4792 V 40 w(matc)m(hes)p Ft(,)390 4902 +y Fs(int)26 b Fj(max)p 735 4902 V 40 w(length)p Ft(\))h(where)f +Fj(matc)m(hes)31 b Ft(is)c(the)f(arra)m(y)h(of)g(matc)m(hing)g +(strings,)h Fj(n)m(um)p 3152 4902 V 39 w(matc)m(hes)j +Ft(is)c(the)390 5011 y(n)m(um)m(b)s(er)35 b(of)i(strings)f(in)g(that)h +(arra)m(y)-8 b(,)39 b(and)d Fj(max)p 2073 5011 V 40 w(length)h +Ft(is)g(the)f(length)h(of)g(the)f(longest)i(string)390 +5121 y(in)f(that)i(arra)m(y)-8 b(.)63 b(Readline)39 b(pro)m(vides)e(a)h +(con)m(v)m(enience)i(function,)f Fs(rl_display_match_list)p +Ft(,)390 5230 y(that)33 b(tak)m(es)g(care)g(of)f(doing)g(the)g(displa)m +(y)g(to)h(Readline's)g(output)e(stream.)46 b(Y)-8 b(ou)33 +b(ma)m(y)f(call)h(that)390 5340 y(function)d(from)g(this)g(ho)s(ok.)p +eop end +%%Page: 58 62 +TeXDict begin 58 61 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(58)3371 +299 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_basic_word_break_ch)q(ara)q(cter)q(s)390 408 y Ft(The)44 +b(basic)g(list)h(of)f(c)m(haracters)i(that)f(signal)g(a)f(break)g(b)s +(et)m(w)m(een)h(w)m(ords)f(for)g(the)g(completer)390 +518 y(routine.)61 b(The)37 b(default)g(v)-5 b(alue)37 +b(of)h(this)f(v)-5 b(ariable)38 b(is)f(the)g(c)m(haracters)i(whic)m(h)e +(break)g(w)m(ords)f(for)390 628 y(completion)c(in)e(Bash:)41 +b Fs(")30 b(\\t\\n\\"\\\\'`@$><=;|&{\(")p Ft(.)3371 819 +y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_basic_quote_charact)q(ers)390 929 y Ft(A)30 b(list)i(of)e(quote)h +(c)m(haracters)h(whic)m(h)e(can)h(cause)g(a)f(w)m(ord)g(break.)3371 +1121 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_completer_word_brea)q(k_c)q(hara)q(cte)q(rs)390 1230 +y Ft(The)64 b(list)i(of)f(c)m(haracters)h(that)g(signal)g(a)f(break)g +(b)s(et)m(w)m(een)g(w)m(ords)g(for)f Fs(rl_complete_)390 +1340 y(internal\(\))p Ft(.)38 b(The)30 b(default)g(list)h(is)g(the)f(v) +-5 b(alue)31 b(of)g Fs(rl_basic_word_break_cha)o(ract)o(ers)p +Ft(.)3371 1532 y([V)-8 b(ariable])-3598 b Fh(rl_cpvfunc_t)56 +b(*)d(rl_completion_word_brea)q(k_ho)q(ok)390 1641 y +Ft(If)31 b(non-zero,)i(this)e(is)h(the)f(address)g(of)g(a)h(function)g +(to)g(call)h(when)d(Readline)i(is)g(deciding)f(where)390 +1751 y(to)k(separate)g(w)m(ords)f(for)g(w)m(ord)g(completion.)54 +b(It)34 b(should)f(return)g(a)i(c)m(haracter)h(string)e(lik)m(e)i +Fs(rl_)390 1861 y(completer_word_break_cha)o(ract)o(ers)26 +b Ft(to)34 b(b)s(e)e(used)g(to)i(p)s(erform)e(the)h(curren)m(t)f +(completion.)390 1970 y(The)24 b(function)h(ma)m(y)g(c)m(ho)s(ose)h(to) +f(set)g Fs(rl_completer_word_break_ch)o(arac)o(ter)o(s)19 +b Ft(itself.)39 b(If)25 b(the)390 2080 y(function)30 +b(returns)f Fs(NULL)p Ft(,)h Fs(rl_completer_word_break)o(_cha)o(rac)o +(ters)24 b Ft(is)30 b(used.)3371 2271 y([V)-8 b(ariable])-3598 +b Fh(const)54 b(char)f(*)g(rl_completer_quote_cha)q(rac)q(ters)390 +2381 y Ft(A)34 b(list)g(of)g(c)m(haracters)h(whic)m(h)e(can)h(b)s(e)g +(used)e(to)j(quote)f(a)g(substring)f(of)h(the)f(line.)51 +b(Completion)390 2491 y(o)s(ccurs)26 b(on)g(the)g(en)m(tire)i +(substring,)e(and)f(within)h(the)g(substring)g Fs +(rl_completer_word_break)o(_)390 2600 y(characters)32 +b Ft(are)k(treated)g(as)f(an)m(y)h(other)f(c)m(haracter,)j(unless)d +(they)g(also)h(app)s(ear)e(within)h(this)390 2710 y(list.)3371 +2902 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_filename_quote_char)q(act)q(ers)390 3011 y Ft(A)34 +b(list)g(of)g(c)m(haracters)h(that)f(cause)h(a)f(\014lename)g(to)g(b)s +(e)f(quoted)h(b)m(y)f(the)h(completer)h(when)e(they)390 +3121 y(app)s(ear)d(in)g(a)h(completed)g(\014lename.)41 +b(The)30 b(default)g(is)h(the)f(n)m(ull)h(string.)3371 +3313 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g +(rl_special_prefixes)390 3422 y Ft(The)27 b(list)i(of)e(c)m(haracters)j +(that)e(are)g(w)m(ord)f(break)h(c)m(haracters,)i(but)d(should)f(b)s(e)h +(left)i(in)e Fj(text)k Ft(when)390 3532 y(it)25 b(is)g(passed)f(to)h +(the)g(completion)h(function.)38 b(Programs)25 b(can)g(use)f(this)h(to) +g(help)f(determine)h(what)390 3641 y(kind)i(of)h(completing)h(to)f(do.) +40 b(F)-8 b(or)29 b(instance,)g(Bash)f(sets)g(this)g(v)-5 +b(ariable)28 b(to)h Fs(")p Ft($@)p Fs(")e Ft(so)h(that)g(it)h(can)390 +3751 y(complete)j(shell)e(v)-5 b(ariables)31 b(and)f(hostnames.)3371 +3943 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_query_i)q +(tems)390 4052 y Ft(Up)36 b(to)h(this)f(man)m(y)g(items)h(will)f(b)s(e) +g(displa)m(y)m(ed)h(in)e(resp)s(onse)h(to)h(a)f(p)s +(ossible-completions)h(call.)390 4162 y(After)44 b(that,)49 +b(Readline)c(asks)f(the)h(user)e(for)h(con\014rmation)h(b)s(efore)e +(displa)m(ying)i(them.)82 b(The)390 4271 y(default)36 +b(v)-5 b(alue)37 b(is)f(100.)58 b(A)36 b(negativ)m(e)i(v)-5 +b(alue)37 b(indicates)g(that)f(Readline)h(should)e(nev)m(er)h(ask)g +(for)390 4381 y(con\014rmation.)3371 4573 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_completion_append_)q(char)q(act)q(er)390 +4682 y Ft(When)33 b(a)h(single)f(completion)i(alternativ)m(e)h(matc)m +(hes)e(at)g(the)f(end)g(of)g(the)h(command)f(line,)h(this)390 +4792 y(c)m(haracter)23 b(is)e(app)s(ended)f(to)i(the)g(inserted)f +(completion)i(text.)39 b(The)20 b(default)i(is)g(a)f(space)h(c)m +(haracter)390 4902 y(\(`)31 b('\).)40 b(Setting)27 b(this)g(to)g(the)g +(n)m(ull)f(c)m(haracter)j(\(`)p Fs(\\0)p Ft('\))e(prev)m(en)m(ts)g(an)m +(ything)g(b)s(eing)f(app)s(ended)f(auto-)390 5011 y(matically)-8 +b(.)41 b(This)22 b(can)i(b)s(e)f(c)m(hanged)h(in)f(application-sp)s +(eci\014c)h(completion)h(functions)e(to)h(pro)m(vide)390 +5121 y(the)d(\\most)i(sensible)e(w)m(ord)g(separator)h(c)m(haracter")h +(according)f(to)g(an)f(application-sp)s(eci\014c)i(com-)390 +5230 y(mand)28 b(line)i(syn)m(tax)f(sp)s(eci\014cation.)42 +b(It)29 b(is)g(set)h(to)g(the)f(default)g(b)s(efore)g(an)m(y)g +(application-sp)s(eci\014c)390 5340 y(completion)j(function)e(is)g +(called,)i(and)e(ma)m(y)h(only)f(b)s(e)g(c)m(hanged)h(within)f(suc)m(h) +g(a)h(function.)p eop end +%%Page: 59 63 +TeXDict begin 59 62 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(59)3371 +299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_suppres)q +(s_ap)q(pen)q(d)390 408 y Ft(If)33 b(non-zero,)i Fj(rl)p +949 408 28 4 v 39 w(completion)p 1421 408 V 42 w(app)s(end)p +1755 408 V 38 w(c)m(haracter)42 b Ft(is)33 b(not)g(app)s(ended)f(to)i +(matc)m(hes)g(at)g(the)g(end)390 518 y(of)28 b(the)f(command)h(line,)h +(as)e(describ)s(ed)g(ab)s(o)m(v)m(e.)41 b(It)27 b(is)h(set)g(to)g(0)g +(b)s(efore)g(an)m(y)f(application-sp)s(eci\014c)390 628 +y(completion)32 b(function)e(is)g(called,)i(and)e(ma)m(y)h(only)f(b)s +(e)g(c)m(hanged)h(within)f(suc)m(h)g(a)h(function.)3371 +847 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_quote_c)q +(hara)q(cte)q(r)390 956 y Ft(When)36 b(Readline)h(is)f(completing)h +(quoted)g(text,)h(as)f(delimited)g(b)m(y)f(one)g(of)g(the)h(c)m +(haracters)g(in)390 1066 y Fj(rl)p 457 1066 V 40 w(completer)p +885 1066 V 41 w(quote)p 1145 1066 V 41 w(c)m(haracters)p +Ft(,)43 b(it)c(sets)g(this)g(v)-5 b(ariable)40 b(to)g(the)f(quoting)g +(c)m(haracter)i(found.)390 1176 y(This)30 b(is)g(set)h(b)s(efore)f(an)m +(y)h(application-sp)s(eci\014c)g(completion)h(function)e(is)h(called.) +3371 1395 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_suppres) +q(s_qu)q(ote)390 1504 y Ft(If)32 b(non-zero,)h(Readline)g(do)s(es)f +(not)h(app)s(end)d(a)j(matc)m(hing)g(quote)g(c)m(haracter)h(when)d(p)s +(erforming)390 1614 y(completion)25 b(on)e(a)h(quoted)g(string.)38 +b(It)24 b(is)f(set)h(to)h(0)f(b)s(efore)f(an)m(y)h(application-sp)s +(eci\014c)h(completion)390 1724 y(function)30 b(is)g(called,)i(and)e +(ma)m(y)h(only)g(b)s(e)e(c)m(hanged)i(within)f(suc)m(h)g(a)h(function.) +3371 1943 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_found_q) +q(uote)390 2052 y Ft(When)31 b(Readline)i(is)e(completing)i(quoted)f +(text,)h(it)f(sets)g(this)g(v)-5 b(ariable)32 b(to)h(a)f(non-zero)g(v) +-5 b(alue)32 b(if)390 2162 y(the)21 b(w)m(ord)g(b)s(eing)g(completed)h +(con)m(tains)g(or)f(is)g(delimited)h(b)m(y)f(an)m(y)g(quoting)h(c)m +(haracters,)i(including)390 2271 y(bac)m(kslashes.)42 +b(This)29 b(is)i(set)g(b)s(efore)f(an)m(y)g(application-sp)s(eci\014c)i +(completion)g(function)e(is)g(called.)3371 2491 y([V)-8 +b(ariable])-3598 b Fh(int)53 b(rl_completion_mark_sy)q(mlin)q(k_d)q +(irs)390 2600 y Ft(If)31 b(non-zero,)i(a)f(slash)g(will)g(b)s(e)f(app)s +(ended)f(to)j(completed)g(\014lenames)e(that)i(are)f(sym)m(b)s(olic)g +(links)390 2710 y(to)25 b(directory)g(names,)g(sub)5 +b(ject)24 b(to)h(the)f(v)-5 b(alue)25 b(of)f(the)h(user-settable)g +Fj(mark-directories)k Ft(v)-5 b(ariable.)390 2819 y(This)27 +b(v)-5 b(ariable)28 b(exists)g(so)f(that)h(application-sp)s(eci\014c)h +(completion)g(functions)e(can)g(o)m(v)m(erride)i(the)390 +2929 y(user's)42 b(global)h(preference)g(\(set)g(via)g(the)f +Fj(mark-symlink)m(ed-directories)48 b Ft(Readline)43 +b(v)-5 b(ariable\))390 3039 y(if)38 b(appropriate.)62 +b(This)37 b(v)-5 b(ariable)38 b(is)g(set)g(to)g(the)g(user's)f +(preference)g(b)s(efore)g(an)m(y)h(application-)390 3148 +y(sp)s(eci\014c)31 b(completion)i(function)f(is)f(called,)j(so)e +(unless)f(that)h(function)f(mo)s(di\014es)g(the)h(v)-5 +b(alue,)33 b(the)390 3258 y(user's)d(preferences)g(are)h(honored.)3371 +3477 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_ignore_completion_)q +(dupl)q(ica)q(tes)390 3587 y Ft(If)30 b(non-zero,)h(then)f(duplicates)h +(in)f(the)h(matc)m(hes)g(are)g(remo)m(v)m(ed.)42 b(The)29 +b(default)i(is)f(1.)3371 3806 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_filename_completio)q(n_de)q(sir)q(ed)390 +3915 y Ft(Non-zero)33 b(means)f(that)g(the)g(results)f(of)h(the)g(matc) +m(hes)h(are)f(to)h(b)s(e)e(treated)i(as)f(\014lenames.)45 +b(This)390 4025 y(is)40 b Fk(always)49 b Ft(zero)41 b(when)e +(completion)i(is)f(attempted,)j(and)d(can)g(only)g(b)s(e)f(c)m(hanged)i +(within)e(an)390 4134 y(application-sp)s(eci\014c)i(completion)g +(function.)67 b(If)39 b(it)h(is)f(set)h(to)h(a)e(non-zero)h(v)-5 +b(alue)40 b(b)m(y)f(suc)m(h)h(a)390 4244 y(function,)24 +b(directory)f(names)f(ha)m(v)m(e)h(a)g(slash)f(app)s(ended)e(and)i +(Readline)h(attempts)g(to)g(quote)g(com-)390 4354 y(pleted)35 +b(\014lenames)g(if)g(they)h(con)m(tain)g(an)m(y)f(c)m(haracters)i(in)e +Fs(rl_filename_quote_chara)o(cter)o(s)390 4463 y Ft(and)30 +b Fs(rl_filename_quoting_des)o(ired)24 b Ft(is)30 b(set)h(to)g(a)g +(non-zero)g(v)-5 b(alue.)3371 4682 y([V)d(ariable])-3598 +b Fh(int)53 b(rl_filename_quoting_d)q(esir)q(ed)390 4792 +y Ft(Non-zero)29 b(means)f(that)h(the)f(results)g(of)g(the)g(matc)m +(hes)i(are)e(to)h(b)s(e)e(quoted)h(using)g(double)f(quotes)390 +4902 y(\(or)43 b(an)f(application-sp)s(eci\014c)i(quoting)f(mec)m +(hanism\))g(if)f(the)h(completed)g(\014lename)g(con)m(tains)390 +5011 y(an)m(y)28 b(c)m(haracters)h(in)e Fs(rl_filename_quote_chars)p +Ft(.)34 b(This)27 b(is)g Fk(always)37 b Ft(non-zero)28 +b(when)f(comple-)390 5121 y(tion)h(is)g(attempted,)h(and)e(can)h(only)g +(b)s(e)f(c)m(hanged)h(within)f(an)h(application-sp)s(eci\014c)h +(completion)390 5230 y(function.)37 b(The)21 b(quoting)g(is)g +(e\013ected)i(via)e(a)h(call)g(to)g(the)f(function)g(p)s(oin)m(ted)g +(to)g(b)m(y)g Fs(rl_filename_)390 5340 y(quoting_function)p +Ft(.)p eop end +%%Page: 60 64 +TeXDict begin 60 63 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(60)3371 +299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_attempted_completi)q +(on_o)q(ver)390 408 y Ft(If)93 b(an)h(application-sp)s(eci\014c)i +(completion)f(function)f(assigned)g(to)h Fs(rl_attempted_)390 +518 y(completion_function)48 b Ft(sets)53 b(this)g(v)-5 +b(ariable)54 b(to)g(a)f(non-zero)h(v)-5 b(alue,)60 b(Readline)53 +b(will)h(not)390 628 y(p)s(erform)28 b(its)i(default)g(\014lename)g +(completion)h(ev)m(en)f(if)g(the)f(application's)i(completion)g +(function)390 737 y(returns)e(no)h(matc)m(hes.)42 b(It)31 +b(should)e(b)s(e)h(set)h(only)f(b)m(y)h(an)f(application's)i +(completion)f(function.)3371 922 y([V)-8 b(ariable])-3598 +b Fh(int)53 b(rl_sort_completion_ma)q(tche)q(s)390 1031 +y Ft(If)29 b(an)h(application)h(sets)f(this)g(v)-5 b(ariable)31 +b(to)f(0,)h(Readline)f(will)g(not)g(sort)g(the)g(list)h(of)f +(completions)390 1141 y(\(whic)m(h)25 b(implies)f(that)i(it)f(cannot)g +(remo)m(v)m(e)h(an)m(y)f(duplicate)g(completions\).)40 +b(The)24 b(default)h(v)-5 b(alue)25 b(is)390 1250 y(1,)32 +b(whic)m(h)f(means)g(that)h(Readline)g(will)f(sort)h(the)f(completions) +h(and,)f(dep)s(ending)f(on)h(the)g(v)-5 b(alue)390 1360 +y(of)31 b Fs(rl_ignore_completion_du)o(pli)o(cate)o(s)p +Ft(,)25 b(will)30 b(attempt)i(to)f(remo)m(v)m(e)h(duplicate)f(matc)m +(hes.)3371 1544 y([V)-8 b(ariable])-3598 b Fh(int)53 +b(rl_completion_type)390 1654 y Ft(Set)35 b(to)h(a)f(c)m(haracter)i +(describing)e(the)g(t)m(yp)s(e)g(of)g(completion)i(Readline)e(is)g +(curren)m(tly)h(attempt-)390 1763 y(ing;)f(see)f(the)g(description)f +(of)g Fs(rl_complete_internal\(\))28 b Ft(\(see)34 b(Section)g(2.6.2)h +([Completion)390 1873 y(F)-8 b(unctions],)39 b(page)f(54\))f(for)g(the) +g(list)g(of)g(c)m(haracters.)61 b(This)36 b(is)g(set)i(to)f(the)g +(appropriate)f(v)-5 b(alue)390 1983 y(b)s(efore)31 b(an)m(y)h +(application-sp)s(eci\014c)h(completion)g(function)f(is)f(called,)j +(allo)m(wing)f(suc)m(h)e(functions)390 2092 y(to)g(presen)m(t)g(the)f +(same)h(in)m(terface)h(as)e Fs(rl_complete\(\))p Ft(.)3371 +2276 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_invokin)q +(g_ke)q(y)390 2386 y Ft(Set)41 b(to)g(the)g(\014nal)g(c)m(haracter)h +(in)e(the)h(k)m(ey)g(sequence)h(that)f(in)m(v)m(ok)m(ed)h(one)f(of)g +(the)g(completion)390 2496 y(functions)c(that)h(call)h +Fs(rl_complete_internal\(\))p Ft(.)56 b(This)37 b(is)g(set)h(to)g(the)g +(appropriate)f(v)-5 b(alue)390 2605 y(b)s(efore)30 b(an)m(y)h +(application-sp)s(eci\014c)h(completion)f(function)f(is)h(called.)3371 +2790 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_inhibit_completion)390 +2899 y Ft(If)28 b(this)g(v)-5 b(ariable)29 b(is)f(non-zero,)i +(completion)f(is)f(inhibited.)40 b(The)28 b(completion)h(c)m(haracter)h +(will)f(b)s(e)390 3009 y(inserted)h(as)h(an)m(y)g(other)f(b)s(ound)e +(to)k Fs(self-insert)p Ft(.)150 3208 y Fi(2.6.4)63 b(A)40 +b(Short)i(Completion)g(Example)150 3355 y Ft(Here)30 +b(is)f(a)g(small)h(application)g(demonstrating)f(the)h(use)e(of)i(the)f +(GNU)h(Readline)f(library)-8 b(.)40 b(It)30 b(is)f(called)150 +3465 y Fs(fileman)p Ft(,)40 b(and)f(the)h(source)g(co)s(de)g(resides)f +(in)g Fs(examples/fileman.c)p Ft(.)64 b(This)39 b(sample)h(application) +150 3574 y(pro)m(vides)26 b(completion)i(of)e(command)g(names,)h(line)f +(editing)h(features,)h(and)d(access)j(to)f(the)f(history)g(list.)p +eop end +%%Page: 61 65 +TeXDict begin 61 64 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(61)390 +299 y Fe(/*)40 b(fileman.c)h(--)f(A)f(tiny)h(application)i(which)e +(demonstrates)i(how)e(to)g(use)g(the)508 386 y(GNU)g(Readline)h +(library.)80 b(This)40 b(application)i(interactively)g(allows)f(users) +508 473 y(to)e(manipulate)j(files)e(and)g(their)h(modes.)f(*/)390 +648 y(#ifdef)h(HAVE_CONFIG_H)390 735 y(#)79 b(include)40 +b()390 822 y(#endif)390 996 y(#include)h()390 +1083 y(#ifdef)g(HAVE_SYS_FILE_H)390 1171 y(#)79 b(include)40 +b()390 1258 y(#endif)390 1345 y(#include)h()390 +1519 y(#ifdef)g(HAVE_UNISTD_H)390 1606 y(#)79 b(include)40 +b()390 1694 y(#endif)390 1868 y(#include)h()390 +1955 y(#include)g()390 2042 y(#include)g()390 +2130 y(#include)g()390 2304 y(#if)f(defined)h +(\(HAVE_STRING_H\))390 2391 y(#)79 b(include)40 b()390 +2478 y(#else)g(/*)g(!HAVE_STRING_H)i(*/)390 2565 y(#)79 +b(include)40 b()390 2653 y(#endif)h(/*)e(!HAVE_STRING_H)k +(*/)390 2827 y(#ifdef)e(HAVE_STDLIB_H)390 2914 y(#)79 +b(include)40 b()390 3001 y(#endif)390 3176 +y(#include)h()390 3350 y(#include)g()390 +3437 y(#include)g()390 3611 y(extern)g(char)f +(*xmalloc)h(PARAMS\(\(size_t\)\);)390 3786 y(/*)f(The)g(names)g(of)g +(functions)h(that)f(actually)h(do)f(the)g(manipulation.)i(*/)390 +3873 y(int)e(com_list)h(PARAMS\(\(char)h(*\)\);)390 3960 +y(int)e(com_view)h(PARAMS\(\(char)h(*\)\);)390 4047 y(int)e(com_rename) +h(PARAMS\(\(char)h(*\)\);)390 4134 y(int)e(com_stat)h(PARAMS\(\(char)h +(*\)\);)390 4222 y(int)e(com_pwd)h(PARAMS\(\(char)h(*\)\);)390 +4309 y(int)e(com_delete)h(PARAMS\(\(char)h(*\)\);)390 +4396 y(int)e(com_help)h(PARAMS\(\(char)h(*\)\);)390 4483 +y(int)e(com_cd)g(PARAMS\(\(char)i(*\)\);)390 4570 y(int)e(com_quit)h +(PARAMS\(\(char)h(*\)\);)390 4745 y(/*)e(A)f(structure)i(which)g +(contains)g(information)h(on)d(the)h(commands)h(this)f(program)508 +4832 y(can)g(understand.)h(*/)390 5006 y(typedef)g(struct)f({)468 +5093 y(char)h(*name;)f(/*)g(User)g(printable)h(name)f(of)g(the)g +(function.)h(*/)468 5181 y(rl_icpfunc_t)h(*func;)f(/*)f(Function)h(to)e +(call)i(to)e(do)h(the)g(job.)g(*/)468 5268 y(char)h(*doc;)f(/*)g +(Documentation)i(for)e(this)g(function.)80 b(*/)p eop +end +%%Page: 62 66 +TeXDict begin 62 65 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(62)390 +299 y Fe(})39 b(COMMAND;)390 473 y(COMMAND)i(commands[])g(=)f({)468 +560 y({)g("cd",)g(com_cd,)h("Change)g(to)f(directory)h(DIR")f(},)468 +648 y({)g("delete",)h(com_delete,)h("Delete)f(FILE")f(},)468 +735 y({)g("help",)h(com_help,)g("Display)g(this)f(text")h(},)468 +822 y({)f("?",)g(com_help,)h("Synonym)g(for)f(`help'")h(},)468 +909 y({)f("list",)h(com_list,)g("List)f(files)h(in)e(DIR")i(},)468 +996 y({)f("ls",)g(com_list,)i("Synonym)f(for)f(`list'")g(},)468 +1083 y({)g("pwd",)g(com_pwd,)i("Print)e(the)g(current)h(working)g +(directory")g(},)468 1171 y({)f("quit",)h(com_quit,)g("Quit)f(using)h +(Fileman")g(},)468 1258 y({)f("rename",)h(com_rename,)h("Rename)f(FILE) +f(to)g(NEWNAME")h(},)468 1345 y({)f("stat",)h(com_stat,)g("Print)g(out) +f(statistics)h(on)f(FILE")g(},)468 1432 y({)g("view",)h(com_view,)g +("View)f(the)g(contents)h(of)f(FILE")g(},)468 1519 y({)g(\(char)g +(*\)NULL,)h(\(rl_icpfunc_t)h(*\)NULL,)f(\(char)f(*\)NULL)h(})390 +1606 y(};)390 1781 y(/*)f(Forward)g(declarations.)j(*/)390 +1868 y(char)d(*stripwhite)i(\(\);)390 1955 y(COMMAND)f(*find_command)h +(\(\);)390 2130 y(/*)e(The)g(name)g(of)f(this)i(program,)g(as)e(taken)i +(from)f(argv[0].)h(*/)390 2217 y(char)f(*progname;)390 +2391 y(/*)g(When)g(non-zero,)h(this)f(global)h(means)f(the)g(user)g(is) +g(done)g(using)g(this)h(program.)g(*/)390 2478 y(int)f(done;)390 +2653 y(char)g(*)390 2740 y(dupstr)h(\(s\))586 2827 y(char)f(*s;)390 +2914 y({)468 3001 y(char)h(*r;)468 3176 y(r)f(=)f(xmalloc)i(\(strlen)g +(\(s\))f(+)f(1\);)468 3263 y(strcpy)i(\(r,)f(s\);)468 +3350 y(return)h(\(r\);)390 3437 y(})390 3611 y(main)f(\(argc,)h(argv\)) +586 3699 y(int)f(argc;)586 3786 y(char)g(**argv;)390 +3873 y({)468 3960 y(char)h(*line,)f(*s;)468 4134 y(setlocale)i +(\(LC_ALL,)f(""\);)468 4309 y(progname)g(=)f(argv[0];)468 +4483 y(initialize_readline)k(\(\);)c(/*)g(Bind)g(our)g(completer.)h(*/) +468 4658 y(/*)f(Loop)g(reading)h(and)f(executing)h(lines)g(until)f(the) +g(user)g(quits.)h(*/)468 4745 y(for)f(\()g(;)f(done)h(==)g(0;)g(\))547 +4832 y({)625 4919 y(line)g(=)g(readline)h(\("FileMan:)h("\);)625 +5093 y(if)e(\(!line\))704 5181 y(break;)p eop end +%%Page: 63 67 +TeXDict begin 63 66 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(63)625 +299 y Fe(/*)40 b(Remove)h(leading)f(and)g(trailing)h(whitespace)h(from) +e(the)g(line.)743 386 y(Then,)g(if)g(there)g(is)g(anything)h(left,)g +(add)e(it)h(to)g(the)g(history)h(list)743 473 y(and)f(execute)h(it.)f +(*/)625 560 y(s)g(=)f(stripwhite)j(\(line\);)625 735 +y(if)e(\(*s\))704 822 y({)782 909 y(add_history)i(\(s\);)782 +996 y(execute_line)g(\(s\);)704 1083 y(})625 1258 y(free)e(\(line\);) +547 1345 y(})468 1432 y(exit)h(\(0\);)390 1519 y(})390 +1694 y(/*)f(Execute)g(a)g(command)h(line.)f(*/)390 1781 +y(int)390 1868 y(execute_line)i(\(line\))586 1955 y(char)e(*line;)390 +2042 y({)468 2130 y(register)h(int)f(i;)468 2217 y(COMMAND)h(*command;) +468 2304 y(char)g(*word;)468 2478 y(/*)f(Isolate)h(the)f(command)h +(word.)f(*/)468 2565 y(i)g(=)f(0;)468 2653 y(while)i(\(line[i])g(&&)f +(whitespace)h(\(line[i]\)\))547 2740 y(i++;)468 2827 +y(word)g(=)e(line)h(+)g(i;)468 3001 y(while)h(\(line[i])g(&&)f +(!whitespace)h(\(line[i]\)\))547 3088 y(i++;)468 3263 +y(if)f(\(line[i]\))547 3350 y(line[i++])h(=)f('\\0';)468 +3524 y(command)h(=)f(find_command)i(\(word\);)468 3699 +y(if)e(\(!command\))547 3786 y({)625 3873 y(fprintf)h(\(stderr,)g +("\045s:)f(No)g(such)g(command)h(for)f(FileMan.\\n",)i(word\);)625 +3960 y(return)f(\(-1\);)547 4047 y(})468 4222 y(/*)f(Get)g(argument)h +(to)f(command,)h(if)f(any.)g(*/)468 4309 y(while)h(\(whitespace)h +(\(line[i]\)\))547 4396 y(i++;)468 4570 y(word)f(=)e(line)h(+)g(i;)468 +4745 y(/*)g(Call)g(the)g(function.)h(*/)468 4832 y(return)g +(\(\(*\(command->func\)\))j(\(word\)\);)390 4919 y(})390 +5093 y(/*)c(Look)g(up)f(NAME)i(as)e(the)h(name)g(of)g(a)g(command,)h +(and)e(return)i(a)f(pointer)g(to)g(that)508 5181 y(command.)80 +b(Return)41 b(a)e(NULL)h(pointer)h(if)f(NAME)g(isn't)g(a)g(command)g +(name.)h(*/)390 5268 y(COMMAND)g(*)p eop end +%%Page: 64 68 +TeXDict begin 64 67 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(64)390 +299 y Fe(find_command)42 b(\(name\))586 386 y(char)e(*name;)390 +473 y({)468 560 y(register)h(int)f(i;)468 735 y(for)g(\(i)g(=)f(0;)h +(commands[i].name;)j(i++\))547 822 y(if)d(\(strcmp)g(\(name,)h +(commands[i].name\))i(==)d(0\))625 909 y(return)h(\(&commands[i]\);)468 +1083 y(return)g(\(\(COMMAND)g(*\)NULL\);)390 1171 y(})390 +1345 y(/*)f(Strip)g(whitespace)i(from)e(the)g(start)g(and)g(end)g(of)f +(STRING.)81 b(Return)40 b(a)g(pointer)508 1432 y(into)g(STRING.)h(*/) +390 1519 y(char)f(*)390 1606 y(stripwhite)h(\(string\))586 +1694 y(char)f(*string;)390 1781 y({)468 1868 y(register)h(char)g(*s,)f +(*t;)468 2042 y(for)g(\(s)g(=)f(string;)i(whitespace)h(\(*s\);)e(s++\)) +547 2130 y(;)468 2304 y(if)g(\(*s)g(==)g(0\))547 2391 +y(return)g(\(s\);)468 2565 y(t)g(=)f(s)h(+)f(strlen)i(\(s\))f(-)f(1;) +468 2653 y(while)i(\(t)e(>)h(s)f(&&)h(whitespace)i(\(*t\)\))547 +2740 y(t--;)468 2827 y(*++t)f(=)e('\\0';)468 3001 y(return)i(s;)390 +3088 y(})390 3263 y(/*)f(******************************)q(*****)q(****) +q(*****)q(****)q(****)q(*****)q(****)q(***)45 b(*/)390 +3350 y(/*)2589 b(*/)390 3437 y(/*)707 b(Interface)41 +b(to)f(Readline)h(Completion)629 b(*/)390 3524 y(/*)2589 +b(*/)390 3611 y(/*)40 b(******************************)q(*****)q(****)q +(*****)q(****)q(****)q(*****)q(****)q(***)45 b(*/)390 +3786 y(char)40 b(*command_generator)j(PARAMS\(\(const)g(char)d(*,)f +(int\)\);)390 3873 y(char)h(**fileman_completion)k(PARAMS\(\(const)e +(char)e(*,)g(int,)g(int\)\);)390 4047 y(/*)g(Tell)g(the)g(GNU)g +(Readline)h(library)g(how)e(to)h(complete.)81 b(We)39 +b(want)h(to)g(try)g(to)g(complete)508 4134 y(on)f(command)i(names)g(if) +e(this)h(is)g(the)g(first)g(word)g(in)g(the)g(line,)g(or)g(on)g +(filenames)508 4222 y(if)f(not.)h(*/)390 4309 y(initialize_readline)k +(\(\))390 4396 y({)468 4483 y(/*)c(Allow)g(conditional)i(parsing)f(of)f +(the)g(~/.inputrc)h(file.)g(*/)468 4570 y(rl_readline_name)i(=)d +("FileMan";)468 4745 y(/*)g(Tell)g(the)g(completer)h(that)g(we)e(want)h +(a)g(crack)g(first.)h(*/)468 4832 y(rl_attempted_completion_fun)q(ctio) +q(n)k(=)39 b(fileman_completion;)390 4919 y(})390 5093 +y(/*)h(Attempt)g(to)g(complete)h(on)f(the)g(contents)h(of)f(TEXT.)79 +b(START)41 b(and)e(END)h(bound)h(the)508 5181 y(region)f(of)g +(rl_line_buffer)i(that)f(contains)g(the)e(word)i(to)e(complete.)81 +b(TEXT)40 b(is)508 5268 y(the)g(word)g(to)f(complete.)81 +b(We)40 b(can)g(use)f(the)h(entire)h(contents)g(of)f(rl_line_buffer)p +eop end +%%Page: 65 69 +TeXDict begin 65 68 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(65)508 +299 y Fe(in)39 b(case)h(we)g(want)g(to)g(do)g(some)g(simple)g(parsing.) +81 b(Return)40 b(the)g(array)h(of)e(matches,)508 386 +y(or)g(NULL)h(if)g(there)h(aren't)f(any.)g(*/)390 473 +y(char)g(**)390 560 y(fileman_completion)j(\(text,)e(start,)g(end\))586 +648 y(const)f(char)h(*text;)586 735 y(int)f(start,)h(end;)390 +822 y({)468 909 y(char)g(**matches;)468 1083 y(matches)g(=)f(\(char)g +(**\)NULL;)468 1258 y(/*)g(If)g(this)g(word)g(is)g(at)f(the)h(start)h +(of)e(the)h(line,)h(then)f(it)g(is)f(a)h(command)586 +1345 y(to)g(complete.)80 b(Otherwise)42 b(it)d(is)h(the)g(name)g(of)g +(a)f(file)h(in)g(the)g(current)586 1432 y(directory.)i(*/)468 +1519 y(if)e(\(start)h(==)e(0\))547 1606 y(matches)i(=)e +(rl_completion_matches)44 b(\(text,)d(command_generator\);)468 +1781 y(return)g(\(matches\);)390 1868 y(})390 2042 y(/*)f(Generator)h +(function)g(for)f(command)h(completion.)81 b(STATE)40 +b(lets)g(us)g(know)g(whether)508 2130 y(to)f(start)i(from)f(scratch;)h +(without)g(any)f(state)g(\(i.e.)g(STATE)h(==)e(0\),)h(then)g(we)508 +2217 y(start)g(at)g(the)g(top)g(of)f(the)h(list.)h(*/)390 +2304 y(char)f(*)390 2391 y(command_generator)j(\(text,)e(state\))586 +2478 y(const)f(char)h(*text;)586 2565 y(int)f(state;)390 +2653 y({)468 2740 y(static)h(int)f(list_index,)i(len;)468 +2827 y(char)f(*name;)468 3001 y(/*)f(If)g(this)g(is)g(a)f(new)h(word)g +(to)g(complete,)h(initialize)h(now.)79 b(This)40 b(includes)586 +3088 y(saving)h(the)f(length)g(of)g(TEXT)g(for)g(efficiency,)i(and)e +(initializing)i(the)d(index)586 3176 y(variable)i(to)f(0.)g(*/)468 +3263 y(if)g(\(!state\))547 3350 y({)625 3437 y(list_index)i(=)d(0;)625 +3524 y(len)h(=)g(strlen)g(\(text\);)547 3611 y(})468 +3786 y(/*)g(Return)h(the)f(next)g(name)g(which)g(partially)i(matches)e +(from)h(the)e(command)i(list.)g(*/)468 3873 y(while)g(\(name)f(=)g +(commands[list_index].name\))547 3960 y({)625 4047 y(list_index++;)625 +4222 y(if)g(\(strncmp)h(\(name,)g(text,)f(len\))g(==)g(0\))704 +4309 y(return)g(\(dupstr\(name\)\);)547 4396 y(})468 +4570 y(/*)g(If)g(no)f(names)i(matched,)g(then)f(return)h(NULL.)f(*/)468 +4658 y(return)h(\(\(char)g(*\)NULL\);)390 4745 y(})390 +4919 y(/*)f(******************************)q(*****)q(****)q(*****)q +(****)q(****)q(*****)q(****)q(***)45 b(*/)390 5006 y(/*)2589 +b(*/)390 5093 y(/*)903 b(FileMan)41 b(Commands)1060 b(*/)390 +5181 y(/*)2589 b(*/)390 5268 y(/*)40 b(******************************)q +(*****)q(****)q(*****)q(****)q(****)q(*****)q(****)q(***)45 +b(*/)p eop end +%%Page: 66 70 +TeXDict begin 66 69 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(66)390 +386 y Fe(/*)40 b(String)g(to)g(pass)g(to)g(system)g(\(\).)80 +b(This)40 b(is)f(for)h(the)g(LIST,)h(VIEW)f(and)g(RENAME)508 +473 y(commands.)h(*/)390 560 y(static)g(char)f(syscom[1024];)390 +735 y(/*)g(List)g(the)g(file\(s\))h(named)f(in)g(arg.)g(*/)390 +822 y(com_list)h(\(arg\))586 909 y(char)f(*arg;)390 996 +y({)468 1083 y(if)g(\(!arg\))547 1171 y(arg)g(=)f("";)468 +1345 y(sprintf)i(\(syscom,)g("ls)f(-FClg)h(\045s",)f(arg\);)468 +1432 y(return)h(\(system)g(\(syscom\)\);)390 1519 y(})390 +1694 y(com_view)g(\(arg\))586 1781 y(char)f(*arg;)390 +1868 y({)468 1955 y(if)g(\(!valid_argument)j(\("view",)e(arg\)\))547 +2042 y(return)f(1;)390 2217 y(#if)g(defined)h(\(__MSDOS__\))468 +2304 y(/*)f(more.com)h(doesn't)g(grok)f(slashes)h(in)f(pathnames)h(*/) +468 2391 y(sprintf)g(\(syscom,)g("less)g(\045s",)f(arg\);)390 +2478 y(#else)468 2565 y(sprintf)h(\(syscom,)g("more)g(\045s",)f(arg\);) +390 2653 y(#endif)468 2740 y(return)h(\(system)g(\(syscom\)\);)390 +2827 y(})390 3001 y(com_rename)g(\(arg\))586 3088 y(char)f(*arg;)390 +3176 y({)468 3263 y(too_dangerous)j(\("rename"\);)468 +3350 y(return)e(\(1\);)390 3437 y(})390 3611 y(com_stat)g(\(arg\))586 +3699 y(char)f(*arg;)390 3786 y({)468 3873 y(struct)h(stat)f(finfo;)468 +4047 y(if)g(\(!valid_argument)j(\("stat",)e(arg\)\))547 +4134 y(return)f(\(1\);)468 4309 y(if)g(\(stat)g(\(arg,)h(&finfo\))g(==) +e(-1\))547 4396 y({)625 4483 y(perror)i(\(arg\);)625 +4570 y(return)g(\(1\);)547 4658 y(})468 4832 y(printf)g(\("Statistics)h +(for)e(`\045s':\\n",)h(arg\);)468 5006 y(printf)g(\("\045s)f(has)g +(\045d)g(link\045s,)h(and)f(is)f(\045d)h(byte\045s)g(in)g(length.\\n",) +468 5093 y(arg,)782 5181 y(finfo.st_nlink,)782 5268 y(\(finfo.st_nlink) +j(==)d(1\))f(?)h("")f(:)h("s",)p eop end +%%Page: 67 71 +TeXDict begin 67 70 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(67)782 +299 y Fe(finfo.st_size,)782 386 y(\(finfo.st_size)43 +b(==)c(1\))h(?)g("")f(:)h("s"\);)468 473 y(printf)h(\("Inode)g(Last)f +(Change)h(at:)f(\045s",)g(ctime)g(\(&finfo.st_ctime\)\);)468 +560 y(printf)h(\(")236 b(Last)40 b(access)h(at:)f(\045s",)g(ctime)g +(\(&finfo.st_atime\)\);)468 648 y(printf)h(\(")157 b(Last)41 +b(modified)g(at:)f(\045s",)g(ctime)g(\(&finfo.st_mtime\)\);)468 +735 y(return)h(\(0\);)390 822 y(})390 996 y(com_delete)g(\(arg\))586 +1083 y(char)f(*arg;)390 1171 y({)468 1258 y(too_dangerous)j +(\("delete"\);)468 1345 y(return)e(\(1\);)390 1432 y(})390 +1606 y(/*)f(Print)g(out)g(help)g(for)g(ARG,)g(or)g(for)g(all)g(of)f +(the)h(commands)h(if)f(ARG)g(is)508 1694 y(not)g(present.)h(*/)390 +1781 y(com_help)g(\(arg\))586 1868 y(char)f(*arg;)390 +1955 y({)468 2042 y(register)h(int)f(i;)468 2130 y(int)g(printed)h(=)f +(0;)468 2304 y(for)g(\(i)g(=)f(0;)h(commands[i].name;)j(i++\))547 +2391 y({)625 2478 y(if)d(\(!*arg)h(||)e(\(strcmp)i(\(arg,)g +(commands[i].name\))i(==)c(0\)\))704 2565 y({)782 2653 +y(printf)i(\("\045s\\t\\t\045s.\\n",)i(commands[i].name,)g +(commands[i].doc\);)782 2740 y(printed++;)704 2827 y(})547 +2914 y(})468 3088 y(if)d(\(!printed\))547 3176 y({)625 +3263 y(printf)h(\("No)f(commands)h(match)g(`\045s'.)79 +b(Possibilities)42 b(are:\\n",)f(arg\);)625 3437 y(for)f(\(i)g(=)f(0;)h +(commands[i].name;)j(i++\))704 3524 y({)782 3611 y(/*)d(Print)g(in)g +(six)g(columns.)h(*/)782 3699 y(if)f(\(printed)h(==)f(6\))861 +3786 y({)939 3873 y(printed)h(=)e(0;)939 3960 y(printf)i(\("\\n"\);)861 +4047 y(})782 4222 y(printf)g(\("\045s\\t",)g(commands[i].name\);)782 +4309 y(printed++;)704 4396 y(})625 4570 y(if)f(\(printed\))704 +4658 y(printf)g(\("\\n"\);)547 4745 y(})468 4832 y(return)h(\(0\);)390 +4919 y(})390 5093 y(/*)f(Change)g(to)g(the)g(directory)h(ARG.)f(*/)390 +5181 y(com_cd)h(\(arg\))586 5268 y(char)f(*arg;)p eop +end +%%Page: 68 72 +TeXDict begin 68 71 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(68)390 +299 y Fe({)468 386 y(if)40 b(\(chdir)h(\(arg\))f(==)g(-1\))547 +473 y({)625 560 y(perror)h(\(arg\);)625 648 y(return)g(1;)547 +735 y(})468 909 y(com_pwd)g(\(""\);)468 996 y(return)g(\(0\);)390 +1083 y(})390 1258 y(/*)f(Print)g(out)g(the)g(current)h(working)g +(directory.)g(*/)390 1345 y(com_pwd)g(\(ignore\))586 +1432 y(char)f(*ignore;)390 1519 y({)468 1606 y(char)h(dir[1024],)g(*s;) +468 1781 y(s)f(=)f(getcwd)i(\(dir,)f(sizeof\(dir\))i(-)e(1\);)468 +1868 y(if)g(\(s)g(==)f(0\))547 1955 y({)625 2042 y(printf)i(\("Error)g +(getting)g(pwd:)f(\045s\\n",)g(dir\);)625 2130 y(return)h(1;)547 +2217 y(})468 2391 y(printf)g(\("Current)g(directory)h(is)d(\045s\\n",)i +(dir\);)468 2478 y(return)g(0;)390 2565 y(})390 2740 +y(/*)f(The)g(user)g(wishes)g(to)g(quit)g(using)h(this)f(program.)80 +b(Just)40 b(set)g(DONE)g(non-zero.)h(*/)390 2827 y(com_quit)g(\(arg\)) +586 2914 y(char)f(*arg;)390 3001 y({)468 3088 y(done)h(=)e(1;)468 +3176 y(return)i(\(0\);)390 3263 y(})390 3437 y(/*)f(Function)h(which)f +(tells)g(you)g(that)h(you)e(can't)i(do)e(this.)i(*/)390 +3524 y(too_dangerous)h(\(caller\))586 3611 y(char)e(*caller;)390 +3699 y({)468 3786 y(fprintf)h(\(stderr,)821 3873 y("\045s:)g(Too)f +(dangerous)h(for)f(me)f(to)h(distribute.)81 b(Write)40 +b(it)g(yourself.\\n",)821 3960 y(caller\);)390 4047 y(})390 +4222 y(/*)g(Return)g(non-zero)h(if)f(ARG)g(is)g(a)f(valid)h(argument)h +(for)f(CALLER,)h(else)f(print)508 4309 y(an)f(error)i(message)g(and)e +(return)i(zero.)f(*/)390 4396 y(int)390 4483 y(valid_argument)i +(\(caller,)f(arg\))586 4570 y(char)f(*caller,)h(*arg;)390 +4658 y({)468 4745 y(if)f(\(!arg)g(||)g(!*arg\))547 4832 +y({)625 4919 y(fprintf)h(\(stderr,)g("\045s:)f(Argument)h +(required.\\n",)i(caller\);)625 5006 y(return)e(\(0\);)547 +5093 y(})468 5268 y(return)g(\(1\);)p eop end +%%Page: 69 73 +TeXDict begin 69 72 bop 150 -116 a Ft(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(Readline)1683 b(69)390 +299 y Fe(})p eop end +%%Page: 70 74 +TeXDict begin 70 73 bop 3659 -116 a Ft(70)150 299 y Fp(App)t(endix)52 +b(A)81 b(GNU)54 b(F)-13 b(ree)53 b(Do)t(cumen)l(tation)e(License)1359 +502 y Ft(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390 +635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fq(\015)e +Ft(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31 +b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745 +y Fs(http://fsf.org/)390 964 y Ft(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f +(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390 +1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f +(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330 +1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g +(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330 +1450 y(useful)29 b(do)s(cumen)m(t)h Fj(free)36 b Ft(in)29 +b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j +(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f +(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i +(either)f(commercially)h(or)e(non-)330 1669 y(commercially)-8 +b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f +(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 1778 +y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g +(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330 +1888 y(made)30 b(b)m(y)h(others.)330 2021 y(This)22 b(License)i(is)f(a) +h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5 +b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330 +2131 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g +(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330 +2240 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed) +e(for)g(free)h(soft)m(w)m(are.)330 2373 y(W)-8 b(e)31 +b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h +(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330 +2483 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:) +65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330 +2592 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w) +m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g +(to)330 2702 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g +(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5 +b(ject)30 b(matter)i(or)330 2812 y(whether)f(it)h(is)f(published)f(as)i +(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h +(License)g(principally)f(for)330 2921 y(w)m(orks)f(whose)h(purp)s(ose)d +(is)j(instruction)f(or)g(reference.)199 3054 y(1.)61 +b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3187 y(This)39 +b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i +(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3297 +y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying) +h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330 +3407 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f +(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d +(in)330 3516 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j +(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330 +3626 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h +(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g +(a)h(licensee,)i(and)330 3735 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40 +b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8 +b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330 +3845 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop) +m(yrigh)m(t)j(la)m(w.)330 3978 y(A)i(\\Mo)s(di\014ed)f(V)-8 +b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f +(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4088 y(a)k(p)s(ortion)f +(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s +(di\014cations)f(and/or)h(translated)g(in)m(to)330 4197 +y(another)31 b(language.)330 4330 y(A)26 b(\\Secondary)g(Section")h(is) +f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f +(the)g(Do)s(cumen)m(t)330 4440 y(that)c(deals)g(exclusiv)m(ely)h(with)e +(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f +(Do)s(cumen)m(t)330 4549 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m +(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con) +m(tains)h(nothing)f(that)330 4659 y(could)j(fall)h(directly)g(within)f +(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42 +b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330 +4769 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section) +h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40 +b(The)330 4878 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e +(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27 +b(or)g(with)g(related)330 4988 y(matters,)38 b(or)d(of)h(legal,)i +(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s +(osition)f(regarding)330 5097 y(them.)330 5230 y(The)25 +b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g +(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330 +5340 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27 +b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s +(cumen)m(t)g(is)g(released)p eop end +%%Page: 71 75 +TeXDict begin 71 74 bop 150 -116 a Ft(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(71)330 299 y(under)26 b(this)i(License.)40 b(If)27 +b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h +(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 408 +y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5 +b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero) +e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25 +b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v) +-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330 +669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short) +g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8 +b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er) +j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f +(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40 +b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26 +b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m +(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m +(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g +(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8 +b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s +(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g +(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s +(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors) +f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g +(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g +(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587 +y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g +(formatters)f(or)g(for)g(automatic)i(translation)f(to)330 +1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input) +g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g +(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g +(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f +(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g +(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8 +b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35 +b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g +(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g +(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i +(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T) +-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fm(asci)r(i)g +Ft(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j +(LaT)1759 2414 y(E)1810 2395 y(X)e(input)f(format,)j +Fd(SGML)f Ft(or)f Fd(XML)g Ft(using)g(a)g(publicly)330 +2504 y(a)m(v)-5 b(ailable)42 b Fd(DTD)p Ft(,)h(and)c +(standard-conforming)g(simple)h Fd(HTML)p Ft(,)i(P)m(ostScript)e(or)f +Fd(PDF)h Ft(designed)330 2614 y(for)e(h)m(uman)f(mo)s(di\014cation.)65 +b(Examples)38 b(of)h(transparen)m(t)f(image)h(formats)g(include)f +Fd(PNG)p Ft(,)i Fd(X)n(CF)330 2724 y Ft(and)e Fd(JPG)p +Ft(.)64 b(Opaque)38 b(formats)h(include)f(proprietary)h(formats)f(that) +h(can)g(b)s(e)f(read)h(and)f(edited)330 2833 y(only)54 +b(b)m(y)f(proprietary)h(w)m(ord)f(pro)s(cessors,)59 b +Fd(SGML)54 b Ft(or)f Fd(XML)h Ft(for)g(whic)m(h)f(the)h +Fd(DTD)g Ft(and/or)330 2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g +(generally)i(a)m(v)-5 b(ailable,)71 b(and)60 b(the)h(mac)m +(hine-generated)j Fd(HTML)p Ft(,)330 3052 y(P)m(ostScript)31 +b(or)f Fd(PDF)h Ft(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s +(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330 +3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m(ted)f(b) +s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f(follo)m +(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8 +b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f +(in)h(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28 +b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e +(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330 +3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s +(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330 +3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330 +3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit) +m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330 +3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g +(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h +(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m +(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f +(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40 +b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f +(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m +(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f +(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491 +y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s +(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330 +4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g +(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W) +-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m +(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f +(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36 +b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m +(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f +(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g +(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39 +b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330 +5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199 +5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end +%%Page: 72 76 +TeXDict begin 72 75 bop 150 -116 a Ft(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(72)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h +(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h +(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 +b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j +(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e +(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e +(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h +(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f +(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 +737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h +(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330 +847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28 +b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d +(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f +(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g +(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200 +y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g +(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g +(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443 +y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25 +b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g +(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330 +1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f +(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330 +1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i +(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36 +b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m +(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41 +b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44 +b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330 +2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m) +m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f +(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34 +b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i +(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e +(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g +(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330 +2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v) +m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the) +330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d +(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330 +2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e +(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g +(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f +(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the) +g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330 +2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051 +y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f +(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330 +3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g +(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque) +330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h +(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d +(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e +(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m +(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8 +b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g +(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h +(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e +(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g +(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38 +b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330 +3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s +(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h +(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i +(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h +(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330 +4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g +(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330 +4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s +(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m +(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g +(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8 +b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a) +h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under) +e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v) +m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f +(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29 +b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30 +b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f +(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h +(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s +(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30 +b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s +(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33 +b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e +(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510 +5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m +(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8 +b(,)p eop end +%%Page: 73 77 +TeXDict begin 73 76 bop 150 -116 a Ft(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(73)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g +(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same) +h(title)h(as)510 408 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original) +i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 +545 y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h +(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c +(for)510 655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g +(Mo)s(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h +(\014v)m(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s +(cumen)m(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g +(few)m(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g +(y)m(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60 +b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g +(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32 +b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31 +b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.) +363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i +(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g +(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641 +y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g +(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510 +1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8 +b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g +(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353 +1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f +(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e +(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f +(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244 +y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.) +392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g +(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g +(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d +(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8 +b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45 +b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e +(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f +(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s +(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i +(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8 +b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m +(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s +(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m +(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30 +b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net) +m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m +(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45 +b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395 +y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net) +m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h +(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e +(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher) +d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s +(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m +(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k +(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d +(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone) +h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m +(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368 +4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5 +b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f +(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58 +b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5 +b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510 +4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33 +b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42 +b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510 +4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357 +4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f +(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g +(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31 +b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8 +b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g +(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f +(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g +(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h +(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h +(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5 +b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p +eop end +%%Page: 74 78 +TeXDict begin 74 77 bop 150 -116 a Ft(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(74)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 +b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8 +b(ersion's)36 b(license)g(notice.)57 b(These)330 408 +y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g +(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section) +i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g +(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s +(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30 +b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770 +y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro) +m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330 +880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8 +b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m +(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8 +b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e +(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i +(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s +(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f +(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m +(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351 +y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\)) +g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t) +g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g +(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m +(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m +(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g +(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the) +f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e +(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330 +1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s +(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s +(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g +(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g +(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61 +b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m +(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h +(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g +(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f +(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655 +y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5 +b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s +(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g +(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined) +g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32 +b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8 +b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m +(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,) +i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5 +b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h +(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m +(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g +(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f +(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f +(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g +(the)g(original)h(author)f(or)330 3455 y(publisher)23 +b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m +(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330 +3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5 +b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h +(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m +(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g +(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330 +3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h +(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330 +4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31 +b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47 +b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m +(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28 +b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f +(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g +(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k +(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f +(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single) +g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48 +b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38 +b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g +(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330 +4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32 +b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h +(collection,)i(and)d(distribute)g(it)h(individu-)330 +5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g +(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330 +5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g +(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330 +5340 y(that)d(do)s(cumen)m(t.)p eop end +%%Page: 75 79 +TeXDict begin 75 78 bop 150 -116 a Ft(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(75)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h +(W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f +(its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep) +s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h +(on)f(a)g(v)m(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g +(is)h(called)330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i +(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g +(the)330 770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e +(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39 +b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g +(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g +(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h +(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h +(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8 +b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f +(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241 +y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f +(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m +(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m +(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h +(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5 +b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f +(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330 +1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f +(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61 +b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a) +i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e +(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h +(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5 +b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f +(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i +(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24 +b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25 +b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330 +2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44 +b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f +(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the) +h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42 +b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513 +y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g +(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330 +2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33 +b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f +(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f +(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m +(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28 +b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m +(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330 +3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m +(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330 +3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61 +b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8 +b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h +(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38 +b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g +(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330 +3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically) +i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330 +3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i +(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h +(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h +(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g +(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h +(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8 +b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34 +b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h +(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288 +y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d +(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h +(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h +(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g +(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m +(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f +(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330 +4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g +(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h +(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28 +b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h +(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38 +b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g +(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e) +330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g +(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f +(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f +(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end +%%Page: 76 80 +TeXDict begin 76 79 bop 150 -116 a Ft(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(76)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 +433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8 +b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g +(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34 +b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31 +b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330 +653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f +(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330 +762 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p Ft(.)330 +897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g +(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29 +b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g +(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h +(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33 +b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i +(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330 +1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m +(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g +(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8 +b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s +(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445 +y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m +(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the) +h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46 +b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f +(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f +(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen) +m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m +(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g +(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330 +2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or) +e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330 +2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m +(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h +(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g +(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i +(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33 +b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s +(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330 +2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m +(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330 +2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m +(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330 +2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a) +g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330 +2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29 +b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions) +f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g +(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e +(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h +(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330 +3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h +(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330 +3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h +(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330 +3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f +(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts) +330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j +(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s +(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h +(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site) +g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g +(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is) +330 4005 y(eligible)h(for)e(relicensing.)p eop end +%%Page: 77 81 +TeXDict begin 77 80 bop 150 -116 a Ft(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(77)150 299 y Fr(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f +(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Ft(T)-8 b(o)35 +b(use)f(this)h(License)g(in)f(a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e) +i(written,)g(include)f(a)f(cop)m(y)i(of)f(the)f(License)h(in)g(the)150 +568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh) +m(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468 +680 y Fe(Copyright)42 b(\(C\))79 b Fc(year)g(your)40 +b(name)p Fe(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h +(distribute)g(and/or)g(modify)f(this)g(document)468 854 +y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i +(License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h +(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468 +1029 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g +(and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f +(license)i(is)f(included)h(in)f(the)g(section)g(entitled)h(``GNU)468 +1203 y(Free)g(Documentation)h(License''.)275 1337 y Ft(If)d(y)m(ou)h +(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8 +b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k +(T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6 +b(.)22 b(.)g(.)12 b(T)-8 b(exts.")41 b(line)31 b(with)f(this:)547 +1559 y Fe(with)40 b(the)g(Invariant)h(Sections)g(being)g +Fc(list)f(their)g(titles)p Fe(,)h(with)547 1646 y(the)f(Front-Cover)i +(Texts)e(being)g Fc(list)p Fe(,)h(and)f(with)g(the)g(Back-Cover)h +(Texts)547 1733 y(being)f Fc(list)p Fe(.)275 1868 y Ft(If)34 +b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f +(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g +(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g +(alternativ)m(es)i(to)e(suit)f(the)h(situation.)275 2112 +y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g +(examples)g(of)f(program)f(co)s(de,)j(w)m(e)e(recommend)g(releasing)150 +2222 y(these)44 b(examples)f(in)g(parallel)h(under)e(y)m(our)h(c)m +(hoice)i(of)e(free)g(soft)m(w)m(are)h(license,)k(suc)m(h)43 +b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s +(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p +eop end +%%Page: 78 82 +TeXDict begin 78 81 bop 150 -116 a Ft(Concept)31 b(Index)2927 +b(78)150 100 y Fp(Concept)52 b(Index)146 434 y Fr(A)150 +550 y Fb(application-sp)r(eci\014c)27 b(completion)f(functions)e +Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)37 b Fb(53)146 796 y +Fr(C)150 913 y Fb(command)26 b(editing)6 b Fa(:)14 b(:)f(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(1)146 1159 +y Fr(E)150 1275 y Fb(editing)26 b(command)g(lines)c Fa(:)13 +b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fb(1)146 1522 y Fr(I)150 +1638 y Fb(initialization)28 b(\014le,)e(readline)c Fa(:)13 +b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)36 b Fb(4)150 1726 y(in)n(teraction,)27 +b(readline)12 b Fa(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)26 +b Fb(1)146 1972 y Fr(K)150 2088 y Fb(kill)g(ring)12 b +Fa(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)27 b Fb(2)150 2176 y(killing)g(text)11 +b Fa(:)h(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)26 b Fb(2)2021 434 y Fr(N)2025 566 y Fb(notation,)g +(readline)17 b Fa(:)d(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +32 b Fb(1)2021 970 y Fr(R)2025 1102 y Fb(readline,)26 +b(function)18 b Fa(:)c(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)33 +b Fb(26)2021 1507 y Fr(V)2025 1639 y Fb(v)l(ariables,)27 +b(readline)11 b Fa(:)j(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +26 b Fb(4)2021 2043 y Fr(Y)2025 2176 y Fb(y)n(anking)f(text)17 +b Fa(:)12 b(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)32 b Fb(2)p eop end +%%Page: 79 83 +TeXDict begin 79 82 bop 3659 -116 a Ft(79)150 299 y Fp(F)-13 +b(unction)52 b(and)h(V)-13 b(ariable)53 b(Index)p 156 +740 41 6 v 150 860 a Fe(_rl_digit_p)10 b Fa(:)16 b(:)d(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)25 b Fb(44)150 +948 y Fe(_rl_digit_value)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)32 b Fb(44)150 1036 y Fe(_rl_lowercase_p)17 +b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 +b Fb(44)150 1125 y Fe(_rl_to_lower)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(44)150 +1213 y Fe(_rl_to_upper)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(44)150 1300 y Fe(_rl_uppercase_p)17 +b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 +b Fb(44)146 1569 y Fr(A)150 1689 y Fe(abort)27 b(\(C-g\))17 +b Fa(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)31 b Fb(23)150 1777 y Fe(accept-line)d(\(Newline)g(or)e(Return\))14 +b Fa(:)g(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)28 +b Fb(18)150 1866 y(activ)n(e-region-end-color)20 b Fa(:)13 +b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)34 b Fb(5)150 1953 y(activ)n +(e-region-start-color)17 b Fa(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)31 +b Fb(5)146 2220 y Fr(B)150 2339 y Fe(backward-char)e(\(C-b\))14 +b Fa(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fb(17)150 2428 +y Fe(backward-delete-char)i(\(Rubout\))24 b Fa(:)14 b(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(20)150 2516 +y Fe(backward-kill-line)30 b(\(C-x)c(Rubout\))7 b Fa(:)15 +b(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)21 b +Fb(21)150 2604 y Fe(backward-kill-word)30 b(\(M-DEL\))13 +b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)27 b Fb(21)150 2693 y Fe(backward-word)i(\(M-b\))14 +b Fa(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fb(17)150 2781 +y Fe(beginning-of-history)i(\(M-<\))13 b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)27 b Fb(18)150 +2869 y Fe(beginning-of-line)i(\(C-a\))22 b Fa(:)13 b(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 +b Fb(17)150 2958 y(b)r(ell-st)n(yle)9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)24 +b Fb(5)150 3046 y(bind-tt)n(y-sp)r(ecial-c)n(hars)c Fa(:)13 +b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(5)150 3134 +y(blink-matc)n(hing-paren)6 b Fa(:)12 b(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)21 b Fb(5)150 3222 y Fe(bracketed-paste-begin)30 +b(\(\))18 b Fa(:)c(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)33 b Fb(20)146 3491 y Fr(C)150 +3610 y Fe(call-last-kbd-macro)d(\(C-x)c(e\))17 b Fa(:)d(:)f(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fb(23)150 +3699 y Fe(capitalize-word)d(\(M-c\))9 b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +23 b Fb(21)150 3787 y Fe(character-search)29 b(\(C-]\))6 +b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(24)150 3875 y Fe +(character-search-backward)31 b(\(M-C-]\))12 b Fa(:)j(:)e(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)27 b Fb(24)150 3964 y Fe(clear-display)i(\(M-C-l\))9 +b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23 b Fb(17)150 4052 y +Fe(clear-screen)28 b(\(C-l\))16 b Fa(:)f(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)31 b Fb(18)150 4140 y(colored-completion-pre\014x)9 +b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)24 b Fb(5)150 4229 y(colored-stats)17 +b Fa(:)d(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)31 b Fb(6)150 4317 y(commen)n(t-b)r(egin)6 b Fa(:)14 +b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 +b Fb(6)150 4405 y Fe(complete)27 b(\(TAB\))10 b Fa(:)k(:)f(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(22)150 4494 +y(completion-displa)n(y-width)10 b Fa(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)25 +b Fb(6)150 4582 y(completion-ignore-case)c Fa(:)13 b(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)34 b Fb(6)150 4670 y(completion-map-case)15 +b Fa(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)30 b Fb(6)150 +4759 y(completion-pre\014x-displa)n(y-length)14 b Fa(:)e(:)h(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b +Fb(6)150 4847 y(completion-query-items)6 b Fa(:)13 b(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)21 b Fb(6)150 4936 y(con)n(v)n(ert-meta)9 +b Fa(:)k(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)24 b Fb(6)150 5024 y Fe(copy-backward-word)30 +b(\(\))9 b Fa(:)k(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23 b Fb(22)150 +5112 y Fe(copy-forward-word)29 b(\(\))11 b Fa(:)j(:)f(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)26 b Fb(22)150 5199 y Fe(copy-region-as-kill)k(\(\))6 +b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(22)2021 817 y Fr(D)2025 +933 y Fe(delete-char)28 b(\(C-d\))20 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)34 b Fb(20)2025 1020 y Fe(delete-char-or-list)c(\(\))6 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fb(23)2025 1108 y Fe +(delete-horizontal-space)31 b(\(\))13 b Fa(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)28 b Fb(22)2025 +1195 y Fe(digit-argument)h(\()p Fc(M-0)p Fe(,)d Fc(M-1)p +Fe(,)h(...)f Fc(M--)p Fe(\))13 b Fa(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)28 b Fb(22)2025 1282 y(disable-completion)20 b Fa(:)13 +b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(7)2025 +1370 y Fe(do-lowercase-version)c(\(M-A,)d(M-B,)f(M-)p +Fc(x)p Fe(,)h(...\))12 b Fa(:)i(:)27 b Fb(23)2025 1457 +y Fe(downcase-word)h(\(M-l\))14 b Fa(:)g(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 +b Fb(20)2025 1544 y Fe(dump-functions)h(\(\))19 b Fa(:)13 +b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(24)2025 +1631 y Fe(dump-macros)28 b(\(\))10 b Fa(:)j(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)24 b Fb(25)2025 1719 y Fe(dump-variables)29 +b(\(\))19 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 +b Fb(25)2021 1965 y Fr(E)2025 2081 y Fb(ec)n(ho-con)n(trol-c)n +(haracters)13 b Fa(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)29 +b Fb(7)2025 2169 y(editing-mo)r(de)10 b Fa(:)j(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fb(7)2025 +2256 y Fe(emacs-editing-mode)k(\(C-e\))18 b Fa(:)d(:)e(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)33 +b Fb(25)2025 2343 y(emacs-mo)r(de-string)18 b Fa(:)c(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)33 b Fb(7)2025 2431 y(enable-activ)n +(e-region)15 b Fa(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)30 +b Fb(7)2025 2518 y(enable-brac)n(k)n(eted-paste)18 b +Fa(:)12 b(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)33 b Fb(7)2025 +2605 y(enable-k)n(eypad)7 b Fa(:)12 b(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fb(7)2025 2692 y +Fe(end-kbd-macro)28 b(\(C-x)f(\)\))16 b Fa(:)d(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 +b Fb(23)2025 2780 y Fc(end-of-file)e Fe(\(usually)f(C-d\))d +Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)37 b Fb(19)2025 2867 y Fe(end-of-history)29 +b(\(M->\))11 b Fa(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fb(18)2025 +2954 y Fe(end-of-line)i(\(C-e\))20 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)34 b Fb(17)2025 3042 y Fe(exchange-point-and-mark)d(\(C-x) +26 b(C-x\))20 b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 +b Fb(24)2025 3129 y(expand-tilde)19 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fb(8)2021 +3373 y Fr(F)2025 3490 y Fe(fetch-history)28 b(\(\))22 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 +b Fb(19)2025 3577 y Fe(forward-backward-delete-char)c(\(\))17 +b Fa(:)d(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)32 +b Fb(20)2025 3664 y Fe(forward-char)c(\(C-f\))16 b Fa(:)f(:)e(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)31 b Fb(17)2025 3751 y Fe(forward-search-history)f +(\(C-s\))8 b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)23 b Fb(18)2025 3839 y Fe(forward-word)28 +b(\(M-f\))16 b Fa(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31 +b Fb(17)2021 4075 y Fr(H)2025 4191 y Fb(history-preserv)n(e-p)r(oin)n +(t)15 b Fa(:)d(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)30 b Fb(8)2025 +4278 y Fe(history-search-backward)h(\(\))13 b Fa(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)28 b +Fb(18)2025 4366 y Fe(history-search-forward)i(\(\))16 +b Fa(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)30 b Fb(18)2025 4453 y(history-size)22 b Fa(:)13 +b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)37 b Fb(8)2025 4540 y Fe(history-substring-search-backw)q(ard)32 +b(\(\))22 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)36 b Fb(19)2025 +4628 y Fe(history-substring-search-forwa)q(rd)c(\(\))7 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fb(19)2025 +4715 y(horizon)n(tal-scroll-mo)r(de)10 b Fa(:)15 b(:)e(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)25 b Fb(8)2021 4950 y Fr(I)2025 5066 y Fb(input-meta)9 +b Fa(:)j(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)24 b Fb(8)2025 5154 y Fe(insert-comment)29 +b(\(M-#\))11 b Fa(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fb(24)2025 +5241 y Fe(insert-completions)j(\(M-*\))18 b Fa(:)d(:)e(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)33 +b Fb(23)2025 5328 y(isearc)n(h-terminators)9 b Fa(:)14 +b(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 b Fb(8)p +eop end +%%Page: 80 84 +TeXDict begin 80 83 bop 150 -116 a Ft(F)-8 b(unction)31 +b(and)f(V)-8 b(ariable)32 b(Index)2370 b(80)146 294 y +Fr(K)150 423 y Fb(k)n(eymap)14 b Fa(:)e(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)29 +b Fb(8)150 514 y Fe(kill-line)f(\(C-k\))7 b Fa(:)14 b(:)f(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(21)150 605 y +Fe(kill-region)28 b(\(\))10 b Fa(:)j(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)24 b Fb(22)150 697 y Fe(kill-whole-line)29 +b(\(\))16 b Fa(:)e(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)31 +b Fb(21)150 784 y Fe(kill-word)d(\(M-d\))7 b Fa(:)14 +b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 +b Fb(21)146 1106 y Fr(M)150 1235 y Fb(mark-mo)r(di\014ed-lines)c +Fa(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fb(9)150 +1326 y(mark-symlink)n(ed-directories)14 b Fa(:)f(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)29 +b Fb(9)150 1417 y(matc)n(h-hidden-\014les)7 b Fa(:)12 +b(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 +b Fb(9)150 1509 y Fe(menu-complete)29 b(\(\))22 b Fa(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(23)150 +1600 y Fe(menu-complete-backward)31 b(\(\))16 b Fa(:)d(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)30 +b Fb(23)150 1692 y(men)n(u-complete-displa)n(y-pre\014x)10 +b Fa(:)h(:)j(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)25 b Fb(9)150 1779 y(meta-\015ag)d Fa(:)13 +b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)36 b Fb(8)146 2109 y Fr(N)150 2238 y Fe(next-history)28 +b(\(C-n\))16 b Fa(:)f(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)31 +b Fb(18)150 2329 y Fe(next-screen-line)e(\(\))14 b Fa(:)g(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)28 b Fb(17)150 2401 y Fe(non-incremental-forward-)227 +2488 y(search-history)h(\(M-n\))7 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 +b Fb(18)150 2576 y Fe(non-incremental-reverse-)227 2663 +y(search-history)29 b(\(M-p\))7 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 +b Fb(18)146 3004 y Fr(O)150 3133 y Fe(operate-and-get-next)30 +b(\(C-o\))13 b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)27 b Fb(19)150 3224 y(output-meta)18 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)34 b Fb(9)150 3311 y Fe(overwrite-mode)29 b(\(\))19 +b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(21)146 +3633 y Fr(P)150 3762 y Fb(page-completions)6 b Fa(:)15 +b(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)20 +b Fb(10)150 3853 y Fe(possible-completions)30 b(\(M-?\))13 +b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)27 b Fb(22)150 3945 y Fe(prefix-meta)h(\(ESC\))20 +b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(24)150 +4036 y Fe(previous-history)c(\(C-p\))6 b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)21 +b Fb(18)150 4128 y Fe(previous-screen-line)30 b(\(\))21 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)35 b Fb(17)150 4215 y Fe(print-last-kbd-macro)30 +b(\(\))21 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fb(23)146 4547 y +Fr(Q)150 4672 y Fe(quoted-insert)29 b(\(C-q)d(or)g(C-v\))10 +b Fa(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)24 b Fb(20)2021 294 y Fr(R)2025 410 y Fe(re-read-init-file)29 +b(\(C-x)e(C-r\))17 b Fa(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)32 b Fb(23)2025 498 y Fe(readline)18 +b Fa(:)d(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)33 b Fb(26)2025 585 y Fe(redraw-current-line)d(\(\))6 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fb(18)2025 672 y Fe +(reverse-search-history)30 b(\(C-r\))8 b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fb(18)2025 +760 y(rev)n(ert-all-at-newline)8 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)23 b Fb(10)2025 847 y Fe(revert-line)28 b(\(M-r\))20 +b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(24)2025 +935 y Fe(rl_activate_mark)15 b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)29 b Fb(45)2025 1022 y Fe(rl_add_defun)8 b Fa(:)15 +b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)22 +b Fb(35)2025 1109 y Fe(rl_add_funmap_entry)7 b Fa(:)17 +b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(39)2025 1197 y +Fe(rl_add_undo)10 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)25 b Fb(39)2025 1284 y Fe(rl_alphabetic)g +Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 +b Fb(44)2025 1371 y Fe(rl_begin_undo_group)7 b Fa(:)17 +b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(39)2025 1459 y +Fe(rl_bind_key)10 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)25 b Fb(36)2025 1546 y Fe +(rl_bind_key_if_unbound)16 b Fa(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)31 +b Fb(36)2025 1633 y Fe(rl_bind_key_if_unbound_in_map)16 +b Fa(:)j(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 +b Fb(36)2025 1721 y Fe(rl_bind_key_in_map)10 b Fa(:)17 +b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(36)2025 1808 +y Fe(rl_bind_keyseq)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)34 b Fb(37)2025 1896 y Fe(rl_bind_keyseq_if_unbound)9 +b Fa(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)23 b Fb(37)2025 1983 y Fe(rl_bind_keyseq_if_unbound_in_m)q +(ap)8 b Fa(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)23 +b Fb(37)2025 2070 y Fe(rl_bind_keyseq_in_map)h Fa(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)34 b Fb(37)2025 2158 y Fe +(rl_callback_handler_install)27 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(46)2025 2245 y +Fe(rl_callback_handler_remove)6 b Fa(:)19 b(:)13 b(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fb(46)2025 +2332 y Fe(rl_callback_read_char)j Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 +b Fb(46)2025 2420 y Fe(rl_callback_sigcleanup)16 b Fa(:)i(:)13 +b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)31 b Fb(46)2025 2507 y Fe(rl_check_signals)15 +b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b +Fb(52)2025 2595 y Fe(rl_cleanup_after_signal)14 b Fa(:)k(:)13 +b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)28 b Fb(52)2025 2682 y Fe(rl_clear_history)15 +b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b +Fb(45)2025 2769 y Fe(rl_clear_message)15 b Fa(:)h(:)d(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)29 b Fb(40)2025 2857 y Fe(rl_clear_pending_input)16 +b Fa(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)31 b Fb(42)2025 2944 y Fe(rl_clear_signals)15 +b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b +Fb(53)2025 3031 y Fe(rl_clear_visible_line)24 b Fa(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)34 b Fb(40)2025 3119 y Fe(rl_complete)10 +b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)25 b Fb(54)2025 3206 y Fe(rl_complete_internal)h +Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(54)2025 3293 y +Fe(rl_completion_matches)24 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 +b Fb(55)2025 3381 y Fe(rl_completion_mode)10 b Fa(:)17 +b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(55)2025 3468 +y Fe(rl_copy_keymap)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)34 b Fb(35)2025 3556 y Fe(rl_copy_text)8 b Fa(:)15 +b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)22 +b Fb(41)2025 3643 y Fe(rl_crlf)g Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 +b Fb(40)2025 3730 y Fe(rl_deactivate_mark)10 b Fa(:)17 +b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(45)2025 3818 +y Fe(rl_delete_text)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)34 b Fb(41)2025 3905 y Fe(rl_deprep_terminal)10 +b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(43)2025 +3992 y Fe(rl_ding)e Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(44)2025 +4080 y Fe(rl_discard_keymap)12 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)27 b Fb(35)2025 4167 y Fe(rl_display_match_list)d +Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(44)2025 4255 y Fe(rl_do_undo)13 +b Fa(:)i(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)27 b Fb(39)2025 4342 y Fe(rl_echo_signal_char)7 +b Fa(:)17 b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(52)2025 +4429 y Fe(rl_empty_keymap)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)32 b Fb(35)2025 4517 y Fe(rl_end_undo_group)12 +b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)27 b Fb(39)2025 +4604 y Fe(rl_execute_next)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)32 b Fb(42)2025 4691 y Fe(rl_expand_prompt)15 +b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b +Fb(41)2025 4779 y Fe(rl_extend_line_buffer)24 b Fa(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)34 b Fb(44)2025 4866 y Fe +(rl_filename_completion_functio)q(n)11 b Fa(:)19 b(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fb(55)2025 +4954 y Fe(rl_forced_update_display)11 b Fa(:)19 b(:)13 +b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)26 b Fb(40)2025 5041 y Fe(rl_free)c Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 +b Fb(43)2025 5128 y Fe(rl_free_keymap)23 b Fa(:)13 b(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fb(35)p eop end +%%Page: 81 85 +TeXDict begin 81 84 bop 150 -116 a Ft(F)-8 b(unction)31 +b(and)f(V)-8 b(ariable)32 b(Index)2370 b(81)150 260 y +Fe(rl_free_line_state)10 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 +b Fb(52)150 348 y Fe(rl_free_undo_list)12 b Fa(:)17 b(:)c(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)h(:)26 b Fb(39)150 437 y Fe(rl_function_dumper)10 +b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(38)150 +525 y Fe(rl_function_of_keyseq)g Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 +b Fb(38)150 614 y Fe(rl_function_of_keyseq_len)9 b Fa(:)19 +b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)23 b Fb(38)150 702 y Fe(rl_funmap_names)17 b Fa(:)g(:)c(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 b Fb(39)150 791 y Fe(rl_generic_bind)17 +b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 +b Fb(37)150 879 y Fe(rl_get_keymap)25 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(35)150 968 y +Fe(rl_get_keymap_by_name)24 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 +b Fb(36)150 1057 y Fe(rl_get_keymap_name)10 b Fa(:)17 +b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(36)150 1145 +y Fe(rl_get_screen_size)10 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +24 b Fb(53)150 1234 y Fe(rl_get_termcap)f Fa(:)13 b(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fb(45)150 1322 y Fe(rl_getc)22 +b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)35 b Fb(42)150 1411 y Fe(rl_initialize)25 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 +b Fb(44)150 1499 y Fe(rl_insert_completions)24 b Fa(:)13 +b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)33 b Fb(55)150 1588 y Fe(rl_insert_text)23 +b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 +b Fb(41)150 1676 y Fe(rl_invoking_keyseqs)7 b Fa(:)17 +b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(38)150 1765 y +Fe(rl_invoking_keyseqs_in_map)7 b Fa(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(38)150 +1853 y Fe(rl_keep_mark_active)7 b Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +21 b Fb(46)150 1942 y Fe(rl_kill_text)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(41)150 +2030 y Fe(rl_list_funmap_names)k Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 +b Fb(38)150 2119 y Fe(rl_macro_bind)25 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(45)150 2207 y +Fe(rl_macro_dumper)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)32 b Fb(45)150 2296 y Fe(rl_make_bare_keymap)7 b +Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(35)150 +2384 y Fe(rl_make_keymap)i Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)34 b Fb(35)150 2473 y Fe(rl_mark_active_p)15 +b Fa(:)h(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)29 b +Fb(46)150 2561 y Fe(rl_message)13 b Fa(:)i(:)e(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fb(40)150 +2650 y Fe(rl_modifying)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(40)150 2738 y Fe(rl_named_function) +12 b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 +b Fb(38)150 2827 y Fe(rl_on_new_line)d Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fb(40)150 2915 y Fe +(rl_on_new_line_with_prompt)7 b Fa(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(40)150 +3004 y Fe(rl_parse_and_bind)12 b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)26 b Fb(37)150 3092 y Fe(rl_pending_signal)12 +b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 b Fb(52)150 +3181 y Fe(rl_possible_completions)14 b Fa(:)k(:)13 b(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 +b Fb(55)150 3269 y Fe(rl_prep_terminal)15 b Fa(:)h(:)e(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)29 b Fb(43)150 3358 y Fe(rl_push_macro_input)7 +b Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(41)150 +3446 y Fe(rl_read_init_file)12 b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)26 b Fb(38)150 3535 y Fe(rl_read_key)10 b Fa(:)16 +b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)25 +b Fb(42)150 3623 y Fe(rl_redisplay)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(40)150 +3712 y Fe(rl_replace_line)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)32 b Fb(43)150 3801 y Fe(rl_reset_after_signal)24 +b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(52)150 3889 y Fe +(rl_reset_line_state)7 b Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 +b Fb(40)150 3978 y Fe(rl_reset_screen_size)26 b Fa(:)13 +b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)36 b Fb(53)150 4066 y Fe(rl_reset_terminal)12 +b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 b Fb(43)150 +4155 y Fe(rl_resize_terminal)10 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)24 b Fb(53)150 4243 y Fe(rl_restore_prompt)12 b Fa(:)17 +b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 b Fb(41)150 +4332 y Fe(rl_restore_state)15 b Fa(:)h(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)29 b Fb(43)150 4420 y Fe(rl_save_prompt)23 b +Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 +b Fb(41)150 4509 y Fe(rl_save_state)25 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(43)150 4597 y +Fe(rl_set_key)13 b Fa(:)i(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)27 b Fb(37)150 4686 y Fe +(rl_set_keyboard_input_timeout)17 b Fa(:)h(:)c(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)30 b Fb(42)150 4774 y Fe(rl_set_keymap)25 +b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 +b Fb(35)150 4863 y Fe(rl_set_keymap_name)10 b Fa(:)17 +b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(36)150 4951 +y Fe(rl_set_paren_blink_timeout)7 b Fa(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(45)150 +5040 y Fe(rl_set_prompt)k Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)37 b Fb(41)150 5128 y Fe(rl_set_screen_size)10 +b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(53)2025 +260 y Fe(rl_set_signals)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)34 b Fb(53)2025 349 y Fe(rl_set_timeout)23 +b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 +b Fb(42)2025 438 y Fe(rl_show_char)8 b Fa(:)15 b(:)f(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)22 b Fb(40)2025 +527 y Fe(rl_stuff_char)j Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)37 b Fb(42)2025 615 y Fe(rl_timeout_remaining)26 +b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(42)2025 704 y +Fe(rl_trim_arg_from_keyseq)14 b Fa(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)28 +b Fb(38)2025 793 y Fe(rl_tty_set_default_bindings)f Fa(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 +b Fb(43)2025 882 y Fe(rl_tty_set_echoing)10 b Fa(:)17 +b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(43)2025 971 +y Fe(rl_tty_unset_default_bindings)16 b Fa(:)j(:)13 b(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fb(43)2025 1060 y +Fe(rl_unbind_command_in_map)11 b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 +b Fb(37)2025 1149 y Fe(rl_unbind_function_in_map)9 b +Fa(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)g(:)h(:)23 b Fb(37)2025 1238 y Fe(rl_unbind_key)i +Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 +b Fb(37)2025 1326 y Fe(rl_unbind_key_in_map)26 b Fa(:)13 +b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(37)2025 1415 y Fe +(rl_username_completion_functio)q(n)11 b Fa(:)19 b(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fb(55)2025 +1504 y Fe(rl_variable_bind)15 b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)29 b Fb(45)2025 1593 y Fe(rl_variable_dumper)10 +b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(45)2025 +1680 y Fe(rl_variable_value)12 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)27 b Fb(45)2021 1951 y Fr(S)2025 2072 y Fe(self-insert)h(\(a,)e +(b,)g(A,)g(1,)g(!,)g(...)q(\))15 b Fa(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)29 b Fb(20)2025 2161 y Fe(set-mark)e(\(C-@\))10 +b Fa(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 +b Fb(24)2025 2250 y Fe(shell-transpose-words)30 b(\(M-C-t\))24 +b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37 +b Fb(21)2025 2339 y(sho)n(w-all-if-am)n(biguous)18 b +Fa(:)d(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)32 b Fb(10)2025 2428 +y(sho)n(w-all-if-unmo)r(di\014ed)9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)24 b Fb(10)2025 2517 y(sho)n(w-mo)r(de-in-prompt)12 +b Fa(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)27 b Fb(10)2025 2606 +y(skip-completed-text)15 b Fa(:)c(:)i(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +29 b Fb(10)2025 2695 y Fe(skip-csi-sequence)g(\(\))11 +b Fa(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fb(24)2025 2782 +y Fe(start-kbd-macro)j(\(C-x)d(\(\))10 b Fa(:)k(:)f(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25 +b Fb(23)2021 3052 y Fr(T)2025 3173 y Fe(tab-insert)j(\(M-TAB\))16 +b Fa(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31 b Fb(20)2025 +3262 y Fe(tilde-expand)d(\(M-~\))16 b Fa(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)31 b Fb(24)2025 3351 y Fe(transpose-chars)e(\(C-t\))9 +b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)23 b Fb(20)2025 3438 y +Fe(transpose-words)29 b(\(M-t\))9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)23 +b Fb(20)2021 3718 y Fr(U)2025 3839 y Fe(undo)j(\(C-_)h(or)f(C-x)g +(C-u\))12 b Fa(:)i(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)27 b Fb(24)2025 +3928 y Fe(universal-argument)i(\(\))9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +23 b Fb(22)2025 4017 y Fe(unix-filename-rubout)30 b(\(\))21 +b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)35 b Fb(21)2025 4106 y Fe(unix-line-discard)29 +b(\(C-u\))22 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(21)2025 4195 +y Fe(unix-word-rubout)29 b(\(C-w\))6 b Fa(:)14 b(:)g(:)f(:)g(:)g(:)g(:) +g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 +b Fb(21)2025 4282 y Fe(upcase-word)28 b(\(M-u\))20 b +Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(20)2021 +4562 y Fr(V)2025 4683 y Fb(vi-cmd-mo)r(de-string)18 b +Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(11)2025 +4772 y Fe(vi-editing-mode)c(\(M-C-j\))22 b Fa(:)13 b(:)g(:)g(:)h(:)f(:) +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 +b Fb(25)2025 4861 y(vi-ins-mo)r(de-string)8 b Fa(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fb(11)2025 +4948 y(visible-stats)11 b Fa(:)j(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)26 b Fb(11)p eop end +%%Page: 82 86 +TeXDict begin 82 85 bop 150 -116 a Ft(F)-8 b(unction)31 +b(and)f(V)-8 b(ariable)32 b(Index)2370 b(82)146 294 y +Fr(Y)150 410 y Fe(yank)27 b(\(C-y\))20 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b +Fb(22)150 497 y Fe(yank-last-arg)29 b(\(M-.)d(or)g(M-_\))10 +b Fa(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)24 b Fb(19)150 584 y Fe(yank-nth-arg)k(\(M-C-y\))11 +b Fa(:)k(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)26 b Fb(19)150 671 y +Fe(yank-pop)h(\(M-y\))10 b Fa(:)k(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) +f(:)g(:)g(:)g(:)24 b Fb(22)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/doc/readline_3.ps b/doc/readline_3.ps new file mode 100644 index 0000000..91d94ef --- /dev/null +++ b/doc/readline_3.ps @@ -0,0 +1,1782 @@ +%!PS-Adobe-3.0 +%%Creator: groff version 1.22.4 +%%CreationDate: Tue Sep 20 10:17:06 2022 +%%DocumentNeededResources: font Times-Roman +%%+ font Times-Bold +%%+ font Times-Italic +%%+ font Courier +%%DocumentSuppliedResources: procset grops 1.22 4 +%%Pages: 17 +%%PageOrder: Ascend +%%DocumentMedia: Default 612 792 0 () () +%%Orientation: Portrait +%%EndComments +%%BeginDefaults +%%PageMedia: Default +%%EndDefaults +%%BeginProlog +%%BeginResource: procset grops 1.22 4 +%!PS-Adobe-3.0 Resource-ProcSet +/setpacking where{ +pop +currentpacking +true setpacking +}if +/grops 120 dict dup begin +/SC 32 def +/A/show load def +/B{0 SC 3 -1 roll widthshow}bind def +/C{0 exch ashow}bind def +/D{0 exch 0 SC 5 2 roll awidthshow}bind def +/E{0 rmoveto show}bind def +/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def +/G{0 rmoveto 0 exch ashow}bind def +/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/I{0 exch rmoveto show}bind def +/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def +/K{0 exch rmoveto 0 exch ashow}bind def +/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/M{rmoveto show}bind def +/N{rmoveto 0 SC 3 -1 roll widthshow}bind def +/O{rmoveto 0 exch ashow}bind def +/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/Q{moveto show}bind def +/R{moveto 0 SC 3 -1 roll widthshow}bind def +/S{moveto 0 exch ashow}bind def +/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/SF{ +findfont exch +[exch dup 0 exch 0 exch neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/MF{ +findfont +[5 2 roll +0 3 1 roll +neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/level0 0 def +/RES 0 def +/PL 0 def +/LS 0 def +/MANUAL{ +statusdict begin/manualfeed true store end +}bind def +/PLG{ +gsave newpath clippath pathbbox grestore +exch pop add exch pop +}bind def +/BP{ +/level0 save def +1 setlinecap +1 setlinejoin +DEFS/BPhook known{DEFS begin BPhook end}if +72 RES div dup scale +LS{ +90 rotate +}{ +0 PL translate +}ifelse +1 -1 scale +}bind def +/EP{ +level0 restore +showpage +}def +/DA{ +newpath arcn stroke +}bind def +/SN{ +transform +.25 sub exch .25 sub exch +round .25 add exch round .25 add exch +itransform +}bind def +/DL{ +SN +moveto +SN +lineto stroke +}bind def +/DC{ +newpath 0 360 arc closepath +}bind def +/TM matrix def +/DE{ +TM currentmatrix pop +translate scale newpath 0 0 .5 0 360 arc closepath +TM setmatrix +}bind def +/RC/rcurveto load def +/RL/rlineto load def +/ST/stroke load def +/MT/moveto load def +/CL/closepath load def +/Fr{ +setrgbcolor fill +}bind def +/setcmykcolor where{ +pop +/Fk{ +setcmykcolor fill +}bind def +}if +/Fg{ +setgray fill +}bind def +/FL/fill load def +/LW/setlinewidth load def +/Cr/setrgbcolor load def +/setcmykcolor where{ +pop +/Ck/setcmykcolor load def +}if +/Cg/setgray load def +/RE{ +findfont +dup maxlength 1 index/FontName known not{1 add}if dict begin +{ +1 index/FID ne +2 index/UniqueID ne +and +{def}{pop pop}ifelse +}forall +/Encoding exch def +dup/FontName exch def +currentdict end definefont pop +}bind def +/DEFS 0 def +/EBEGIN{ +moveto +DEFS begin +}bind def +/EEND/end load def +/CNT 0 def +/level1 0 def +/PBEGIN{ +/level1 save def +translate +div 3 1 roll div exch scale +neg exch neg exch translate +0 setgray +0 setlinecap +1 setlinewidth +0 setlinejoin +10 setmiterlimit +[]0 setdash +/setstrokeadjust where{ +pop +false setstrokeadjust +}if +/setoverprint where{ +pop +false setoverprint +}if +newpath +/CNT countdictstack def +userdict begin +/showpage{}def +/setpagedevice{}def +mark +}bind def +/PEND{ +cleartomark +countdictstack CNT sub{end}repeat +level1 restore +}bind def +end def +/setpacking where{ +pop +setpacking +}if +%%EndResource +%%EndProlog +%%BeginSetup +%%BeginFeature: *PageSize Default +<< /PageSize [ 612 792 ] /ImagingBBox null >> setpagedevice +%%EndFeature +%%IncludeResource: font Times-Roman +%%IncludeResource: font Times-Bold +%%IncludeResource: font Times-Italic +%%IncludeResource: font Courier +grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 +def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron +/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent +/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen +/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O +/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex +/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y +/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft +/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl +/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut +/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash +/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen +/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft +/logicalnot/minus/registered/macron/degree/plusminus/twosuperior +/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior +/ordmasculine/guilsinglright/onequarter/onehalf/threequarters +/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE +/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn +/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla +/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis +/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash +/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +/Courier@0 ENC0/Courier RE/Times-Italic@0 ENC0/Times-Italic RE +/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10.95/Times-Bold@0 SF +-.219(NA)72 84 S(ME).219 E F0 +(readline \255 get a line from a user with editing)108 96 Q F1(SYNOPSIS) +72 112.8 Q/F2 10/Times-Bold@0 SF(#include )108 124.8 Q +(#include )-.18 E(#include )-.7 E/F3 10/Times-Italic@0 SF +-.15(ch)108 165.6 S(ar *).15 E F2 -.18(re)108 177.6 S(adline).18 E F0 +(\()2.5 E F3(const c)A(har *pr)-.15 E(ompt)-.45 E F0(\);)A F1(COPYRIGHT) +72 194.4 Q F0(Readline is Cop)108 206.4 Q +(yright \251 1989\2552020 Free Softw)-.1 E(are F)-.1 E(oundation, Inc.) +-.15 E F1(DESCRIPTION)72 223.2 Q F2 -.18(re)108 235.2 S(adline).18 E F0 +.088(will read a line from the terminal and return it, using)2.588 F F2 +(pr)2.587 E(ompt)-.18 E F0 .087(as a prompt.)2.587 F(If)5.087 E F2(pr) +2.587 E(ompt)-.18 E F0(is)2.587 E F2(NULL)2.587 E F0(or)2.587 E .399 +(the empty string, no prompt is issued.)108 247.2 R .399 +(The line returned is allocated with)5.399 F F3(malloc)3.28 E F0 .4 +(\(3\); the caller must free it).31 F(when \214nished.)108 259.2 Q +(The line returned has the \214nal ne)5 E(wline remo)-.25 E -.15(ve)-.15 +G(d, so only the te).15 E(xt of the line remains.)-.15 E F2 -.18(re)108 +276 S(adline).18 E F0(of)3.79 E 1.29 +(fers editing capabilities while the user is entering the line.)-.25 F +1.289(By def)6.289 F 1.289(ault, the line editing com-)-.1 F +(mands are similar to those of emacs.)108 288 Q 2.5(Av)5 G +(i\255style line editing interf)-2.5 E(ace is also a)-.1 E -.25(va)-.2 G +(ilable.).25 E .272 +(This manual page describes only the most basic use of)108 304.8 R F2 +-.18(re)2.772 G(adline).18 E F0 5.272(.M)C .272 +(uch more functionality is a)-5.272 F -.25(va)-.2 G .272(ilable; see).25 +F F3(The GNU Readline Libr)108 316.8 Q(ary)-.15 E F0(and)2.5 E F3 +(The GNU History Libr)2.5 E(ary)-.15 E F0(for additional information.) +2.5 E F1(RETURN V)72 333.6 Q(ALUE)-1.478 E F2 -.18(re)108 345.6 S +(adline).18 E F0 1.09(returns the te)3.59 F 1.09(xt of the line read.) +-.15 F 3.589(Ab)6.09 G 1.089(lank line returns the empty string.)-3.589 +F(If)6.089 E F2(EOF)3.589 E F0 1.089(is encountered)3.589 F .283 +(while reading a line, and the line is empty)108 357.6 R(,)-.65 E F2 +(NULL)2.783 E F0 .283(is returned.)2.783 F .283(If an)5.283 F F2(EOF) +2.783 E F0 .283(is read with a non\255empty line, it)2.783 F +(is treated as a ne)108 369.6 Q(wline.)-.25 E F1(NO)72 386.4 Q -.986(TA) +-.438 G(TION)-.054 E F0 .077 +(An Emacs-style notation is used to denote k)108 398.4 R -.15(ey)-.1 G +(strok).15 E 2.576(es. Control)-.1 F -.1(ke)2.576 G .076 +(ys are denoted by C\255)-.05 F F3 -.1(ke)C(y)-.2 E F0 2.576(,e)C .076 +(.g., C\255n means)-2.576 F 2.582(Control\255N. Similarly)108 410.4 R(,) +-.65 E F3(meta)2.962 E F0 -.1(ke)2.842 G .082(ys are denoted by M\255) +-.05 F F3 -.1(ke)C(y)-.2 E F0 2.583(,s)C 2.583(oM)-2.583 G .083 +(\255x means Meta\255X.)-2.583 F .083(\(On k)5.083 F -.15(ey)-.1 G .083 +(boards without a).15 F F3(meta)108.38 422.4 Q F0 -.1(ke)3.472 G 2.012 +-.65(y, M)-.05 H.65 E F3(x)A F0 .712(means ESC)3.212 F F3(x)3.212 E +F0 3.212(,i)C .712(.e., press the Escape k)-3.212 F 1.011 -.15(ey t)-.1 +H .711(hen the).15 F F3(x)3.981 E F0 -.1(ke)3.741 G 4.511 -.65(y. T)-.05 +H .711(his mak).65 F .711(es ESC the)-.1 F F3 .711(meta pr)3.211 F +(e\214x)-.37 E F0(.)A .48(The combination M\255C\255)108 434.4 R F3(x)A +F0 .48(means ESC\255Control\255)2.98 F F3(x)A F0 2.98(,o)C 2.98(rp)-2.98 +G .48(ress the Escape k)-2.98 F .78 -.15(ey t)-.1 H .48 +(hen hold the Control k).15 F .78 -.15(ey w)-.1 H(hile).15 E +(pressing the)108 446.4 Q F3(x)3.27 E F0 -.1(ke)3.03 G -.65(y.)-.05 G +(\)).65 E .596(Readline commands may be gi)108 463.2 R -.15(ve)-.25 G +3.096(nn).15 G(umeric)-3.096 E F3(ar)3.426 E(guments)-.37 E F0 3.096(,w) +.27 G .596(hich normally act as a repeat count.)-3.096 F(Sometimes,) +5.595 E(ho)108 475.2 Q(we)-.25 E -.15(ve)-.25 G 1.418 -.4(r, i).15 H +3.118(ti).4 G 3.119(st)-3.118 G .619(he sign of the ar)-3.119 F .619 +(gument that is signi\214cant.)-.18 F -.15(Pa)5.619 G .619(ssing a ne) +.15 F -.05(ga)-.15 G(ti).05 E .919 -.15(ve a)-.25 H -.18(rg).15 G .619 +(ument to a command that).18 F 1.019(acts in the forw)108 487.2 R 1.018 +(ard direction \(e.g.,)-.1 F F2(kill\255line)3.518 E F0 3.518(\)c)C +1.018(auses that command to act in a backw)-3.518 F 1.018 +(ard direction.)-.1 F(Com-)6.018 E(mands whose beha)108 499.2 Q +(vior with ar)-.2 E(guments de)-.18 E(viates from this are noted belo) +-.25 E -.65(w.)-.25 G .811(When a command is described as)108 516 R F3 +(killing)3.311 E F0(te)3.311 E .811(xt, the te)-.15 F .811 +(xt deleted is sa)-.15 F -.15(ve)-.2 G 3.311(df).15 G .812 +(or possible future retrie)-3.311 F -.25(va)-.25 G 3.312(l\().25 G F3 +(yank-)-3.312 E(ing)108 528 Q F0 2.529(\). The)B .029(killed te)2.529 F +.029(xt is sa)-.15 F -.15(ve)-.2 G 2.529(di).15 G 2.529(na)-2.529 G F3 +.029(kill ring)B F0 5.029(.C)C(onsecuti)-5.029 E .329 -.15(ve k)-.25 H +.029(ills cause the te).15 F .029(xt to be accumulated into one unit,) +-.15 F .567(which can be yank)108 540 R .567(ed all at once.)-.1 F .567 +(Commands which do not kill te)5.567 F .567 +(xt separate the chunks of te)-.15 F .567(xt on the kill)-.15 F(ring.) +108 552 Q F1(INITIALIZA)72 568.8 Q(TION FILE)-1.04 E F0 .091(Readline i\ +s customized by putting commands in an initialization \214le \(the)108 +580.8 R F3(inputr)2.591 E(c)-.37 E F0 2.591(\214le\). The)2.591 F .091 +(name of this \214le)2.591 F .156(is tak)108 592.8 R .156(en from the v) +-.1 F .156(alue of the)-.25 F F2(INPUTRC)2.656 E F0(en)2.656 E .156 +(vironment v)-.4 F 2.656(ariable. If)-.25 F .156(that v)2.656 F .156 +(ariable is unset, the def)-.25 F .157(ault is)-.1 F F3(~/.in-)2.157 E +(putr)108 604.8 Q(c)-.37 E F0 5.905(.I).31 G 3.405(ft)-5.905 G .905 +(hat \214le)-3.405 F .905(does not e)5.905 F .904 +(xist or cannot be read, the ultimate def)-.15 F .904(ault is)-.1 F F3 +(/etc/inputr)4.554 E(c)-.37 E F0 5.904(.W).31 G .904(hen a program) +-5.904 F 1.158(which uses the readline library starts up, the init \214\ +le is read, and the k)108 616.8 R 1.459 -.15(ey b)-.1 H 1.159 +(indings and v).15 F 1.159(ariables are set.)-.25 F .029 +(There are only a fe)108 628.8 R 2.529(wb)-.25 G .029 +(asic constructs allo)-2.529 F .028(wed in the readline init \214le.) +-.25 F .028(Blank lines are ignored.)5.028 F .028(Lines be)5.028 F(gin-) +-.15 E .553(ning with a)108 640.8 R F2(#)3.053 E F0 .554(are comments.) +3.053 F .554(Lines be)5.554 F .554(ginning with a)-.15 F F2($)3.054 E F0 +.554(indicate conditional constructs.)3.054 F .554(Other lines denote) +5.554 F -.1(ke)108 652.8 S 2.987(yb)-.05 G .487(indings and v)-2.987 F +.487(ariable settings.)-.25 F .487 +(Each program using this library may add its o)5.487 F .486 +(wn commands and bind-)-.25 F(ings.)108 664.8 Q -.15(Fo)108 681.6 S 2.5 +(re).15 G(xample, placing)-2.65 E(M\255Control\255u: uni)144 698.4 Q +-.15(ve)-.25 G(rsal\255ar).15 E(gument)-.18 E(or)108 710.4 Q +(C\255Meta\255u: uni)144 722.4 Q -.15(ve)-.25 G(rsal\255ar).15 E(gument) +-.18 E(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(1)190.115 E +0 Cg EP +%%Page: 2 2 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E(into the)108 84 Q/F1 10 +/Times-Italic@0 SF(inputr)2.51 E(c)-.37 E F0 -.1(wo)2.81 G(uld mak).1 E +2.5(eM)-.1 G(\255C\255u e)-2.5 E -.15(xe)-.15 G +(cute the readline command).15 E F1(univer)2.58 E(sal\255ar)-.1 E +(gument)-.37 E F0(.).68 E 1.153(The follo)108 100.8 R 1.154 +(wing symbolic character names are recognized while processing k)-.25 F +1.454 -.15(ey b)-.1 H(indings:).15 E F1(DEL)4.234 E F0(,).53 E F1(ESC) +4.164 E F0(,).72 E F1(ES-)4.164 E(CAPE)108 112.8 Q F0(,).73 E F1(LFD) +3.08 E F0(,).28 E F1(NEWLINE)3.2 E F0(,).73 E F1(RET)3.13 E F0(,)1.27 E +F1(RETURN)3.13 E F0(,)1.1 E F1 -.4(RU)2.5 G(BOUT).4 E F0(,)1.27 E F1(SP) +2.83 E -.3(AC)-.9 G(E).3 E F0(,).73 E F1(SPC)2.83 E F0 2.5(,a).72 G(nd) +-2.5 E F1 -.5(TA)2.5 G(B).5 E F0(.).27 E .209 +(In addition to command names, readline allo)108 129.6 R .209(ws k)-.25 +F -.15(ey)-.1 G 2.709(st).15 G 2.709(ob)-2.709 G 2.709(eb)-2.709 G .209 +(ound to a string that is inserted when the k)-2.709 F .509 -.15(ey i) +-.1 H(s).15 E(pressed \(a)108 141.6 Q F1(macr)2.5 E(o)-.45 E F0(\).)A/F2 +10/Times-Bold@0 SF -.25(Ke)87 158.4 S 2.5(yB).25 G(indings)-2.5 E F0 +.366(The syntax for controlling k)108 170.4 R .666 -.15(ey b)-.1 H .366 +(indings in the).15 F F1(inputr)2.876 E(c)-.37 E F0 .366 +(\214le is simple.)3.176 F .366(All that is required is the name of the) +5.366 F .264(command or the te)108 182.4 R .264(xt of a macro and a k) +-.15 F .564 -.15(ey s)-.1 H .264(equence to which it should be bound.) +.15 F .263(The name may be speci-)5.264 F .138(\214ed in one of tw)108 +194.4 R 2.638(ow)-.1 G .138(ays: as a symbolic k)-2.738 F .438 -.15 +(ey n)-.1 H .138(ame, possibly with).15 F F1(Meta\255)2.638 E F0(or) +2.638 E F1(Contr)2.638 E(ol\255)-.45 E F0(pre\214x)2.638 E .138 +(es, or as a k)-.15 F .439 -.15(ey s)-.1 H(e-).15 E 3.409(quence. The) +108 206.4 R .909(name and k)3.409 F 1.209 -.15(ey s)-.1 H .909 +(equence are separated by a colon.).15 F .909 +(There can be no whitespace between the)5.909 F(name and the colon.)108 +218.4 Q .361(When using the form)108 235.2 R F2 -.1(ke)2.861 G(yname).1 +E F0(:)A F1(function-name).833 E F0(or)2.861 E F1(macr)2.861 E(o)-.45 E +F0(,)A F1 -.1(ke)2.861 G(yname)-.2 E F0 .362(is the name of a k)3.042 F +.662 -.15(ey s)-.1 H .362(pelled out in Eng-).15 F 2.5(lish. F)108 247.2 +R(or e)-.15 E(xample:)-.15 E(Control\255u: uni)144 271.2 Q -.15(ve)-.25 +G(rsal\255ar).15 E(gument)-.18 E(Meta\255Rubout: backw)144 283.2 Q +(ard\255kill\255w)-.1 E(ord)-.1 E(Control\255o: "> output")144 295.2 Q +.148(In the abo)108 312 R .448 -.15(ve ex)-.15 H(ample,).15 E F1(C\255u) +2.488 E F0 .148(is bound to the function)2.898 F F2(uni)2.647 E -.1(ve) +-.1 G(rsal\255ar).1 E(gument)-.1 E F0(,)A F1(M-DEL)3.327 E F0 .147 +(is bound to the function)3.177 F F2(backward\255kill\255w)108 324 Q +(ord)-.1 E F0 3.005(,a)C(nd)-3.005 E F1(C\255o)2.845 E F0 .505 +(is bound to run the macro e)3.185 F .506 +(xpressed on the right hand side \(that is, to in-)-.15 F(sert the te) +108 336 Q(xt)-.15 E/F3 10/Courier@0 SF 6(>o)2.5 G(utput)-6 E F0 +(into the line\).)2.5 E .056(In the second form,)108 352.8 R F2("k)2.556 +E(eyseq")-.1 E F0(:)A F1(function\255name).833 E F0(or)2.556 E F1(macr) +2.556 E(o)-.45 E F0(,)A F2 -.1(ke)2.556 G(yseq).1 E F0(dif)2.555 E .055 +(fers from)-.25 F F2 -.1(ke)2.555 G(yname).1 E F0(abo)2.555 E .355 -.15 +(ve i)-.15 H 2.555(nt).15 G .055(hat strings)-2.555 F 1.284 +(denoting an entire k)108 364.8 R 1.584 -.15(ey s)-.1 H 1.284(equence m\ +ay be speci\214ed by placing the sequence within double quotes.).15 F +(Some)6.284 E .386(GNU Emacs style k)108 376.8 R .686 -.15(ey e)-.1 H +.385(scapes can be used, as in the follo).15 F .385(wing e)-.25 F .385 +(xample, b)-.15 F .385(ut the symbolic character names)-.2 F +(are not recognized.)108 388.8 Q("\\C\255u": uni)144 412.8 Q -.15(ve) +-.25 G(rsal\255ar).15 E(gument)-.18 E +("\\C\255x\\C\255r": re\255read\255init\255\214le)144 424.8 Q +("\\e[11~": "Function K)144 436.8 Q .3 -.15(ey 1)-.25 H(").15 E .198 +(In this e)108 453.6 R(xample,)-.15 E F1(C-u)2.538 E F0 .199(is ag)2.949 +F .199(ain bound to the function)-.05 F F2(uni)2.699 E -.1(ve)-.1 G +(rsal\255ar).1 E(gument)-.1 E F0(.)A F1 .199(C-x C-r)5.039 F F0 .199 +(is bound to the function)3.429 F F2 -.18(re)108 465.6 S.18 E +(ead\255init\255\214le)-.18 E F0 2.5(,a)C(nd)-2.5 E F1(ESC [ 1 1 ~)3.01 +E F0(is bound to insert the te)3.94 E(xt)-.15 E F3(Function Key 1)2.5 E +F0(.)A(The full set of GNU Emacs style escape sequences a)108 482.4 Q +-.25(va)-.2 G(ilable when specifying k).25 E .3 -.15(ey s)-.1 H +(equences is).15 E F2<5c43ad>144 494.4 Q F0(control pre\214x)180 494.4 Q +F2<5c4dad>144 506.4 Q F0(meta pre\214x)180 506.4 Q F2(\\e)144 518.4 Q F0 +(an escape character)180 518.4 Q F2(\\\\)144 530.4 Q F0(backslash)180 +530.4 Q F2(\\")144 542.4 Q F0(literal ", a double quote)180 542.4 Q F2 +(\\')144 554.4 Q F0(literal ', a single quote)180 554.4 Q(In addition t\ +o the GNU Emacs style escape sequences, a second set of backslash escap\ +es is a)108 571.2 Q -.25(va)-.2 G(ilable:).25 E F2(\\a)144 583.2 Q F0 +(alert \(bell\))180 583.2 Q F2(\\b)144 595.2 Q F0(backspace)180 595.2 Q +F2(\\d)144 607.2 Q F0(delete)180 607.2 Q F2(\\f)144 619.2 Q F0 +(form feed)180 619.2 Q F2(\\n)144 631.2 Q F0(ne)180 631.2 Q(wline)-.25 E +F2(\\r)144 643.2 Q F0(carriage return)180 643.2 Q F2(\\t)144 655.2 Q F0 +(horizontal tab)180 655.2 Q F2(\\v)144 667.2 Q F0 -.15(ve)180 667.2 S +(rtical tab).15 E F2(\\)144 679.2 Q F1(nnn)A F0 +(the eight-bit character whose v)180 679.2 Q(alue is the octal v)-.25 E +(alue)-.25 E F1(nnn)2.5 E F0(\(one to three digits\))2.5 E F2(\\x)144 +691.2 Q F1(HH)A F0(the eight-bit character whose v)180 691.2 Q +(alue is the he)-.25 E(xadecimal v)-.15 E(alue)-.25 E F1(HH)2.5 E F0 +(\(one or tw)2.5 E 2.5(oh)-.1 G .3 -.15(ex d)-2.5 H(igits\)).15 E .74 +(When entering the te)108 708 R .74(xt of a macro, single or double quo\ +tes should be used to indicate a macro de\214nition.)-.15 F .089 +(Unquoted te)108 720 R .089(xt is assumed to be a function name.)-.15 F +.09(In the macro body)5.089 F 2.59(,t)-.65 G .09 +(he backslash escapes described abo)-2.59 F -.15(ve)-.15 G +(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(2)190.115 E 0 Cg +EP +%%Page: 3 3 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E(are e)108 84 Q 2.5 +(xpanded. Backslash)-.15 F(will quote an)2.5 E 2.5(yo)-.15 G +(ther character in the macro te)-2.5 E(xt, including " and '.)-.15 E/F1 +10/Times-Bold@0 SF(Bash)108 100.8 Q F0(allo)2.93 E .43 +(ws the current readline k)-.25 F .73 -.15(ey b)-.1 H .429 +(indings to be displayed or modi\214ed with the).15 F F1(bind)2.929 E F0 +-.2(bu)2.929 G .429(iltin command.).2 F 1.095 +(The editing mode may be switched during interacti)108 112.8 R 1.395 +-.15(ve u)-.25 H 1.095(se by using the).15 F F13.595 E F0 1.095 +(option to the)3.595 F F1(set)3.595 E F0 -.2(bu)3.595 G 1.095 +(iltin com-).2 F 3.076(mand. Other)108 124.8 R .576 +(programs using this library pro)3.076 F .575(vide similar mechanisms.) +-.15 F(The)5.575 E/F2 10/Times-Italic@0 SF(inputr)3.085 E(c)-.37 E F0 +.575(\214le may be edited and)3.385 F(re-read if a program does not pro) +108 136.8 Q(vide an)-.15 E 2.5(yo)-.15 G(ther means to incorporate ne) +-2.5 E 2.5(wb)-.25 G(indings.)-2.5 E F1 -.92(Va)87 153.6 S(riables).92 E +F0 .043(Readline has v)108 165.6 R .043 +(ariables that can be used to further customize its beha)-.25 F(vior)-.2 +E 5.043(.A)-.55 G -.25(va)-2.5 G .043(riable may be set in the).25 F F2 +(inpu-)2.554 E(tr)108 177.6 Q(c)-.37 E F0 +(\214le with a statement of the form)2.81 E F1(set)144 194.4 Q F2 +(variable\255name value)2.5 E F0 .79(Except where noted, readline v)108 +211.2 R .79(ariables can tak)-.25 F 3.29(et)-.1 G .79(he v)-3.29 F +(alues)-.25 E F1(On)3.29 E F0(or)3.29 E F1(Off)3.29 E F0 .79 +(\(without re)3.29 F -.05(ga)-.15 G .79(rd to case\).).05 F(Unrecog-) +5.79 E .448(nized v)108 223.2 R .448(ariable names are ignored.)-.25 F +.448(When a v)5.448 F .448(ariable v)-.25 F .448 +(alue is read, empty or null v)-.25 F .449(alues, "on" \(case-insensi-) +-.25 F(ti)108 235.2 Q -.15(ve)-.25 G .468(\), and "1" are equi).15 F +-.25(va)-.25 G .468(lent to).25 F F1(On)2.968 E F0 5.468(.A)C .468 +(ll other v)-5.468 F .468(alues are equi)-.25 F -.25(va)-.25 G .468 +(lent to).25 F F1(Off)2.968 E F0 5.468(.T)C .467(he v)-5.468 F .467 +(ariables and their def)-.25 F(ault)-.1 E -.25(va)108 247.2 S(lues are:) +.25 E F1(acti)108 264 Q -.1(ve)-.1 G.1 E(egion\255start\255color) +-.18 E F0 2.729(As)144 276 S .229(tring v)-2.729 F .229 +(ariable that controls the te)-.25 F .229 +(xt color and background when displaying the te)-.15 F .23 +(xt in the acti)-.15 F -.15(ve)-.25 G(re)144 288 Q 1.527 +(gion \(see the description of)-.15 F F1(enable\255acti)4.026 E -.1(ve) +-.1 G.1 E(egion)-.18 E F0(belo)4.026 E 4.026(w\). This)-.25 F +1.526(string must not tak)4.026 F 4.026(eu)-.1 G 4.026(pa)-4.026 G -.15 +(ny)-4.026 G(ph)144 300 Q .283 +(ysical character positions on the display)-.05 F 2.783(,s)-.65 G 2.784 +(oi)-2.783 G 2.784(ts)-2.784 G .284 +(hould consist only of terminal escape sequences.)-2.784 F .45 +(It is output to the terminal before displaying the te)144 312 R .45 +(xt in the acti)-.15 F .75 -.15(ve r)-.25 H -.15(eg).15 G 2.95 +(ion. This).15 F -.25(va)2.95 G .45(riable is reset to).25 F .378 +(the def)144 324 R .378(ault v)-.1 F .378(alue whene)-.25 F -.15(ve)-.25 +G 2.878(rt).15 G .379(he terminal type changes.)-2.878 F .379(The def) +5.379 F .379(ault v)-.1 F .379(alue is the string that puts the)-.25 F +.655(terminal in standout mode, as obtained from the terminal')144 336 R +3.154(st)-.55 G .654(erminfo description.)-3.154 F 3.154(As)5.654 G .654 +(ample v)-3.154 F(alue)-.25 E(might be)144 348 Q/F3 10/Courier@0 SF +("\\e[01;33m")2.5 E F0(.)A F1(acti)108 360 Q -.1(ve)-.1 G.1 E +(egion\255end\255color)-.18 E F0 3.908(As)144 372 S 1.408(tring v)-3.908 +F 1.408(ariable that "undoes" the ef)-.25 F 1.408(fects of)-.25 F F1 +(acti)3.908 E -.1(ve)-.1 G.1 E(egion\255start\255color)-.18 E F0 +1.409(and restores "normal")3.908 F .216 +(terminal display appearance after displaying te)144 384 R .216 +(xt in the acti)-.15 F .516 -.15(ve r)-.25 H -.15(eg).15 G 2.716 +(ion. This).15 F .216(string must not tak)2.716 F 2.716(eu)-.1 G(p) +-2.716 E(an)144 396 Q 3.737(yp)-.15 G -.05(hy)-3.737 G 1.237 +(sical character positions on the display).05 F 3.737(,s)-.65 G 3.737 +(oi)-3.737 G 3.737(ts)-3.737 G 1.238 +(hould consist only of terminal escape se-)-3.737 F 2.928(quences. It) +144 408 R .428(is output to the terminal after displaying the te)2.928 F +.427(xt in the acti)-.15 F .727 -.15(ve r)-.25 H -.15(eg).15 G 2.927 +(ion. This).15 F -.25(va)2.927 G .427(riable is).25 F .518 +(reset to the def)144 420 R .518(ault v)-.1 F .518(alue whene)-.25 F +-.15(ve)-.25 G 3.018(rt).15 G .518(he terminal type changes.)-3.018 F +.518(The def)5.518 F .518(ault v)-.1 F .518(alue is the string that)-.25 +F .252(restores the terminal from standout mode, as obtained from the t\ +erminal')144 432 R 2.751(st)-.55 G .251(erminfo description.)-2.751 F(A) +5.251 E(sample v)144 444 Q(alue might be)-.25 E F3("\\e[0m)2.5 E F0(".)A +F1(bell\255style \(audible\))108 456 Q F0 .01 +(Controls what happens when readline w)144 468 R .011 +(ants to ring the terminal bell.)-.1 F .011(If set to)5.011 F F1(none) +2.511 E F0 2.511(,r)C .011(eadline ne)-2.511 F -.15(ve)-.25 G(r).15 E +.94(rings the bell.)144 480 R .94(If set to)5.94 F F1(visible)3.44 E F0 +3.44(,r)C .94(eadline uses a visible bell if one is a)-3.44 F -.25(va) +-.2 G 3.44(ilable. If).25 F .94(set to)3.44 F F1(audible)3.44 E F0(,)A +(readline attempts to ring the terminal')144 492 Q 2.5(sb)-.55 G(ell.) +-2.5 E F1(bind\255tty\255special\255chars \(On\))108 504 Q F0 .333 +(If set to)144 516 R F1(On)2.833 E F0 .334(\(the def)2.833 F .334 +(ault\), readline attempts to bind the control characters)-.1 F .334 +(treated specially by the)7.834 F -.1(ke)144 528 S(rnel').1 E 2.5(st) +-.55 G(erminal dri)-2.5 E -.15(ve)-.25 G 2.5(rt).15 G 2.5(ot)-2.5 G +(heir readline equi)-2.5 E -.25(va)-.25 G(lents.).25 E F1 +(blink\255matching\255par)108 540 Q(en \(Off\))-.18 E F0 .21(If set to) +144 552 R F1(On)2.71 E F0 2.71(,r)C .21 +(eadline attempts to brie\215y mo)-2.71 F .51 -.15(ve t)-.15 H .21 +(he cursor to an opening parenthesis when a closing).15 F +(parenthesis is inserted.)144 564 Q F1(color)108 576 Q +(ed\255completion\255pr)-.18 E(e\214x \(Off\))-.18 E F0 .515(If set to) +144 588 R F1(On)3.015 E F0 3.015(,w)C .515(hen listing completions, rea\ +dline displays the common pre\214x of the set of possible)-3.015 F 2.936 +(completions using a dif)144 600 R 2.936(ferent color)-.25 F 7.936(.T) +-.55 G 2.936(he color de\214nitions are tak)-7.936 F 2.935 +(en from the v)-.1 F 2.935(alue of the)-.25 F F1(LS_COLORS)144 612 Q F0 +(en)3.076 E .577(vironment v)-.4 F 3.077(ariable. If)-.25 F .577 +(there is a color de\214nition in)3.077 F F1($LS_COLORS)3.077 E F0 .577 +(for the cus-)3.077 F .135(tom suf)144 624 R .135(\214x "readline-color\ +ed-completion-pre\214x", readline uses this color for the common pre\ +\214x in-)-.25 F(stead of its def)144 636 Q(ault.)-.1 E F1(color)108 648 +Q(ed\255stats \(Off\))-.18 E F0 1.579(If set to)144 660 R F1(On)4.079 E +F0 4.079(,r)C 1.579(eadline displays possible completions using dif) +-4.079 F 1.58(ferent colors to indicate their \214le)-.25 F 2.5 +(type. The)144 672 R(color de\214nitions are tak)2.5 E(en from the v)-.1 +E(alue of the)-.25 E F1(LS_COLORS)2.5 E F0(en)2.5 E(vironment v)-.4 E +(ariable.)-.25 E F1(comment\255begin \(`)108 684 Q(`#')-.63 E('\))-.63 E +F0 .062(The string that is inserted in)144 696 R F1(vi)2.562 E F0 .062 +(mode when the)2.562 F F1(insert\255comment)2.562 E F0 .062 +(command is e)2.562 F -.15(xe)-.15 G 2.562(cuted. This).15 F(com-)2.562 +E(mand is bound to)144 708 Q F1(M\255#)2.5 E F0(in emacs mode and to)2.5 +E F1(#)2.5 E F0(in vi command mode.)2.5 E(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(3)190.115 E 0 Cg EP +%%Page: 4 4 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF +(completion\255display\255width \(\2551\))108 84 Q F0 1.453(The number \ +of screen columns used to display possible matches when performing comp\ +letion.)144 96 R .194(The v)144 108 R .193(alue is ignored if it is les\ +s than 0 or greater than the terminal screen width.)-.25 F 2.693(Av) +5.193 G .193(alue of 0 will)-2.943 F +(cause matches to be displayed one per line.)144 120 Q(The def)5 E +(ault v)-.1 E(alue is \2551.)-.25 E F1(completion\255ignor)108 132 Q +(e\255case \(Off\))-.18 E F0(If set to)144 144 Q F1(On)2.5 E F0 2.5(,r)C +(eadline performs \214lename matching and completion in a case\255insen\ +siti)-2.5 E .3 -.15(ve f)-.25 H(ashion.).05 E F1 +(completion\255map\255case \(Off\))108 156 Q F0 .093(If set to)144 168 R +F1(On)2.593 E F0 2.593(,a)C(nd)-2.593 E F1(completion\255ignor)2.593 E +(e\255case)-.18 E F0 .093(is enabled, readline treats h)2.593 F .093 +(yphens \()-.05 F/F2 10/Times-Italic@0 SFA F0 2.593(\)a)C .094 +(nd underscores)-2.593 F(\()144 180 Q F2(_)A F0 2.5(\)a)C 2.5(se)-2.5 G +(qui)-2.5 E -.25(va)-.25 G(lent when performing case\255insensiti).25 E +.3 -.15(ve \214)-.25 H(lename matching and completion.).15 E F1 +(completion\255pr)108 192 Q(e\214x\255display\255length \(0\))-.18 E F0 +.829(The length in characters of the common pre\214x of a list of possi\ +ble completions that is displayed)144 204 R 1.274 +(without modi\214cation.)144 216 R 1.274(When set to a v)6.274 F 1.274 +(alue greater than zero, common pre\214x)-.25 F 1.275 +(es longer than this)-.15 F -.25(va)144 228 S(lue are replaced with an \ +ellipsis when displaying possible completions.).25 E F1 +(completion\255query\255items \(100\))108 240 Q F0 .53 +(This determines when the user is queried about vie)144 252 R .529 +(wing the number of possible completions gen-)-.25 F .56(erated by the) +144 264 R F1(possible\255completions)3.06 E F0 3.06(command. It)3.06 F +.561(may be set to an)3.061 F 3.061(yi)-.15 G(nte)-3.061 E .561(ger v) +-.15 F .561(alue greater than or)-.25 F .783(equal to zero.)144 276 R +.783(If the number of possible completions is greater than or equal to \ +the v)5.783 F .782(alue of this)-.25 F -.25(va)144 288 S .367 +(riable, readline will ask whether or not the user wishes to vie).25 F +2.868(wt)-.25 G .368(hem; otherwise the)-2.868 F 2.868(ya)-.15 G .368 +(re simply)-2.868 F(listed on the terminal.)144 300 Q 2.5(An)5 G -2.25 +-.15(eg a)-2.5 H(ti).15 E .3 -.15(ve v)-.25 H +(alue causes readline to ne)-.1 E -.15(ve)-.25 G 2.5(ra).15 G(sk.)-2.5 E +F1(con)108 312 Q -.1(ve)-.4 G(rt\255meta \(On\)).1 E F0 .613(If set to) +144 324 R F1(On)3.113 E F0 3.113(,r)C .613(eadline will con)-3.113 F +-.15(ve)-.4 G .613(rt characters with the eighth bit set to an ASCII k) +.15 F .912 -.15(ey s)-.1 H .612(equence by).15 F 1.315(stripping the ei\ +ghth bit and pre\214xing it with an escape character \(in ef)144 336 R +1.316(fect, using escape as the)-.25 F F2 .503(meta pr)144 348 R(e\214x) +-.37 E F0 3.003(\). The)B(def)3.003 E .503(ault is)-.1 F F2(On)3.003 E +F0 3.003(,b)C .503(ut readline will set it to)-3.203 F F2(Of)3.003 E(f) +-.18 E F0 .502(if the locale contains eight-bit char)3.003 F(-)-.2 E +3.049(acters. This)144 360 R -.25(va)3.049 G .549 +(riable is dependent on the).25 F F1(LC_CTYPE)3.049 E F0 .549 +(locale cate)3.049 F(gory)-.15 E 3.049(,a)-.65 G .55 +(nd may change if the lo-)-3.049 F(cale is changed.)144 372 Q F1 +(disable\255completion \(Off\))108 384 Q F0 .038(If set to)144 396 R F1 +(On)2.538 E F0 2.538(,r)C .038(eadline will inhibit w)-2.538 F .038 +(ord completion.)-.1 F .038 +(Completion characters will be inserted into the)5.038 F(line as if the) +144 408 Q 2.5(yh)-.15 G(ad been mapped to)-2.5 E F1(self-insert)2.5 E F0 +(.)A F1(echo\255contr)108 420 Q(ol\255characters \(On\))-.18 E F0 1.21 +(When set to)144 432 R F1(On)3.71 E F0 3.71(,o)C 3.71(no)-3.71 G 1.211 +(perating systems that indicate the)-3.71 F 3.711(ys)-.15 G 1.211 +(upport it, readline echoes a character)-3.711 F +(corresponding to a signal generated from the k)144 444 Q -.15(ey)-.1 G +(board.).15 E F1(editing\255mode \(emacs\))108 456 Q F0 .142 +(Controls whether readline be)144 468 R .141(gins with a set of k)-.15 F +.441 -.15(ey b)-.1 H .141(indings similar to).15 F F2(Emacs)2.641 E F0 +(or)2.641 E F2(vi)2.641 E F0(.)A F1(editing\255mode)5.141 E F0 +(can be set to either)144 480 Q F1(emacs)2.5 E F0(or)2.5 E F1(vi)2.5 E +F0(.)A F1(emacs\255mode\255string \(@\))108 492 Q F0 .517(If the)144 504 +R F2(show\255mode\255in\255pr)3.017 E(ompt)-.45 E F0 -.25(va)3.017 G +.518(riable is enabled, this string is displayed immediately before the) +.25 F .622 +(last line of the primary prompt when emacs editing mode is acti)144 516 +R -.15(ve)-.25 G 5.622(.T).15 G .622(he v)-5.622 F .621(alue is e)-.25 F +.621(xpanded lik)-.15 F 3.121(ea)-.1 G -.1(ke)144 528 S 3.339(yb)-.05 G +.839(inding, so the standard set of meta- and control pre\214x)-3.339 F +.84(es and backslash escape sequences is)-.15 F -.2(av)144 540 S 2.798 +(ailable. Use)-.05 F .298(the \\1 and \\2 escapes to be)2.798 F .298 +(gin and end sequences of non-printing characters, which)-.15 F +(can be used to embed a terminal control sequence into the mode string.) +144 552 Q F1(enable\255acti)108 564 Q -.1(ve)-.1 G.1 E +(egion \(On\))-.18 E F0(The)144 576 Q F2(point)3.245 E F0 .746 +(is the current cursor position, and)3.245 F F2(mark)3.246 E F0 .746 +(refers to a sa)3.246 F -.15(ve)-.2 G 3.246(dc).15 G .746 +(ursor position.)-3.246 F .746(The te)5.746 F .746(xt be-)-.15 F .344 +(tween the point and mark is referred to as the)144 588 R F2 -.37(re) +2.844 G(gion)-.03 E F0 5.344(.W)C .344(hen this v)-5.344 F .344 +(ariable is set to)-.25 F F2(On)2.844 E F0 2.844(,r)C .344(eadline al-) +-2.844 F(lo)144 600 Q .098(ws certain commands to designate the re)-.25 +F .098(gion as)-.15 F F2(active)2.598 E F0 5.098(.W)C .098(hen the re) +-5.098 F .098(gion is acti)-.15 F -.15(ve)-.25 G 2.598(,r).15 G .098 +(eadline high-)-2.598 F .971(lights the te)144 612 R .971(xt in the re) +-.15 F .971(gion using the v)-.15 F .971(alue of the)-.25 F F1(acti)3.47 +E -.1(ve)-.1 G.1 E(egion\255start\255color)-.18 E F0 3.47(,w)C .97 +(hich def)-3.47 F .97(aults to)-.1 F .484 +(the string that enables the terminal')144 624 R 2.985(ss)-.55 G .485 +(tandout mode.)-2.985 F .485(The acti)5.485 F .785 -.15(ve r)-.25 H -.15 +(eg).15 G .485(ion sho).15 F .485(ws the te)-.25 F .485(xt inserted by) +-.15 F(brack)144 636 Q(eted-paste and an)-.1 E 2.5(ym)-.15 G(atching te) +-2.5 E(xt found by incremental and non-incremental history searches.) +-.15 E F1(enable\255brack)108 648 Q(eted\255paste \(On\))-.1 E F0 .841 +(When set to)144 660 R F1(On)3.341 E F0 3.341(,r)C .841(eadline con\214\ +gures the terminal to insert each paste into the editing b)-3.341 F(uf) +-.2 E .84(fer as a)-.25 F .799(single string of characters, instead of \ +treating each character as if it had been read from the k)144 672 R -.15 +(ey)-.1 G(-).15 E 3.159(board. This)144 684 R(pre)3.159 E -.15(ve)-.25 G +.659(nts readline from e).15 F -.15(xe)-.15 G .659(cuting an).15 F 3.158 +(ye)-.15 G .658(diting commands bound to k)-3.158 F .958 -.15(ey s)-.1 H +.658(equences ap-).15 F(pearing in the pasted te)144 696 Q(xt.)-.15 E +(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(4)190.115 E 0 Cg +EP +%%Page: 5 5 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF +(enable\255k)108 84 Q(eypad \(Off\))-.1 E F0 .892(When set to)144 96 R +F1(On)3.393 E F0 3.393(,r)C .893 +(eadline will try to enable the application k)-3.393 F -.15(ey)-.1 G +.893(pad when it is called.).15 F .893(Some sys-)5.893 F +(tems need this to enable the arro)144 108 Q 2.5(wk)-.25 G -.15(ey)-2.6 +G(s.).15 E F1(enable\255meta\255k)108 120 Q(ey \(On\))-.1 E F0 .64 +(When set to)144 132 R F1(On)3.14 E F0 3.14(,r)C .64 +(eadline will try to enable an)-3.14 F 3.14(ym)-.15 G .64 +(eta modi\214er k)-3.14 F .94 -.15(ey t)-.1 H .64 +(he terminal claims to support).15 F(when it is called.)144 144 Q +(On man)5 E 2.5(yt)-.15 G(erminals, the meta k)-2.5 E .3 -.15(ey i)-.1 H +2.5(su).15 G(sed to send eight-bit characters.)-2.5 E F1 +(expand\255tilde \(Off\))108 156 Q F0(If set to)144 168 Q F1(On)2.5 E F0 +2.5(,t)C(ilde e)-2.5 E(xpansion is performed when readline attempts w) +-.15 E(ord completion.)-.1 E F1(history\255pr)108 180 Q(eser)-.18 E -.1 +(ve)-.1 G(\255point \(Off\)).1 E F0 .552(If set to)144 192 R F1(On)3.052 +E F0 3.052(,t)C .552(he history code attempts to place point at the sam\ +e location on each history line re-)-3.052 F(trie)144 204 Q -.15(ve)-.25 +G 2.5(dw).15 G(ith)-2.5 E F1(pr)2.5 E -.15(ev)-.18 G(ious-history).15 E +F0(or)2.5 E F1(next-history)2.5 E F0(.)A F1(history\255size \(unset\)) +108 216 Q F0 .949(Set the maximum number of history entries sa)144 228 R +-.15(ve)-.2 G 3.448(di).15 G 3.448(nt)-3.448 G .948(he history list.) +-3.448 F .948(If set to zero, an)5.948 F 3.448(ye)-.15 G(xisting)-3.598 +E .482(history entries are deleted and no ne)144 240 R 2.982(we)-.25 G +.483(ntries are sa)-2.982 F -.15(ve)-.2 G 2.983(d. If).15 F .483 +(set to a v)2.983 F .483(alue less than zero, the num-)-.25 F .356 +(ber of history entries is not limited.)144 252 R .356(By def)5.356 F +.355(ault, the number of history entries is not limited.)-.1 F .355 +(If an)5.355 F .82(attempt is made to set)144 264 R/F2 10/Times-Italic@0 +SF(history\255size)3.32 E F0 .821(to a non-numeric v)3.321 F .821 +(alue, the maximum number of history en-)-.25 F +(tries will be set to 500.)144 276 Q F1(horizontal\255scr)108 288 Q +(oll\255mode \(Off\))-.18 E F0 .449(When set to)144 300 R F1(On)2.949 E +F0 2.949(,m)C(ak)-2.949 E .448 +(es readline use a single line for display)-.1 F 2.948(,s)-.65 G .448 +(crolling the input horizontally on a)-2.948 F 1.194(single screen line\ + when it becomes longer than the screen width rather than wrapping to a\ + ne)144 312 R(w)-.25 E 2.5(line. This)144 324 R +(setting is automatically enabled for terminals of height 1.)2.5 E F1 +(input\255meta \(Off\))108 336 Q F0 .367(If set to)144 348 R F1(On)2.867 +E F0 2.867(,r)C .367(eadline will enable eight-bit input \(that is, it \ +will not clear the eighth bit in the char)-2.867 F(-)-.2 E .956 +(acters it reads\), re)144 360 R -.05(ga)-.15 G .956 +(rdless of what the terminal claims it can support.).05 F .957(The name) +5.956 F F1(meta\255\215ag)3.457 E F0 .957(is a)3.457 F(synon)144 372 Q +.77(ym for this v)-.15 F 3.27(ariable. The)-.25 F(def)3.27 E .77 +(ault is)-.1 F F2(Of)3.27 E(f)-.18 E F0 3.27(,b)C .77 +(ut readline will set it to)-3.47 F F2(On)3.27 E F0 .77 +(if the locale contains)3.27 F 1.866(eight-bit characters.)144 384 R +1.866(This v)6.866 F 1.867(ariable is dependent on the)-.25 F F1 +(LC_CTYPE)4.367 E F0 1.867(locale cate)4.367 F(gory)-.15 E 4.367(,a)-.65 +G 1.867(nd may)-4.367 F(change if the locale is changed.)144 396 Q F1 +(isear)108 408 Q(ch\255terminators \(`)-.18 E(`C\255[ C\255J')-.63 E +('\))-.63 E F0 .439(The string of characters that should terminate an i\ +ncremental search without subsequently e)144 420 R -.15(xe)-.15 G(cut-) +.15 E .934(ing the character as a command.)144 432 R .935(If this v) +5.935 F .935(ariable has not been gi)-.25 F -.15(ve)-.25 G 3.435(nav).15 +G .935(alue, the characters)-3.685 F F2(ESC)3.435 E F0(and)144 444 Q F2 +(C\255J)2.5 E F0(will terminate an incremental search.)2.5 E F1 -.1(ke) +108 456 S(ymap \(emacs\)).1 E F0 2.323(Set the current readline k)144 +468 R -.15(ey)-.1 G 4.823(map. The).15 F 2.323(set of le)4.823 F -.05 +(ga)-.15 G 4.823(lk).05 G -.15(ey)-4.923 G 2.323(map names is).15 F F2 +2.323(emacs, emacs-standar)4.823 F(d,)-.37 E .781 +(emacs-meta, emacs-ctlx, vi, vi-mo)144 480 R(ve)-.1 E 3.282(,v)-.1 G +(i-command)-3.282 E F0 3.282(,a)C(nd)-3.282 E F2(vi-insert)3.572 E F0(.) +.68 E F2(vi)5.782 E F0 .782(is equi)3.282 F -.25(va)-.25 G .782(lent to) +.25 F F2(vi-command)3.282 E F0(;)A F2(emacs)144 492 Q F0 .683(is equi) +3.183 F -.25(va)-.25 G .683(lent to).25 F F2(emacs-standar)3.183 E(d) +-.37 E F0 5.682(.T)C .682(he def)-5.682 F .682(ault v)-.1 F .682 +(alue is)-.25 F F2(emacs)3.372 E F0 5.682(.T).27 G .682(he v)-5.682 F +.682(alue of)-.25 F F1(editing\255mode)3.182 E F0(also af)144 504 Q +(fects the def)-.25 E(ault k)-.1 E -.15(ey)-.1 G(map.).15 E F1 -.1(ke) +108 516 S(yseq\255timeout \(500\)).1 E F0 .367(Speci\214es the duration) +144 528 R F2 -.37(re)2.867 G(adline).37 E F0 .367(will w)2.867 F .367 +(ait for a character when reading an ambiguous k)-.1 F .668 -.15(ey s) +-.1 H(equence).15 E .525(\(one that can form a complete k)144 540 R .825 +-.15(ey s)-.1 H .524(equence using the input read so f).15 F(ar)-.1 E +3.024(,o)-.4 G 3.024(rc)-3.024 G .524(an tak)-3.024 F 3.024(ea)-.1 G +.524(dditional in-)-3.024 F .806(put to complete a longer k)144 552 R +1.106 -.15(ey s)-.1 H 3.306(equence\). If).15 F .806(no input is recei) +3.306 F -.15(ve)-.25 G 3.306(dw).15 G .807(ithin the timeout,)-3.306 F +F2 -.37(re)3.307 G(adline).37 E F0(will)3.307 E .907(use the shorter b) +144 564 R .907(ut complete k)-.2 F 1.207 -.15(ey s)-.1 H 3.407 +(equence. The).15 F -.25(va)3.407 G .907 +(lue is speci\214ed in milliseconds, so a v).25 F .906(alue of)-.25 F +.05(1000 means that)144 576 R F2 -.37(re)2.55 G(adline).37 E F0 .05 +(will w)2.55 F .05(ait one second for additional input.)-.1 F .05 +(If this v)5.05 F .05(ariable is set to a v)-.25 F(alue)-.25 E .051 +(less than or equal to zero, or to a non-numeric v)144 588 R(alue,)-.25 +E F2 -.37(re)2.551 G(adline).37 E F0 .051(will w)2.551 F .051 +(ait until another k)-.1 F .351 -.15(ey i)-.1 H 2.551(sp).15 G(ressed) +-2.551 E(to decide which k)144 600 Q .3 -.15(ey s)-.1 H +(equence to complete.).15 E F1(mark\255dir)108 612 Q(ectories \(On\)) +-.18 E F0(If set to)144 624 Q F1(On)2.5 E F0 2.5(,c)C +(ompleted directory names ha)-2.5 E .3 -.15(ve a s)-.2 H(lash appended.) +.15 E F1(mark\255modi\214ed\255lines \(Off\))108 636 Q F0(If set to)144 +648 Q F1(On)2.5 E F0 2.5(,h)C(istory lines that ha)-2.5 E .3 -.15(ve b) +-.2 H(een modi\214ed are displayed with a preceding asterisk \().15 E F1 +(*)A F0(\).)A F1(mark\255symlink)108 660 Q(ed\255dir)-.1 E +(ectories \(Off\))-.18 E F0 .175(If set to)144 672 R F1(On)2.675 E F0 +2.675(,c)C .175 +(ompleted names which are symbolic links to directories ha)-2.675 F .475 +-.15(ve a s)-.2 H .175(lash appended \(sub-).15 F(ject to the v)144 684 +Q(alue of)-.25 E F1(mark\255dir)2.5 E(ectories)-.18 E F0(\).)A F1 +(match\255hidden\255\214les \(On\))108 696 Q F0 .193(This v)144 708 R +.193(ariable, when set to)-.25 F F1(On)2.693 E F0 2.693(,c)C .192 +(auses readline to match \214les whose names be)-2.693 F .192 +(gin with a `.)-.15 F 2.692('\()-.7 G(hidden)-2.692 E .456 +(\214les\) when performing \214lename completion.)144 720 R .456 +(If set to)5.456 F F1(Off)2.956 E F0 2.956(,t)C .456(he leading `.) +-2.956 F 2.956('m)-.7 G .457(ust be supplied by the)-2.956 F +(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(5)190.115 E 0 Cg +EP +%%Page: 6 6 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E +(user in the \214lename to be completed.)144 84 Q/F1 10/Times-Bold@0 SF +(menu\255complete\255display\255pr)108 96 Q(e\214x \(Off\))-.18 E F0 +1.586(If set to)144 108 R F1(On)4.086 E F0 4.086(,m)C 1.585(enu complet\ +ion displays the common pre\214x of the list of possible completions) +-4.086 F(\(which may be empty\) before c)144 120 Q +(ycling through the list.)-.15 E F1(output\255meta \(Off\))108 132 Q F0 +.506(If set to)144 144 R F1(On)3.006 E F0 3.006(,r)C .507(eadline will \ +display characters with the eighth bit set directly rather than as a me\ +ta-)-3.006 F(pre\214x)144 156 Q .885(ed escape sequence.)-.15 F .884 +(The def)5.884 F .884(ault is)-.1 F/F2 10/Times-Italic@0 SF(Of)3.384 E +(f)-.18 E F0 3.384(,b)C .884(ut readline will set it to)-3.584 F F2(On) +3.384 E F0 .884(if the locale contains)3.384 F 1.866 +(eight-bit characters.)144 168 R 1.866(This v)6.866 F 1.867 +(ariable is dependent on the)-.25 F F1(LC_CTYPE)4.367 E F0 1.867 +(locale cate)4.367 F(gory)-.15 E 4.367(,a)-.65 G 1.867(nd may)-4.367 F +(change if the locale is changed.)144 180 Q F1 +(page\255completions \(On\))108 192 Q F0 .809(If set to)144 204 R F1(On) +3.308 E F0 3.308(,r)C .808(eadline uses an internal)-3.308 F F2(mor) +3.308 E(e)-.37 E F0(-lik)A 3.308(ep)-.1 G .808 +(ager to display a screenful of possible comple-)-3.308 F +(tions at a time.)144 216 Q F1 +(print\255completions\255horizontally \(Off\))108 228 Q F0 .227 +(If set to)144 240 R F1(On)2.727 E F0 2.727(,r)C .227(eadline will disp\ +lay completions with matches sorted horizontally in alphabetical or) +-2.727 F(-)-.2 E(der)144 252 Q 2.5(,r)-.4 G(ather than do)-2.5 E +(wn the screen.)-.25 E F1 -2.29 -.18(re v)108 264 T +(ert\255all\255at\255newline \(Off\)).08 E F0 .699(If set to)144 276 R +F1(On)3.199 E F0 3.199(,r)C .699 +(eadline will undo all changes to history lines before returning when) +-3.199 F F1(accept\255line)3.198 E F0(is)3.198 E -.15(exe)144 288 S +2.686(cuted. By).15 F(def)2.686 E .186 +(ault, history lines may be modi\214ed and retain indi)-.1 F .186 +(vidual undo lists across calls to)-.25 F F1 -.18(re)144 300 S(adline) +.18 E F0(.)A F1(sho)108 312 Q(w\255all\255if\255ambiguous \(Off\))-.1 E +F0 .304(This alters the def)144 324 R .304(ault beha)-.1 F .304 +(vior of the completion functions.)-.2 F .304(If set to)5.304 F F1(On) +2.804 E F0 2.803(,w)C .303(ords which ha)-2.903 F .603 -.15(ve m)-.2 H +(ore).15 E 1.264(than one possible completion cause the matches to be l\ +isted immediately instead of ringing the)144 336 R(bell.)144 348 Q F1 +(sho)108 360 Q(w\255all\255if\255unmodi\214ed \(Off\))-.1 E F0 5.346 +(This alters the def)144 372 R 5.346(ault beha)-.1 F 5.345 +(vior of the completion functions in a f)-.2 F 5.345(ashion similar to) +-.1 F F1(sho)144 384 Q(w\255all\255if\255ambiguous)-.1 E F0 6.69(.I)C +4.19(fs)-6.69 G 1.691(et to)-4.19 F F1(On)4.191 E F0 4.191(,w)C 1.691 +(ords which ha)-4.291 F 1.991 -.15(ve m)-.2 H 1.691 +(ore than one possible completion).15 F 1.04(without an)144 396 R 3.54 +(yp)-.15 G 1.039 +(ossible partial completion \(the possible completions don')-3.54 F +3.539(ts)-.18 G 1.039(hare a common pre\214x\))-3.539 F(cause the match\ +es to be listed immediately instead of ringing the bell.)144 408 Q F1 +(sho)108 420 Q(w\255mode\255in\255pr)-.1 E(ompt \(Off\))-.18 E F0 1.021 +(If set to)144 432 R F1(On)3.521 E F0 3.521(,a)C 1.022 +(dd a string to the be)-3.521 F 1.022 +(ginning of the prompt indicating the editing mode: emacs, vi)-.15 F +(command, or vi insertion.)144 444 Q(The mode strings are user)5 E +(-settable \(e.g.,)-.2 E F2(emacs\255mode\255string)2.5 E F0(\).)A F1 +(skip\255completed\255text \(Off\))108 456 Q F0 .095(If set to)144 468 R +F1(On)2.595 E F0 2.595(,t)C .095(his alters the def)-2.595 F .095 +(ault completion beha)-.1 F .094 +(vior when inserting a single match into the line.)-.2 F(It')144 480 Q +2.545(so)-.55 G .045(nly acti)-2.545 F .345 -.15(ve w)-.25 H .046 +(hen performing completion in the middle of a w).15 F 2.546(ord. If)-.1 +F .046(enabled, readline does not)2.546 F 1.394(insert characters from \ +the completion that match characters after point in the w)144 492 R +1.394(ord being com-)-.1 F(pleted, so portions of the w)144 504 Q +(ord follo)-.1 E(wing the cursor are not duplicated.)-.25 E F1 +(vi\255cmd\255mode\255string \(\(cmd\)\))108 516 Q F0 .517(If the)144 +528 R F2(show\255mode\255in\255pr)3.017 E(ompt)-.45 E F0 -.25(va)3.017 G +.518(riable is enabled, this string is displayed immediately before the) +.25 F .475(last line of the primary prompt when vi editing mode is acti) +144 540 R .775 -.15(ve a)-.25 H .475(nd in command mode.).15 F .475 +(The v)5.475 F(alue)-.25 E .33(is e)144 552 R .33(xpanded lik)-.15 F +2.83(eak)-.1 G .63 -.15(ey b)-2.93 H .33 +(inding, so the standard set of meta- and control pre\214x).15 F .33 +(es and backslash es-)-.15 F .245(cape sequences is a)144 564 R -.25(va) +-.2 G 2.745(ilable. Use).25 F .244(the \\1 and \\2 escapes to be)2.745 F +.244(gin and end sequences of non-printing)-.15 F(characters, which can\ + be used to embed a terminal control sequence into the mode string.)144 +576 Q F1(vi\255ins\255mode\255string \(\(ins\)\))108 588 Q F0 .517 +(If the)144 600 R F2(show\255mode\255in\255pr)3.017 E(ompt)-.45 E F0 +-.25(va)3.017 G .518 +(riable is enabled, this string is displayed immediately before the).25 +F .186(last line of the primary prompt when vi editing mode is acti)144 +612 R .486 -.15(ve a)-.25 H .186(nd in insertion mode.).15 F .186(The v) +5.186 F .186(alue is)-.25 F -.15(ex)144 624 S .923(panded lik).15 F +3.423(eak)-.1 G 1.223 -.15(ey b)-3.523 H .924 +(inding, so the standard set of meta- and control pre\214x).15 F .924 +(es and backslash es-)-.15 F .245(cape sequences is a)144 636 R -.25(va) +-.2 G 2.745(ilable. Use).25 F .244(the \\1 and \\2 escapes to be)2.745 F +.244(gin and end sequences of non-printing)-.15 F(characters, which can\ + be used to embed a terminal control sequence into the mode string.)144 +648 Q F1(visible\255stats \(Off\))108 660 Q F0 .846(If set to)144 672 R +F1(On)3.346 E F0 3.346(,ac)C .846(haracter denoting a \214le')-3.346 F +3.346(st)-.55 G .846(ype as reported by)-3.346 F F2(stat)3.346 E F0 .846 +(\(2\) is appended to the \214lename)B +(when listing possible completions.)144 684 Q F1(Conditional Constructs) +87 700.8 Q F0 .05(Readline implements a f)108 712.8 R .05(acility simil\ +ar in spirit to the conditional compilation features of the C preproces\ +sor)-.1 F .096(which allo)108 724.8 R .096(ws k)-.25 F .396 -.15(ey b) +-.1 H .096(indings and v).15 F .096 +(ariable settings to be performed as the result of tests.)-.25 F .097 +(There are four parser)5.096 F(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(6)190.115 E 0 Cg EP +%%Page: 7 7 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E(directi)108 84 Q -.15 +(ve)-.25 G 2.5(su).15 G(sed.)-2.5 E/F1 10/Times-Bold@0 SF($if)108 100.8 +Q F0(The)144 100.8 Q F1($if)2.963 E F0 .463(construct allo)2.963 F .462 +(ws bindings to be made based on the editing mode, the terminal being u\ +sed,)-.25 F .961(or the application using readline.)144 112.8 R .961 +(The te)5.961 F .961(xt of the test, after an)-.15 F 3.462(yc)-.15 G +.962(omparison operator)-3.462 F 3.462(,e)-.4 G .962(xtends to)-3.612 F +(the end of the line; unless otherwise noted, no characters are require\ +d to isolate it.)144 124.8 Q F1(mode)144 141.6 Q F0(The)180 141.6 Q F1 +(mode=)3.712 E F0 1.212(form of the)3.712 F F1($if)3.711 E F0(directi) +3.711 E 1.511 -.15(ve i)-.25 H 3.711(su).15 G 1.211 +(sed to test whether readline is in emacs or vi)-3.711 F 3.065 +(mode. This)180 153.6 R .565(may be used in conjunction with the)3.065 F +F1 .565(set k)3.065 F(eymap)-.1 E F0 .565(command, for instance, to) +3.065 F .03(set bindings in the)180 165.6 R/F2 10/Times-Italic@0 SF +(emacs-standar)2.529 E(d)-.37 E F0(and)2.529 E F2(emacs-ctlx)2.529 E F0 +-.1(ke)2.529 G .029(ymaps only if readline is starting out)-.05 F +(in emacs mode.)180 177.6 Q F1(term)144 194.4 Q F0(The)180 194.4 Q F1 +(term=)3.196 E F0 .696 +(form may be used to include terminal-speci\214c k)3.196 F .996 -.15 +(ey b)-.1 H .697(indings, perhaps to bind).15 F .654(the k)180 206.4 R +.954 -.15(ey s)-.1 H .654(equences output by the terminal').15 F 3.154 +(sf)-.55 G .654(unction k)-3.154 F -.15(ey)-.1 G 3.154(s. The).15 F -.1 +(wo)3.154 G .654(rd on the right side of).1 F(the)180 218.4 Q F1(=)3.003 +E F0 .503(is tested ag)3.003 F .504(ainst the full name of the terminal\ + and the portion of the terminal name)-.05 F(before the \214rst)180 +230.4 Q F12.5 E F0 5(.T)C(his allo)-5 E(ws)-.25 E F2(sun)2.84 E F0 +(to match both)2.74 E F2(sun)2.84 E F0(and)2.74 E F2(sun\255cmd)2.84 E +F0 2.5(,f).77 G(or instance.)-2.5 E F1 -.1(ve)144 247.2 S(rsion).1 E F0 +(The)180 259.2 Q F1 -.1(ve)3.109 G(rsion).1 E F0 .608 +(test may be used to perform comparisons ag)3.109 F .608 +(ainst speci\214c readline v)-.05 F(ersions.)-.15 E(The)180 271.2 Q F1 +-.1(ve)2.771 G(rsion).1 E F0 -.15(ex)2.771 G .271 +(pands to the current readline v).15 F 2.772(ersion. The)-.15 F .272 +(set of comparison operators in-)2.772 F(cludes)180 283.2 Q F1(=)3.064 E +F0 3.064(,\()C(and)-3.064 E F1(==)3.064 E F0(\),)A F1(!=)3.064 E F0(,)A +F1(<=)3.064 E F0(,)A F1(>=)3.064 E F0(,)A F1(<)3.064 E F0 3.064(,a)C(nd) +-3.064 E F1(>)3.064 E F0 5.563(.T)C .563(he v)-5.563 F .563 +(ersion number supplied on the right side)-.15 F .318 +(of the operator consists of a major v)180 295.2 R .318(ersion number) +-.15 F 2.818(,a)-.4 G 2.818(no)-2.818 G .318 +(ptional decimal point, and an op-)-2.818 F .101(tional minor v)180 +307.2 R .101(ersion \(e.g.,)-.15 F F1(7.1)2.601 E F0 .101 +(\). If the minor v)B .1(ersion is omitted, it is assumed to be)-.15 F +F1(0)2.6 E F0 5.1(.T)C(he)-5.1 E .06 +(operator may be separated from the string)180 319.2 R F1 -.1(ve)2.56 G +(rsion).1 E F0 .06(and from the v)2.56 F .06(ersion number ar)-.15 F +(gument)-.18 E(by whitespace.)180 331.2 Q F1(application)144 348 Q F0 +(The)180 360 Q F1(application)3.003 E F0 .503 +(construct is used to include application-speci\214c settings.)3.003 F +.503(Each program)5.503 F .114(using the readline library sets the)180 +372 R F2 .114(application name)2.614 F F0 2.614(,a)C .114 +(nd an initialization \214le can test for a)-2.614 F .501(particular v) +180 384 R 3.001(alue. This)-.25 F .501(could be used to bind k)3.001 F +.801 -.15(ey s)-.1 H .5(equences to functions useful for a spe-).15 F +.396(ci\214c program.)180 396 R -.15(Fo)5.396 G 2.896(ri).15 G .396 +(nstance, the follo)-2.896 F .396(wing command adds a k)-.25 F .696 -.15 +(ey s)-.1 H .397(equence that quotes the).15 F(current or pre)180 408 Q +(vious w)-.25 E(ord in)-.1 E F1(bash)2.5 E F0(:)A F1($if)180 432 Q F0 +(Bash)2.5 E 2.5(#Q)180 444 S(uote the current or pre)-2.5 E(vious w)-.25 +E(ord)-.1 E("\\C-xq": "\\eb\\"\\ef\\"")180 456 Q F1($endif)180 468 Q F2 +(variable)144 484.8 Q F0(The)180 496.8 Q F2(variable)3.777 E F0 1.277 +(construct pro)3.777 F 1.276(vides simple equality tests for readline v) +-.15 F 1.276(ariables and v)-.25 F(alues.)-.25 E .079 +(The permitted comparison operators are)180 508.8 R F2(=)2.579 E F0(,)A +F2(==)2.579 E F0 2.579(,a)C(nd)-2.579 E F2(!=)2.579 E F0 5.079(.T)C .079 +(he v)-5.079 F .08(ariable name must be sepa-)-.25 F .98(rated from the\ + comparison operator by whitespace; the operator may be separated from) +180 520.8 R .129(the v)180 532.8 R .129 +(alue on the right hand side by whitespace.)-.25 F .13 +(Both string and boolean v)5.129 F .13(ariables may be)-.25 F +(tested. Boolean v)180 544.8 Q(ariables must be tested ag)-.25 E +(ainst the v)-.05 E(alues)-.25 E F2(on)2.5 E F0(and)2.5 E F2(of)2.5 E(f) +-.18 E F0(.)A F1($endif)108 561.6 Q F0(This command, as seen in the pre) +144 561.6 Q(vious e)-.25 E(xample, terminates an)-.15 E F1($if)2.5 E F0 +(command.)2.5 E F1($else)108 578.4 Q F0(Commands in this branch of the) +144 578.4 Q F1($if)2.5 E F0(directi)2.5 E .3 -.15(ve a)-.25 H(re e).15 E +-.15(xe)-.15 G(cuted if the test f).15 E(ails.)-.1 E F1($include)108 +595.2 Q F0 .357(This directi)144 607.2 R .657 -.15(ve t)-.25 H(ak).15 E +.357(es a single \214lename as an ar)-.1 F .356 +(gument and reads commands and bindings from that)-.18 F 2.5(\214le. F) +144 619.2 R(or e)-.15 E(xample, the follo)-.15 E(wing directi)-.25 E .3 +-.15(ve w)-.25 H(ould read).05 E F2(/etc/inputr)2.5 E(c)-.37 E F0(:)A F1 +($include)144 643.2 Q F2(/etc/inputr)5.833 E(c)-.37 E/F3 10.95 +/Times-Bold@0 SF(SEARCHING)72 660 Q F0 1.003(Readline pro)108 672 R +1.003(vides commands for searching through the command history for line\ +s containing a speci\214ed)-.15 F 2.5(string. There)108 684 R(are tw)2.5 +E 2.5(os)-.1 G(earch modes:)-2.5 E F2(incr)2.51 E(emental)-.37 E F0(and) +3.01 E F2(non-incr)2.86 E(emental)-.37 E F0(.).51 E .698 +(Incremental searches be)108 700.8 R .698 +(gin before the user has \214nished typing the search string.)-.15 F +.697(As each character of the)5.697 F .112 +(search string is typed, readline displays the ne)108 712.8 R .112 +(xt entry from the history matching the string typed so f)-.15 F(ar)-.1 +E 5.113(.A)-.55 G(n)-5.113 E .545 +(incremental search requires only as man)108 724.8 R 3.045(yc)-.15 G +.544(haracters as needed to \214nd the desired history entry)-3.045 F +5.544(.T)-.65 G 3.044(os)-6.344 G(earch)-3.044 E(GNU Readline 8.2)72 768 +Q(2022 September 19)120.405 E(7)190.115 E 0 Cg EP +%%Page: 8 8 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E(backw)108 84 Q .18 +(ard in the history for a particular string, type)-.1 F/F1 10 +/Times-Bold@0 SF(C\255r)2.681 E F0 5.181(.T)C(yping)-5.981 E F1(C\255s) +2.681 E F0 .181(searches forw)2.681 F .181(ard through the history)-.1 F +(.)-.65 E .354(The characters present in the v)108 96 R .354 +(alue of the)-.25 F F1(isear)2.854 E(ch-terminators)-.18 E F0 -.25(va) +2.854 G .354(riable are used to terminate an incremen-).25 F .6 +(tal search.)108 108 R .6(If that v)5.6 F .6 +(ariable has not been assigned a v)-.25 F .6(alue the)-.25 F/F2 10 +/Times-Italic@0 SF(Escape)3.1 E F0(and)3.1 E F1(C\255J)3.1 E F0 .6 +(characters will terminate an)3.1 F .123(incremental search.)108 120 R +F1(C\255G)5.123 E F0 .123 +(will abort an incremental search and restore the original line.)2.623 F +.122(When the search is)5.122 F(terminated, the history entry containin\ +g the search string becomes the current line.)108 132 Q 2.406 -.8 +(To \214)108 148.8 T .806 +(nd other matching entries in the history list, type).8 F F1(C\255s) +3.306 E F0(or)3.306 E F1(C\255r)3.306 E F0 .806(as appropriate.)3.306 F +.807(This will search back-)5.806 F -.1(wa)108 160.8 S .536(rd or forw) +.1 F .536(ard in the history for the ne)-.1 F .535 +(xt line matching the search string typed so f)-.15 F(ar)-.1 E 5.535(.A) +-.55 G .835 -.15(ny o)-5.535 H .535(ther k).15 F .835 -.15(ey s)-.1 H +(e-).15 E .384 +(quence bound to a readline command will terminate the search and e)108 +172.8 R -.15(xe)-.15 G .385(cute that command.).15 F -.15(Fo)5.385 G +2.885(ri).15 G .385(nstance, a)-2.885 F(ne)108 184.8 Q .338 +(wline will terminate the search and accept the line, thereby e)-.25 F +-.15(xe)-.15 G .337(cuting the command from the history list.).15 F +2.997(Am)108 196.8 S -.15(ove)-2.997 G .497 +(ment command will terminate the search, mak).15 F 2.997(et)-.1 G .497 +(he last line found the current line, and be)-2.997 F .498(gin edit-) +-.15 F(ing.)108 208.8 Q .567(Non-incremental searches read the entire s\ +earch string before starting to search for matching history lines.)108 +225.6 R(The search string may be typed by the user or be part of the co\ +ntents of the current line.)108 237.6 Q/F3 10.95/Times-Bold@0 SF +(EDITING COMMANDS)72 254.4 Q F0 1.391(The follo)108 266.4 R 1.391 +(wing is a list of the names of the commands and the def)-.25 F 1.391 +(ault k)-.1 F 1.691 -.15(ey s)-.1 H 1.391(equences to which the).15 F +3.892(ya)-.15 G(re)-3.892 E 2.5(bound. Command)108 278.4 R +(names without an accompan)2.5 E(ying k)-.15 E .3 -.15(ey s)-.1 H +(equence are unbound by def).15 E(ault.)-.1 E .055(In the follo)108 +295.2 R .055(wing descriptions,)-.25 F F2(point)2.555 E F0 .055 +(refers to the current cursor position, and)2.555 F F2(mark)2.555 E F0 +.054(refers to a cursor position)2.554 F(sa)108 307.2 Q -.15(ve)-.2 G +2.5(db).15 G 2.5(yt)-2.5 G(he)-2.5 E F1(set\255mark)2.5 E F0 2.5 +(command. The)2.5 F(te)2.5 E +(xt between the point and mark is referred to as the)-.15 E F2 -.37(re) +2.5 G(gion)-.03 E F0(.)A F1(Commands f)87 324 Q(or Mo)-.25 E(ving)-.1 E +(beginning\255of\255line \(C\255a\))108 336 Q F0(Mo)144 348 Q .3 -.15 +(ve t)-.15 H 2.5(ot).15 G(he start of the current line.)-2.5 E F1 +(end\255of\255line \(C\255e\))108 360 Q F0(Mo)144 372 Q .3 -.15(ve t) +-.15 H 2.5(ot).15 G(he end of the line.)-2.5 E F1 -.25(fo)108 384 S +(rward\255char \(C\255f\)).25 E F0(Mo)144 396 Q .3 -.15(ve f)-.15 H(orw) +.15 E(ard a character)-.1 E(.)-.55 E F1(backward\255char \(C\255b\))108 +408 Q F0(Mo)144 420 Q .3 -.15(ve b)-.15 H(ack a character).15 E(.)-.55 E +F1 -.25(fo)108 432 S(rward\255w).25 E(ord \(M\255f\))-.1 E F0(Mo)144 444 +Q .822 -.15(ve f)-.15 H(orw).15 E .522(ard to the end of the ne)-.1 F +.523(xt w)-.15 F 3.023(ord. W)-.1 F .523 +(ords are composed of alphanumeric characters \(let-)-.8 F +(ters and digits\).)144 456 Q F1(backward\255w)108 468 Q(ord \(M\255b\)) +-.1 E F0(Mo)144 480 Q 1.71 -.15(ve b)-.15 H 1.41 +(ack to the start of the current or pre).15 F 1.41(vious w)-.25 F 3.91 +(ord. W)-.1 F 1.41(ords are composed of alphanumeric)-.8 F +(characters \(letters and digits\).)144 492 Q F1(pr)108 504 Q -.15(ev) +-.18 G(ious\255scr).15 E(een\255line)-.18 E F0 .89(Attempt to mo)144 516 +R 1.19 -.15(ve p)-.15 H .89(oint to the same ph).15 F .891 +(ysical screen column on the pre)-.05 F .891(vious ph)-.25 F .891 +(ysical screen line.)-.05 F 1.056(This will not ha)144 528 R 1.356 -.15 +(ve t)-.2 H 1.056(he desired ef).15 F 1.056 +(fect if the current readline line does not tak)-.25 F 3.555(eu)-.1 G +3.555(pm)-3.555 G 1.055(ore than one)-3.555 F(ph)144 540 Q(ysical line \ +or if point is not greater than the length of the prompt plus the scree\ +n width.)-.05 E F1(next\255scr)108 552 Q(een\255line)-.18 E F0 .637 +(Attempt to mo)144 564 R .937 -.15(ve p)-.15 H .637(oint to the same ph) +.15 F .638(ysical screen column on the ne)-.05 F .638(xt ph)-.15 F .638 +(ysical screen line. This)-.05 F .195(will not ha)144 576 R .495 -.15 +(ve t)-.2 H .195(he desired ef).15 F .194 +(fect if the current readline line does not tak)-.25 F 2.694(eu)-.1 G +2.694(pm)-2.694 G .194(ore than one ph)-2.694 F(ysical)-.05 E .164(line\ + or if the length of the current readline line is not greater than the \ +length of the prompt plus the)144 588 R(screen width.)144 600 Q F1 +(clear\255display \(M\255C\255l\))108 612 Q F0 1.499 +(Clear the screen and, if possible, the terminal')144 624 R 3.999(ss) +-.55 G 1.498(crollback b)-3.999 F(uf)-.2 E(fer)-.25 E 3.998(,t)-.4 G +1.498(hen redra)-3.998 F 3.998(wt)-.15 G 1.498(he current line,)-3.998 F +(lea)144 636 Q(ving the current line at the top of the screen.)-.2 E F1 +(clear\255scr)108 648 Q(een \(C\255l\))-.18 E F0 1.36 +(Clear the screen, then redra)144 660 R 3.86(wt)-.15 G 1.36 +(he current line, lea)-3.86 F 1.36 +(ving the current line at the top of the screen.)-.2 F -.4(Wi)144 672 S +(th an ar).4 E +(gument, refresh the current line without clearing the screen.)-.18 E F1 +-.18(re)108 684 S(draw\255curr).18 E(ent\255line)-.18 E F0 +(Refresh the current line.)144 696 Q(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(8)190.115 E 0 Cg EP +%%Page: 9 9 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF +(Commands f)87 84 Q(or Manipulating the History)-.25 E +(accept\255line \(Newline, Retur)108 96 Q(n\))-.15 E F0 .365 +(Accept the line re)144 108 R -.05(ga)-.15 G .364 +(rdless of where the cursor is.).05 F .364(If this line is non-empty) +5.364 F 2.864(,i)-.65 G 2.864(tm)-2.864 G .364(ay be added to the)-2.864 +F .74(history list for future recall with)144 120 R F1(add_history\(\)) +3.24 E F0 5.741(.I)C 3.241(ft)-5.741 G .741 +(he line is a modi\214ed history line, the history)-3.241 F +(line is restored to its original state.)144 132 Q F1(pr)108 144 Q -.15 +(ev)-.18 G(ious\255history \(C\255p\)).15 E F0(Fetch the pre)144 156 Q +(vious command from the history list, mo)-.25 E(ving back in the list.) +-.15 E F1(next\255history \(C\255n\))108 168 Q F0(Fetch the ne)144 180 Q +(xt command from the history list, mo)-.15 E(ving forw)-.15 E +(ard in the list.)-.1 E F1(beginning\255of\255history \(M\255<\))108 192 +Q F0(Mo)144 204 Q .3 -.15(ve t)-.15 H 2.5(ot).15 G +(he \214rst line in the history)-2.5 E(.)-.65 E F1 +(end\255of\255history \(M\255>\))108 216 Q F0(Mo)144 228 Q .3 -.15(ve t) +-.15 H 2.5(ot).15 G(he end of the input history)-2.5 E 2.5(,i)-.65 G +(.e., the line currently being entered.)-2.5 E F1 +(operate\255and\255get\255next \(C\255o\))108 240 Q F0 .733(Accept the \ +current line for return to the calling application as if a ne)144 252 R +.733(wline had been entered, and)-.25 F .367(fetch the ne)144 264 R .367 +(xt line relati)-.15 F .667 -.15(ve t)-.25 H 2.867(ot).15 G .367 +(he current line from the history for editing.)-2.867 F 2.867(An)5.367 G +.367(umeric ar)-2.867 F .368(gument, if)-.18 F(supplied, speci\214es th\ +e history entry to use instead of the current line.)144 276 Q F1 +(fetch\255history)108 288 Q F0 -.4(Wi)144 300 S .257(th a numeric ar).4 +F .257(gument, fetch that entry from the history list and mak)-.18 F +2.756(ei)-.1 G 2.756(tt)-2.756 G .256(he current line.)-2.756 F -.4(Wi) +5.256 G(th-).4 E(out an ar)144 312 Q(gument, mo)-.18 E .3 -.15(ve b)-.15 +H(ack to the \214rst entry in the history list.).15 E F1 -2.29 -.18 +(re v)108 324 T(erse\255sear).08 E(ch\255history \(C\255r\))-.18 E F0 +1.47(Search backw)144 336 R 1.471 +(ard starting at the current line and mo)-.1 F 1.471 +(ving `up' through the history as necessary)-.15 F(.)-.65 E +(This is an incremental search.)144 348 Q F1 -.25(fo)108 360 S +(rward\255sear).25 E(ch\255history \(C\255s\))-.18 E F0 1.132 +(Search forw)144 372 R 1.132(ard starting at the current line and mo)-.1 +F 1.131(ving `do)-.15 F 1.131(wn' through the history as necessary)-.25 +F(.)-.65 E(This is an incremental search.)144 384 Q F1(non\255incr)108 +396 Q(emental\255r)-.18 E -2.3 -.15(ev e)-.18 H(rse\255sear).15 E +(ch\255history \(M\255p\))-.18 E F0 .164(Search backw)144 408 R .164(ar\ +d through the history starting at the current line using a non-incremen\ +tal search for)-.1 F 2.5(as)144 420 S(tring supplied by the user)-2.5 E +(.)-.55 E F1(non\255incr)108 432 Q(emental\255f)-.18 E(orward\255sear) +-.25 E(ch\255history \(M\255n\))-.18 E F0 1.354(Search forw)144 444 R +1.354(ard through the history using a non-incremental search for a stri\ +ng supplied by the)-.1 F(user)144 456 Q(.)-.55 E F1(history\255sear)108 +468 Q(ch\255backward)-.18 E F0 .95(Search backw)144 480 R .951(ard thro\ +ugh the history for the string of characters between the start of the c\ +urrent)-.1 F .12(line and the current cursor position \(the)144 492 R/F2 +10/Times-Italic@0 SF(point)2.62 E F0 2.62(\). The)B .12 +(search string must match at the be)2.62 F .12(ginning of a)-.15 F +(history line.)144 504 Q(This is a non-incremental search.)5 E F1 +(history\255sear)108 516 Q(ch\255f)-.18 E(orward)-.25 E F0 .248 +(Search forw)144 528 R .249(ard through the history for the string of c\ +haracters between the start of the current line)-.1 F .036 +(and the point.)144 540 R .036(The search string must match at the be) +5.036 F .035(ginning of a history line.)-.15 F .035 +(This is a non-incre-)5.035 F(mental search.)144 552 Q F1 +(history\255substring\255sear)108 564 Q(ch\255backward)-.18 E F0 .95 +(Search backw)144 576 R .951(ard through the history for the string of \ +characters between the start of the current)-.1 F .007 +(line and the current cursor position \(the)144 588 R F2(point)2.507 E +F0 2.507(\). The)B .007(search string may match an)2.507 F .006 +(ywhere in a history)-.15 F 2.5(line. This)144 600 R +(is a non-incremental search.)2.5 E F1(history\255substring\255sear)108 +612 Q(ch\255f)-.18 E(orward)-.25 E F0 .248(Search forw)144 624 R .249(a\ +rd through the history for the string of characters between the start o\ +f the current line)-.1 F .319(and the point.)144 636 R .319 +(The search string may match an)5.319 F .319(ywhere in a history line.) +-.15 F .318(This is a non-incremental)5.318 F(search.)144 648 Q F1 +(yank\255nth\255ar)108 660 Q 2.5(g\()-.1 G<4dad43ad7929>-2.5 E F0 .622 +(Insert the \214rst ar)144 672 R .622(gument to the pre)-.18 F .622 +(vious command \(usually the second w)-.25 F .622(ord on the pre)-.1 F +.622(vious line\))-.25 F .773(at point.)144 684 R -.4(Wi)5.773 G .773 +(th an ar).4 F(gument)-.18 E F2(n)3.633 E F0 3.273(,i).24 G .773 +(nsert the)-3.273 F F2(n)3.273 E F0 .773(th w)B .773(ord from the pre) +-.1 F .773(vious command \(the w)-.25 F .773(ords in the)-.1 F(pre)144 +696 Q .291(vious command be)-.25 F .291(gin with w)-.15 F .291(ord 0\).) +-.1 F 2.791(An)5.291 G -2.25 -.15(eg a)-2.791 H(ti).15 E .591 -.15(ve a) +-.25 H -.18(rg).15 G .291(ument inserts the).18 F F2(n)2.791 E F0 .291 +(th w)B .292(ord from the end of)-.1 F .282(the pre)144 708 R .282 +(vious command.)-.25 F .282(Once the ar)5.282 F(gument)-.18 E F2(n)2.781 +E F0 .281(is computed, the ar)2.781 F .281(gument is e)-.18 F .281 +(xtracted as if the "!)-.15 F F2(n)A F0(")A(history e)144 720 Q +(xpansion had been speci\214ed.)-.15 E(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(9)190.115 E 0 Cg EP +%%Page: 10 10 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF +(yank\255last\255ar)108 84 Q 2.5(g\()-.1 G -1.667(M\255. ,)-2.5 F -1.667 +(M\255_ \))2.5 F F0 1.307(Insert the last ar)144 96 R 1.307 +(gument to the pre)-.18 F 1.307(vious command \(the last w)-.25 F 1.308 +(ord of the pre)-.1 F 1.308(vious history entry\).)-.25 F -.4(Wi)144 108 +S .204(th a numeric ar).4 F .204(gument, beha)-.18 F .504 -.15(ve ex)-.2 +H .204(actly lik).15 F(e)-.1 E F1(yank\255nth\255ar)2.704 E(g)-.1 E F0 +5.203(.S)C(uccessi)-5.203 E .503 -.15(ve c)-.25 H .203(alls to).15 F F1 +(yank\255last\255ar)2.703 E(g)-.1 E F0(mo)144 120 Q .806 -.15(ve b)-.15 +H .507(ack through the history list, inserting the last w).15 F .507 +(ord \(or the w)-.1 F .507(ord speci\214ed by the ar)-.1 F(gument)-.18 E +.416(to the \214rst call\) of each line in turn.)144 132 R(An)5.416 E +2.916(yn)-.15 G .416(umeric ar)-2.916 F .416 +(gument supplied to these successi)-.18 F .715 -.15(ve c)-.25 H .415 +(alls de-).15 F 1.217(termines the direction to mo)144 144 R 1.518 -.15 +(ve t)-.15 H 1.218(hrough the history).15 F 6.218(.A)-.65 G(ne)-2.5 E +-.05(ga)-.15 G(ti).05 E 1.518 -.15(ve a)-.25 H -.18(rg).15 G 1.218 +(ument switches the direction).18 F .494 +(through the history \(back or forw)144 156 R 2.994(ard\). The)-.1 F +.494(history e)2.994 F .494(xpansion f)-.15 F .494 +(acilities are used to e)-.1 F .494(xtract the last)-.15 F(ar)144 168 Q +(gument, as if the "!$" history e)-.18 E(xpansion had been speci\214ed.) +-.15 E F1(Commands f)87 184.8 Q(or Changing T)-.25 E(ext)-.92 E/F2 10 +/Times-Italic@0 SF(end\255of\255\214le)108 196.8 Q F1 +(\(usually C\255d\))2.5 E F0 .798 +(The character indicating end-of-\214le as set, for e)144 208.8 R .799 +(xample, by)-.15 F/F3 10/Courier@0 SF(stty)3.299 E F0 5.799(.I)C 3.299 +(ft)-5.799 G .799(his character is read when)-3.299 F .167 +(there are no characters on the line, and point is at the be)144 220.8 R +.167(ginning of the line, readline interprets it as)-.15 F +(the end of input and returns)144 232.8 Q/F4 9/Times-Bold@0 SF(EOF)2.5 E +/F5 9/Times-Roman@0 SF(.)A F1(delete\255char \(C\255d\))108 244.8 Q F0 +.441(Delete the character at point.)144 256.8 R .442 +(If this function is bound to the same character as the tty)5.441 F F1 +(EOF)2.942 E F0(char)2.942 E(-)-.2 E(acter)144 268.8 Q 2.5(,a)-.4 G(s) +-2.5 E F1(C\255d)2.5 E F0(commonly is, see abo)2.5 E .3 -.15(ve f)-.15 H +(or the ef).15 E(fects.)-.25 E F1(backward\255delete\255char \(Rubout\)) +108 280.8 Q F0 .553(Delete the character behind the cursor)144 292.8 R +5.553(.W)-.55 G .553(hen gi)-5.553 F -.15(ve)-.25 G 3.053(nan).15 G .553 +(umeric ar)-3.053 F .552(gument, sa)-.18 F .852 -.15(ve t)-.2 H .552 +(he deleted te).15 F .552(xt on)-.15 F(the kill ring.)144 304.8 Q F1 +-.25(fo)108 316.8 S(rward\255backward\255delete\255char).25 E F0 .473 +(Delete the character under the cursor)144 328.8 R 2.973(,u)-.4 G .474 +(nless the cursor is at the end of the line, in which case the)-2.973 F +(character behind the cursor is deleted.)144 340.8 Q F1 +(quoted\255insert \(C\255q, C\255v\))108 352.8 Q F0 1.229(Add the ne)144 +364.8 R 1.228(xt character that you type to the line v)-.15 F 3.728 +(erbatim. This)-.15 F 1.228(is ho)3.728 F 3.728(wt)-.25 G 3.728(oi) +-3.728 G 1.228(nsert characters lik)-3.728 F(e)-.1 E F1(C\255q)144 376.8 +Q F0 2.5(,f)C(or e)-2.5 E(xample.)-.15 E F1(tab\255insert \(M-T)108 +388.8 Q(AB\))-.9 E F0(Insert a tab character)144 400.8 Q(.)-.55 E F1 +(self\255insert \(a, b, A, 1, !, ...\))108 412.8 Q F0 +(Insert the character typed.)144 424.8 Q F1 +(transpose\255chars \(C\255t\))108 436.8 Q F0 .321 +(Drag the character before point forw)144 448.8 R .321(ard o)-.1 F -.15 +(ve)-.15 G 2.821(rt).15 G .321(he character at point, mo)-2.821 F .322 +(ving point forw)-.15 F .322(ard as well.)-.1 F .372 +(If point is at the end of the line, then this transposes the tw)144 +460.8 R 2.872(oc)-.1 G .372(haracters before point.)-2.872 F(Ne)5.372 E +-.05(ga)-.15 G(ti).05 E .672 -.15(ve a)-.25 H -.2(r-).15 G(guments ha) +144 472.8 Q .3 -.15(ve n)-.2 H 2.5(oe).15 G -.25(ff)-2.5 G(ect.).25 E F1 +(transpose\255w)108 484.8 Q(ords \(M\255t\))-.1 E F0 .023(Drag the w)144 +496.8 R .023(ord before point past the w)-.1 F .023(ord after point, mo) +-.1 F .023(ving point o)-.15 F -.15(ve)-.15 G 2.524(rt).15 G .024(hat w) +-2.524 F .024(ord as well.)-.1 F .024(If point)5.024 F +(is at the end of the line, this transposes the last tw)144 508.8 Q 2.5 +(ow)-.1 G(ords on the line.)-2.6 E F1(upcase\255w)108 520.8 Q +(ord \(M\255u\))-.1 E F0 1.699(Uppercase the current \(or follo)144 +532.8 R 1.698(wing\) w)-.25 F 4.198(ord. W)-.1 F 1.698(ith a ne)-.4 F +-.05(ga)-.15 G(ti).05 E 1.998 -.15(ve a)-.25 H -.18(rg).15 G 1.698 +(ument, uppercase the pre).18 F(vious)-.25 E -.1(wo)144 544.8 S(rd, b).1 +E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F1(do)108 556.8 Q +(wncase\255w)-.1 E(ord \(M\255l\))-.1 E F0(Lo)144 568.8 Q 1.647 +(wercase the current \(or follo)-.25 F 1.647(wing\) w)-.25 F 4.147 +(ord. W)-.1 F 1.648(ith a ne)-.4 F -.05(ga)-.15 G(ti).05 E 1.948 -.15 +(ve a)-.25 H -.18(rg).15 G 1.648(ument, lo).18 F 1.648(wercase the pre) +-.25 F(vious)-.25 E -.1(wo)144 580.8 S(rd, b).1 E(ut do not mo)-.2 E .3 +-.15(ve p)-.15 H(oint.).15 E F1(capitalize\255w)108 592.8 Q +(ord \(M\255c\))-.1 E F0 1.975(Capitalize the current \(or follo)144 +604.8 R 1.974(wing\) w)-.25 F 4.474(ord. W)-.1 F 1.974(ith a ne)-.4 F +-.05(ga)-.15 G(ti).05 E 2.274 -.15(ve a)-.25 H -.18(rg).15 G 1.974 +(ument, capitalize the pre).18 F(vious)-.25 E -.1(wo)144 616.8 S(rd, b) +.1 E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F1 -.1(ove)108 +628.8 S(rwrite\255mode).1 E F0 -.8(To)144 640.8 S .437(ggle o).8 F -.15 +(ve)-.15 G .437(rwrite mode.).15 F -.4(Wi)5.437 G .437(th an e).4 F .437 +(xplicit positi)-.15 F .738 -.15(ve n)-.25 H .438(umeric ar).15 F .438 +(gument, switches to o)-.18 F -.15(ve)-.15 G .438(rwrite mode.).15 F -.4 +(Wi)144 652.8 S .781(th an e).4 F .781(xplicit non-positi)-.15 F 1.081 +-.15(ve n)-.25 H .781(umeric ar).15 F .781 +(gument, switches to insert mode.)-.18 F .78(This command af)5.781 F +(fects)-.25 E(only)144 664.8 Q F1(emacs)4.394 E F0(mode;)4.394 E F1(vi) +4.394 E F0 1.894(mode does o)4.394 F -.15(ve)-.15 G 1.894(rwrite dif).15 +F(ferently)-.25 E 6.894(.E)-.65 G 1.894(ach call to)-6.894 F F2 -.37(re) +4.395 G(adline\(\)).37 E F0 1.895(starts in insert)4.395 F 3.969 +(mode. In)144 676.8 R -.15(ove)3.969 G 1.469 +(rwrite mode, characters bound to).15 F F1(self\255insert)3.969 E F0 +1.468(replace the te)3.969 F 1.468(xt at point rather than)-.15 F .957 +(pushing the te)144 688.8 R .957(xt to the right.)-.15 F .958 +(Characters bound to)5.957 F F1(backward\255delete\255char)3.458 E F0 +.958(replace the character)3.458 F(before point with a space.)144 700.8 +Q(By def)5 E(ault, this command is unbound.)-.1 E(GNU Readline 8.2)72 +768 Q(2022 September 19)120.405 E(10)185.115 E 0 Cg EP +%%Page: 11 11 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF +(Killing and Y)87 84 Q(anking)-.85 E(kill\255line \(C\255k\))108 96 Q F0 +(Kill the te)144 108 Q(xt from point to the end of the line.)-.15 E F1 +(backward\255kill\255line \(C\255x Rubout\))108 120 Q F0(Kill backw)144 +132 Q(ard to the be)-.1 E(ginning of the line.)-.15 E F1 +(unix\255line\255discard \(C\255u\))108 144 Q F0(Kill backw)144 156 Q +(ard from point to the be)-.1 E(ginning of the line.)-.15 E +(The killed te)5 E(xt is sa)-.15 E -.15(ve)-.2 G 2.5(do).15 G 2.5(nt) +-2.5 G(he kill-ring.)-2.5 E F1(kill\255whole\255line)108 168 Q F0 +(Kill all characters on the current line, no matter where point is.)144 +180 Q F1(kill\255w)108 192 Q(ord \(M\255d\))-.1 E F0 1.308 +(Kill from point the end of the current w)144 204 R 1.308 +(ord, or if between w)-.1 F 1.308(ords, to the end of the ne)-.1 F 1.307 +(xt w)-.15 F(ord.)-.1 E -.8(Wo)144 216 S +(rd boundaries are the same as those used by).8 E F1 -.25(fo)2.5 G +(rward\255w).25 E(ord)-.1 E F0(.)A F1(backward\255kill\255w)108 228 Q +(ord \(M\255Rubout\))-.1 E F0(Kill the w)144 240 Q(ord behind point.)-.1 +E -.8(Wo)5 G(rd boundaries are the same as those used by).8 E F1 +(backward\255w)2.5 E(ord)-.1 E F0(.)A F1(unix\255w)108 252 Q +(ord\255rubout \(C\255w\))-.1 E F0 .364(Kill the w)144 264 R .364 +(ord behind point, using white space as a w)-.1 F .365(ord boundary)-.1 +F 5.365(.T)-.65 G .365(he killed te)-5.365 F .365(xt is sa)-.15 F -.15 +(ve)-.2 G 2.865(do).15 G 2.865(nt)-2.865 G(he)-2.865 E(kill-ring.)144 +276 Q F1(unix\255\214lename\255rubout)108 288 Q F0 .167(Kill the w)144 +300 R .166 +(ord behind point, using white space and the slash character as the w) +-.1 F .166(ord boundaries.)-.1 F(The)5.166 E(killed te)144 312 Q +(xt is sa)-.15 E -.15(ve)-.2 G 2.5(do).15 G 2.5(nt)-2.5 G(he kill-ring.) +-2.5 E F1(delete\255horizontal\255space \(M\255\\\))108 324 Q F0 +(Delete all spaces and tabs around point.)144 336 Q F1(kill\255r)108 348 +Q(egion)-.18 E F0 .301(Kill the te)144 360 R .301 +(xt between the point and)-.15 F/F2 10/Times-Italic@0 SF(mark)2.801 E F0 +(\(sa)2.801 E -.15(ve)-.2 G 2.801(dc).15 G .301(ursor position\).)-2.801 +F .301(This te)5.301 F .301(xt is referred to as the)-.15 F F2 -.37(re) +2.802 G(-).37 E(gion)144 372 Q F0(.)A F1(copy\255r)108 384 Q +(egion\255as\255kill)-.18 E F0(Cop)144 396 Q 2.5(yt)-.1 G(he te)-2.5 E +(xt in the re)-.15 E(gion to the kill b)-.15 E(uf)-.2 E(fer)-.25 E(.) +-.55 E F1(copy\255backward\255w)108 408 Q(ord)-.1 E F0(Cop)144 420 Q +4.801(yt)-.1 G 2.301(he w)-4.801 F 2.301(ord before point to the kill b) +-.1 F(uf)-.2 E(fer)-.25 E 7.301(.T)-.55 G 2.301(he w)-7.301 F 2.3 +(ord boundaries are the same as)-.1 F F1(back-)4.8 E(ward\255w)144 432 Q +(ord)-.1 E F0(.)A F1(copy\255f)108 444 Q(orward\255w)-.25 E(ord)-.1 E F0 +(Cop)144 456 Q 4.507(yt)-.1 G 2.007(he w)-4.507 F 2.007(ord follo)-.1 F +2.007(wing point to the kill b)-.25 F(uf)-.2 E(fer)-.25 E 7.008(.T)-.55 +G 2.008(he w)-7.008 F 2.008(ord boundaries are the same as)-.1 F F1 -.25 +(fo)4.508 G -.37(r-).25 G(ward\255w)144 468 Q(ord)-.1 E F0(.)A F1 +(yank \(C\255y\))108 480 Q F0 -1(Ya)144 492 S +(nk the top of the kill ring into the b)1 E(uf)-.2 E(fer at point.)-.25 +E F1(yank\255pop \(M\255y\))108 504 Q F0 +(Rotate the kill ring, and yank the ne)144 516 Q 2.5(wt)-.25 G 2.5 +(op. Only)-2.5 F -.1(wo)2.5 G(rks follo).1 E(wing)-.25 E F1(yank)2.5 E +F0(or)2.5 E F1(yank\255pop)2.5 E F0(.)A F1(Numeric Ar)87 532.8 Q +(guments)-.1 E(digit\255ar)108 544.8 Q +(gument \(M\2550, M\2551, ..., M\255\255\))-.1 E F0 .367 +(Add this digit to the ar)144 556.8 R .367 +(gument already accumulating, or start a ne)-.18 F 2.867(wa)-.25 G -.18 +(rg)-2.867 G 2.867(ument. M\255\255).18 F .366(starts a ne)2.867 F -.05 +(ga)-.15 G(-).05 E(ti)144 568.8 Q .3 -.15(ve a)-.25 H -.18(rg).15 G +(ument.).18 E F1(uni)108 580.8 Q -.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1 +E F0 .778(This is another w)144 592.8 R .779(ay to specify an ar)-.1 F +3.279(gument. If)-.18 F .779(this command is follo)3.279 F .779 +(wed by one or more digits,)-.25 F 1.376 +(optionally with a leading minus sign, those digits de\214ne the ar)144 +604.8 R 3.876(gument. If)-.18 F 1.376(the command is fol-)3.876 F(lo)144 +616.8 Q 1.17(wed by digits, e)-.25 F -.15(xe)-.15 G(cuting).15 E F1(uni) +3.67 E -.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1 E F0(ag)3.67 E 1.17 +(ain ends the numeric ar)-.05 F 1.17(gument, b)-.18 F 1.17(ut is other) +-.2 F(-)-.2 E .899(wise ignored.)144 628.8 R .898 +(As a special case, if this command is immediately follo)5.899 F .898 +(wed by a character that is)-.25 F .243 +(neither a digit or minus sign, the ar)144 640.8 R .243 +(gument count for the ne)-.18 F .243(xt command is multiplied by four) +-.15 F 5.243(.T)-.55 G(he)-5.243 E(ar)144 652.8 Q .378 +(gument count is initially one, so e)-.18 F -.15(xe)-.15 G .378 +(cuting this function the \214rst time mak).15 F .378(es the ar)-.1 F +.378(gument count)-.18 F(four)144 664.8 Q 2.5(,as)-.4 G(econd time mak) +-2.5 E(es the ar)-.1 E(gument count sixteen, and so on.)-.18 E F1 +(Completing)87 681.6 Q(complete \(T)108 693.6 Q(AB\))-.9 E F0 .681 +(Attempt to perform completion on the te)144 705.6 R .681 +(xt before point.)-.15 F .682(The actual completion performed is ap-) +5.682 F(plication-speci\214c.)144 717.6 Q F1(Bash)6.244 E F0 3.744(,f)C +1.244(or instance, attempts completion treating the te)-3.744 F 1.244 +(xt as a v)-.15 F 1.243(ariable \(if the)-.25 F(te)144 729.6 Q .656 +(xt be)-.15 F .656(gins with)-.15 F F1($)3.156 E F0 .656 +(\), username \(if the te)B .656(xt be)-.15 F .656(gins with)-.15 F F1 +(~)3.156 E F0 .656(\), hostname \(if the te)B .656(xt be)-.15 F .656 +(gins with)-.15 F F1(@)3.157 E F0 .657(\), or)B(GNU Readline 8.2)72 768 +Q(2022 September 19)120.405 E(11)185.115 E 0 Cg EP +%%Page: 12 12 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E .93 +(command \(including aliases and functions\) in turn.)144 84 R .929 +(If none of these produces a match, \214lename)5.929 F 1.273 +(completion is attempted.)144 96 R/F1 10/Times-Bold@0 SF(Gdb)6.273 E F0 +3.773(,o)C 3.773(nt)-3.773 G 1.273(he other hand, allo)-3.773 F 1.273 +(ws completion of program functions and)-.25 F -.25(va)144 108 S(riable\ +s, and only attempts \214lename completion under certain circumstances.) +.25 E F1(possible\255completions \(M\255?\))108 120 Q F0 .262 +(List the possible completions of the te)144 132 R .262 +(xt before point.)-.15 F .261 +(When displaying completions, readline sets)5.261 F 1.002 +(the number of columns used for display to the v)144 144 R 1.002 +(alue of)-.25 F F1(completion-display-width)3.502 E F0 3.502(,t)C 1.003 +(he v)-3.502 F 1.003(alue of)-.25 F(the en)144 156 Q(vironment v)-.4 E +(ariable)-.25 E/F2 9/Times-Bold@0 SF(COLUMNS)2.5 E/F3 9/Times-Roman@0 SF +(,)A F0(or the screen width, in that order)2.25 E(.)-.55 E F1 +(insert\255completions \(M\255*\))108 168 Q F0 .783 +(Insert all completions of the te)144 180 R .783(xt before point that w) +-.15 F .783(ould ha)-.1 F 1.083 -.15(ve b)-.2 H .783(een generated by) +.15 F F1(possible\255com-)3.282 E(pletions)144 192 Q F0(.)A F1 +(menu\255complete)108 204 Q F0 .928(Similar to)144 216 R F1(complete) +3.428 E F0 3.428(,b)C .929(ut replaces the w)-3.628 F .929 +(ord to be completed with a single match from the list of)-.1 F 1.194 +(possible completions.)144 228 R 1.194(Repeated e)6.194 F -.15(xe)-.15 G +1.194(cution of).15 F F1(menu\255complete)3.694 E F0 1.193 +(steps through the list of possible)3.694 F .828 +(completions, inserting each match in turn.)144 240 R .828 +(At the end of the list of completions, the bell is rung)5.828 F .727 +(\(subject to the setting of)144 252 R F1(bell\255style)3.227 E F0 3.227 +(\)a)C .727(nd the original te)-3.227 F .727(xt is restored.)-.15 F .727 +(An ar)5.727 F .727(gument of)-.18 F/F4 10/Times-Italic@0 SF(n)3.227 E +F0(mo)3.227 E -.15(ve)-.15 G(s).15 E F4(n)3.227 E F0 1.73 +(positions forw)144 264 R 1.73(ard in the list of matches; a ne)-.1 F +-.05(ga)-.15 G(ti).05 E 2.03 -.15(ve a)-.25 H -.18(rg).15 G 1.73 +(ument may be used to mo).18 F 2.03 -.15(ve b)-.15 H(ackw).15 E(ard)-.1 +E(through the list.)144 276 Q(This command is intended to be bound to)5 +E F1 -.9(TA)2.5 G(B).9 E F0 2.5(,b)C(ut is unbound by def)-2.7 E(ault.) +-.1 E F1(menu\255complete\255backward)108 288 Q F0 .82(Identical to)144 +300 R F1(menu\255complete)3.32 E F0 3.32(,b)C .82(ut mo)-3.52 F -.15(ve) +-.15 G 3.32(sb).15 G(ackw)-3.32 E .82 +(ard through the list of possible completions, as if)-.1 F F1 +(menu\255complete)144 312 Q F0(had been gi)2.5 E -.15(ve)-.25 G 2.5(nan) +.15 G -2.25 -.15(eg a)-2.5 H(ti).15 E .3 -.15(ve a)-.25 H -.18(rg).15 G +2.5(ument. This).18 F(command is unbound by def)2.5 E(ault.)-.1 E F1 +(delete\255char\255or\255list)108 324 Q F0 .373 +(Deletes the character under the cursor if not at the be)144 336 R .374 +(ginning or end of the line \(lik)-.15 F(e)-.1 E F1(delete-char)2.874 E +F0(\).)A(If at the end of the line, beha)144 348 Q -.15(ve)-.2 G 2.5(si) +.15 G(dentically to)-2.5 E F1(possible-completions)2.5 E F0(.)A F1 -.25 +(Ke)87 364.8 S(yboard Macr).25 E(os)-.18 E(start\255kbd\255macr)108 +376.8 Q 2.5(o\()-.18 G(C\255x \()-2.5 E(\)).833 E F0(Be)144 388.8 Q +(gin sa)-.15 E(ving the characters typed into the current k)-.2 E -.15 +(ey)-.1 G(board macro.).15 E F1(end\255kbd\255macr)108 400.8 Q 2.5(o\() +-.18 G(C\255x \))-2.5 E(\)).833 E F0(Stop sa)144 412.8 Q +(ving the characters typed into the current k)-.2 E -.15(ey)-.1 G +(board macro and store the de\214nition.).15 E F1 +(call\255last\255kbd\255macr)108 424.8 Q 2.5(o\()-.18 G(C\255x e\))-2.5 +E F0(Re-e)144 436.8 Q -.15(xe)-.15 G 1(cute the last k).15 F -.15(ey)-.1 +G .999(board macro de\214ned, by making the characters in the macro app\ +ear as if).15 F(typed at the k)144 448.8 Q -.15(ey)-.1 G(board.).15 E F1 +(print\255last\255kbd\255macr)108 460.8 Q 2.5(o\()-.18 G(\))-2.5 E F0 +(Print the last k)144 472.8 Q -.15(ey)-.1 G +(board macro de\214ned in a format suitable for the).15 E F4(inputr)2.5 +E(c)-.37 E F0(\214le.)2.5 E F1(Miscellaneous)87 489.6 Q -.18(re)108 +501.6 S.18 E(ead\255init\255\214le \(C\255x C\255r\))-.18 E F0 +1.776(Read in the contents of the)144 513.6 R F4(inputr)4.276 E(c)-.37 E +F0 1.777(\214le, and incorporate an)4.276 F 4.277(yb)-.15 G 1.777 +(indings or v)-4.277 F 1.777(ariable assignments)-.25 F(found there.)144 +525.6 Q F1(abort \(C\255g\))108 537.6 Q F0 3.249 +(Abort the current editing command and ring the terminal')144 549.6 R +5.748(sb)-.55 G 3.248(ell \(subject to the setting of)-5.748 F F1 +(bell\255style)144 561.6 Q F0(\).)A F1(do\255lo)108 573.6 Q(wer)-.1 E +(case\255v)-.18 E(ersion \(M\255A, M\255B, M\255)-.1 E F4(x)A F1 2.5(,.) +C(..\))-2.5 E F0 1.738(If the meta\214ed character)144 585.6 R F4(x) +4.238 E F0 1.739 +(is uppercase, run the command that is bound to the corresponding)4.238 +F(meta\214ed lo)144 597.6 Q(wercase character)-.25 E 5(.T)-.55 G +(he beha)-5 E(vior is unde\214ned if)-.2 E F4(x)2.5 E F0(is already lo) +2.5 E(wercase.)-.25 E F1(pr)108 609.6 Q(e\214x\255meta \(ESC\))-.18 E F0 +(Metafy the ne)144 621.6 Q(xt character typed.)-.15 E F2(ESC)5 E F1(f) +2.25 E F0(is equi)2.5 E -.25(va)-.25 G(lent to).25 E F1(Meta\255f)2.5 E +F0(.)A F1(undo \(C\255_, C\255x C\255u\))108 633.6 Q F0 +(Incremental undo, separately remembered for each line.)144 645.6 Q F1 +-2.29 -.18(re v)108 657.6 T(ert\255line \(M\255r\)).08 E F0 .231 +(Undo all changes made to this line.)144 669.6 R .231(This is lik)5.231 +F 2.731(ee)-.1 G -.15(xe)-2.881 G .23(cuting the).15 F F1(undo)2.73 E F0 +.23(command enough times to re-)2.73 F +(turn the line to its initial state.)144 681.6 Q F1 +(tilde\255expand \(M\255&\))108 693.6 Q F0(Perform tilde e)144 705.6 Q +(xpansion on the current w)-.15 E(ord.)-.1 E(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(12)185.115 E 0 Cg EP +%%Page: 13 13 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF +(set\255mark \(C\255@, M\255\))108 84 Q F0 +(Set the mark to the point.)144 96 Q(If a numeric ar)5 E +(gument is supplied, the mark is set to that position.)-.18 E F1 +(exchange\255point\255and\255mark \(C\255x C\255x\))108 108 Q F0(Sw)144 +120 Q .282(ap the point with the mark.)-.1 F .283 +(The current cursor position is set to the sa)5.283 F -.15(ve)-.2 G +2.783(dp).15 G .283(osition, and the old)-2.783 F(cursor position is sa) +144 132 Q -.15(ve)-.2 G 2.5(da).15 G 2.5(st)-2.5 G(he mark.)-2.5 E F1 +(character\255sear)108 144 Q(ch \(C\255]\))-.18 E F0 3.112(Ac)144 156 S +.612(haracter is read and point is mo)-3.112 F -.15(ve)-.15 G 3.112(dt) +.15 G 3.112(ot)-3.112 G .612(he ne)-3.112 F .612 +(xt occurrence of that character)-.15 F 5.611(.A)-.55 G(ne)-2.5 E -.05 +(ga)-.15 G(ti).05 E .911 -.15(ve a)-.25 H -.18(rg).15 G(u-).18 E +(ment searches for pre)144 168 Q(vious occurrences.)-.25 E F1 +(character\255sear)108 180 Q(ch\255backward \(M\255C\255]\))-.18 E F0 +2.694(Ac)144 192 S .194(haracter is read and point is mo)-2.694 F -.15 +(ve)-.15 G 2.694(dt).15 G 2.694(ot)-2.694 G .194(he pre)-2.694 F .194 +(vious occurrence of that character)-.25 F 5.194(.A)-.55 G(ne)-2.499 E +-.05(ga)-.15 G(ti).05 E .495 -.15(ve a)-.25 H -.2(r-).15 G +(gument searches for subsequent occurrences.)144 204 Q F1 +(skip\255csi\255sequence)108 216 Q F0 1.827 +(Read enough characters to consume a multi-k)144 228 R 2.126 -.15(ey s) +-.1 H 1.826(equence such as those de\214ned for k).15 F -.15(ey)-.1 G +4.326(sl).15 G(ik)-4.326 E(e)-.1 E .79(Home and End.)144 240 R .791 +(Such sequences be)5.79 F .791 +(gin with a Control Sequence Indicator \(CSI\), usually ESC\255[.)-.15 F +.332(If this sequence is bound to "\\[", k)144 252 R -.15(ey)-.1 G 2.831 +(sp).15 G .331(roducing such sequences will ha)-2.831 F .631 -.15(ve n) +-.2 H 2.831(oe).15 G -.25(ff)-2.831 G .331(ect unless e).25 F(xplic-) +-.15 E .026(itly bound to a readline command, instead of inserting stra\ +y characters into the editing b)144 264 R(uf)-.2 E(fer)-.25 E 5.026(.T) +-.55 G(his)-5.026 E(is unbound by def)144 276 Q(ault, b)-.1 E +(ut usually bound to ESC\255[.)-.2 E F1(insert\255comment \(M\255#\))108 +288 Q F0 -.4(Wi)144 300 S .481(thout a numeric ar).4 F .481 +(gument, the v)-.18 F .481(alue of the readline)-.25 F F1 +(comment\255begin)2.981 E F0 -.25(va)2.981 G .48 +(riable is inserted at the).25 F(be)144 312 Q .244 +(ginning of the current line.)-.15 F .245(If a numeric ar)5.244 F .245 +(gument is supplied, this command acts as a toggle: if)-.18 F .322 +(the characters at the be)144 324 R .321 +(ginning of the line do not match the v)-.15 F .321(alue of)-.25 F F1 +(comment\255begin)2.821 E F0 2.821(,t)C .321(he v)-2.821 F .321(alue is) +-.25 F 1.013(inserted, otherwise the characters in)144 336 R F1 +(comment-begin)3.514 E F0 1.014(are deleted from the be)3.514 F 1.014 +(ginning of the line.)-.15 F 1.469 +(In either case, the line is accepted as if a ne)144 348 R 1.468 +(wline had been typed.)-.25 F 1.468(The def)6.468 F 1.468(ault v)-.1 F +1.468(alue of)-.25 F F1(com-)3.968 E(ment\255begin)144 360 Q F0(mak) +2.982 E .483(es the current line a shell comment.)-.1 F .483 +(If a numeric ar)5.483 F .483(gument causes the comment)-.18 F +(character to be remo)144 372 Q -.15(ve)-.15 G(d, the line will be e).15 +E -.15(xe)-.15 G(cuted by the shell.).15 E F1(dump\255functions)108 384 +Q F0 .627(Print all of the functions and their k)144 396 R .927 -.15 +(ey b)-.1 H .626(indings to the readline output stream.).15 F .626 +(If a numeric ar)5.626 F(gu-)-.18 E +(ment is supplied, the output is formatted in such a w)144 408 Q +(ay that it can be made part of an)-.1 E/F2 10/Times-Italic@0 SF(inputr) +2.5 E(c)-.37 E F0(\214le.)2.5 E F1(dump\255v)108 420 Q(ariables)-.1 E F0 +.283(Print all of the settable v)144 432 R .283(ariables and their v) +-.25 F .283(alues to the readline output stream.)-.25 F .283 +(If a numeric ar)5.283 F(gu-)-.18 E +(ment is supplied, the output is formatted in such a w)144 444 Q +(ay that it can be made part of an)-.1 E F2(inputr)2.5 E(c)-.37 E F0 +(\214le.)2.5 E F1(dump\255macr)108 456 Q(os)-.18 E F0 .593 +(Print all of the readline k)144 468 R .893 -.15(ey s)-.1 H .592 +(equences bound to macros and the strings the).15 F 3.092(yo)-.15 G +3.092(utput. If)-3.092 F 3.092(an)3.092 G(umeric)-3.092 E(ar)144 480 Q +.528(gument is supplied, the output is formatted in such a w)-.18 F .528 +(ay that it can be made part of an)-.1 F F2(inputr)3.028 E(c)-.37 E F0 +(\214le.)144 492 Q F1(emacs\255editing\255mode \(C\255e\))108 504 Q F0 +(When in)144 516 Q F1(vi)2.5 E F0(command mode, this causes a switch to) +2.5 E F1(emacs)2.5 E F0(editing mode.)2.5 E F1 +(vi\255editing\255mode \(M\255C\255j\))108 528 Q F0(When in)144 540 Q F1 +(emacs)2.5 E F0(editing mode, this causes a switch to)2.5 E F1(vi)2.5 E +F0(editing mode.)2.5 E/F3 10.95/Times-Bold@0 SF(DEF)72 556.8 Q -.548(AU) +-.986 G 2.014 -1.007(LT K).548 H(EY BINDINGS)1.007 E F0 .065(The follo) +108 568.8 R .065(wing is a list of the def)-.25 F .065 +(ault emacs and vi bindings.)-.1 F .064 +(Characters with the eighth bit set are written as)5.064 F .527 +(M\255, and are referred to as)108 580.8 R F2(meta\214ed) +3.407 E F0 3.027(characters. The)3.797 F .527 +(printable ASCII characters not mentioned)3.027 F 1.116 +(in the list of emacs standard bindings are bound to the)108 592.8 R F1 +(self\255insert)3.615 E F0 1.115(function, which just inserts the gi) +3.615 F -.15(ve)-.25 G(n).15 E .945(character into the input line.)108 +604.8 R .945(In vi insertion mode, all characters not speci\214cally me\ +ntioned are bound to)5.945 F F1(self\255insert)108 616.8 Q F0 5.338(.C)C +.338(haracters assigned to signal generation by)-5.338 F F2(stty)3.178 E +F0 .337(\(1\) or the terminal dri).32 F -.15(ve)-.25 G 1.137 -.4(r, s) +.15 H .337(uch as C-Z or C-C,).4 F .187(retain that function.)108 628.8 +R .187(Upper and lo)5.187 F .188(wer case meta\214ed characters are bou\ +nd to the same function in the emacs)-.25 F .305(mode meta k)108 640.8 R +-.15(ey)-.1 G 2.805(map. The).15 F .305(remaining characters are unboun\ +d, which causes readline to ring the bell \(subject)2.805 F +(to the setting of the)108 652.8 Q F1(bell\255style)2.5 E F0 -.25(va)2.5 +G(riable\).).25 E F1(Emacs Mode)87 669.6 Q F0(Emacs Standard bindings) +151.2 681.6 Q 2.5("C-@" set-mark)151.2 705.6 R 2.5("C-A" be)151.2 717.6 +R(ginning-of-line)-.15 E 2.5("C-B" backw)151.2 729.6 R(ard-char)-.1 E +(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(13)185.115 E 0 Cg +EP +%%Page: 14 14 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("C-D" delete-char) +151.2 84 R 2.5("C-E" end-of-line)151.2 96 R 2.5("C-F" forw)151.2 108 R +(ard-char)-.1 E 2.5("C-G" abort)151.2 120 R 2.5("C-H" backw)151.2 132 R +(ard-delete-char)-.1 E 2.5("C-I" complete)151.2 144 R 2.5 +("C-J" accept-line)151.2 156 R 2.5("C-K" kill-line)151.2 168 R 2.5 +("C-L" clear)151.2 180 R(-screen)-.2 E 2.5("C-M" accept-line)151.2 192 R +2.5("C-N" ne)151.2 204 R(xt-history)-.15 E 2.5("C-P" pre)151.2 216 R +(vious-history)-.25 E 2.5("C-Q" quoted-insert)151.2 228 R 2.5("C-R" re) +151.2 240 R -.15(ve)-.25 G(rse-search-history).15 E 2.5("C-S" forw)151.2 +252 R(ard-search-history)-.1 E 2.5("C-T" transpose-chars)151.2 264 R 2.5 +("C-U" unix-line-discard)151.2 276 R 2.5("C-V" quoted-insert)151.2 288 R +2.5("C-W" unix-w)151.2 300 R(ord-rubout)-.1 E 2.5("C-Y" yank)151.2 312 R +2.5("C-]" character)151.2 324 R(-search)-.2 E 2.5("C-_" undo)151.2 336 R +3.333("")151.2 348 S(to "/")-.833 E(self-insert)5 E 2.5("0" to)151.2 360 +R 2.5("9" self-insert)2.5 F 2.5(":" to)151.2 372 R 2.5("~" self-insert) +2.5 F 2.5("C-?" backw)151.2 384 R(ard-delete-char)-.1 E +(Emacs Meta bindings)151.2 400.8 Q 2.5("M-C-G" abort)151.2 424.8 R 2.5 +("M-C-H" backw)151.2 436.8 R(ard-kill-w)-.1 E(ord)-.1 E 2.5 +("M-C-I" tab-insert)151.2 448.8 R 2.5("M-C-J" vi-editing-mode)151.2 +460.8 R 2.5("M-C-L" clear)151.2 472.8 R(-display)-.2 E 2.5 +("M-C-M" vi-editing-mode)151.2 484.8 R 2.5("M-C-R" re)151.2 496.8 R -.15 +(ve)-.25 G(rt-line).15 E 2.5("M-C-Y" yank-nth-ar)151.2 508.8 R(g)-.18 E +2.5("M-C-[" complete)151.2 520.8 R 2.5("M-C-]" character)151.2 532.8 R +(-search-backw)-.2 E(ard)-.1 E 2.5("M-space" set-mark)151.2 544.8 R 2.5 +("M-#" insert-comment)151.2 556.8 R 2.5("M-&" tilde-e)151.2 568.8 R +(xpand)-.15 E 2.5("M-*" insert-completions)151.2 580.8 R 2.5 +("M--" digit-ar)151.2 592.8 R(gument)-.18 E 2.5("M-." yank-last-ar)151.2 +604.8 R(g)-.18 E 2.5("M-0" digit-ar)151.2 616.8 R(gument)-.18 E 2.5 +("M-1" digit-ar)151.2 628.8 R(gument)-.18 E 2.5("M-2" digit-ar)151.2 +640.8 R(gument)-.18 E 2.5("M-3" digit-ar)151.2 652.8 R(gument)-.18 E 2.5 +("M-4" digit-ar)151.2 664.8 R(gument)-.18 E 2.5("M-5" digit-ar)151.2 +676.8 R(gument)-.18 E 2.5("M-6" digit-ar)151.2 688.8 R(gument)-.18 E 2.5 +("M-7" digit-ar)151.2 700.8 R(gument)-.18 E 2.5("M-8" digit-ar)151.2 +712.8 R(gument)-.18 E 2.5("M-9" digit-ar)151.2 724.8 R(gument)-.18 E +(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(14)185.115 E 0 Cg +EP +%%Page: 15 15 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("M-<" be)151.2 84 R +(ginning-of-history)-.15 E 2.5("M-=" possible-completions)151.2 96 R 2.5 +("M->" end-of-history)151.2 108 R 2.5("M-?" possible-completions)151.2 +120 R 2.5("M-B" backw)151.2 132 R(ard-w)-.1 E(ord)-.1 E 2.5 +("M-C" capitalize-w)151.2 144 R(ord)-.1 E 2.5("M-D" kill-w)151.2 156 R +(ord)-.1 E 2.5("M-F" forw)151.2 168 R(ard-w)-.1 E(ord)-.1 E 2.5 +("M-L" do)151.2 180 R(wncase-w)-.25 E(ord)-.1 E 2.5 +("M-N" non-incremental-forw)151.2 192 R(ard-search-history)-.1 E 2.5 +("M-P" non-incremental-re)151.2 204 R -.15(ve)-.25 G(rse-search-history) +.15 E 2.5("M-R" re)151.2 216 R -.15(ve)-.25 G(rt-line).15 E 2.5 +("M-T" transpose-w)151.2 228 R(ords)-.1 E 2.5("M-U" upcase-w)151.2 240 R +(ord)-.1 E 2.5("M-Y" yank-pop)151.2 252 R 2.5 +("M-\\" delete-horizontal-space)151.2 264 R 2.5("M-~" tilde-e)151.2 276 +R(xpand)-.15 E 2.5("M-C-?" backw)151.2 288 R(ard-kill-w)-.1 E(ord)-.1 E +2.5("M-_" yank-last-ar)151.2 300 R(g)-.18 E(Emacs Control-X bindings) +151.2 316.8 Q 2.5("C-XC-G" abort)151.2 340.8 R 2.5 +("C-XC-R" re-read-init-\214le)151.2 352.8 R 2.5("C-XC-U" undo)151.2 +364.8 R 2.5("C-XC-X" e)151.2 376.8 R(xchange-point-and-mark)-.15 E 2.5 +("C-X\(" start-kbd-macro)151.2 388.8 R 2.5("C-X\)" end-kbd-macro)151.2 +400.8 R 2.5("C-XE" call-last-kbd-macro)151.2 412.8 R 2.5("C-XC-?" backw) +151.2 424.8 R(ard-kill-line)-.1 E/F1 10/Times-Bold@0 SF +(VI Mode bindings)87 453.6 Q F0(VI Insert Mode functions)151.2 465.6 Q +2.5("C-D" vi-eof-maybe)151.2 489.6 R 2.5("C-H" backw)151.2 501.6 R +(ard-delete-char)-.1 E 2.5("C-I" complete)151.2 513.6 R 2.5 +("C-J" accept-line)151.2 525.6 R 2.5("C-M" accept-line)151.2 537.6 R 2.5 +("C-R" re)151.2 549.6 R -.15(ve)-.25 G(rse-search-history).15 E 2.5 +("C-S" forw)151.2 561.6 R(ard-search-history)-.1 E 2.5 +("C-T" transpose-chars)151.2 573.6 R 2.5("C-U" unix-line-discard)151.2 +585.6 R 2.5("C-V" quoted-insert)151.2 597.6 R 2.5("C-W" unix-w)151.2 +609.6 R(ord-rubout)-.1 E 2.5("C-Y" yank)151.2 621.6 R 2.5("C-[" vi-mo) +151.2 633.6 R -.15(ve)-.15 G(ment-mode).15 E 2.5("C-_" undo)151.2 645.6 +R 3.333("")151.2 657.6 S(to "~")-.833 E(self-insert)5 E 2.5("C-?" backw) +151.2 669.6 R(ard-delete-char)-.1 E(VI Command Mode functions)151.2 +686.4 Q 2.5("C-D" vi-eof-maybe)151.2 710.4 R 2.5 +("C-E" emacs-editing-mode)151.2 722.4 R(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(15)185.115 E 0 Cg EP +%%Page: 16 16 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("C-G" abort)151.2 84 +R 2.5("C-H" backw)151.2 96 R(ard-char)-.1 E 2.5("C-J" accept-line)151.2 +108 R 2.5("C-K" kill-line)151.2 120 R 2.5("C-L" clear)151.2 132 R +(-screen)-.2 E 2.5("C-M" accept-line)151.2 144 R 2.5("C-N" ne)151.2 156 +R(xt-history)-.15 E 2.5("C-P" pre)151.2 168 R(vious-history)-.25 E 2.5 +("C-Q" quoted-insert)151.2 180 R 2.5("C-R" re)151.2 192 R -.15(ve)-.25 G +(rse-search-history).15 E 2.5("C-S" forw)151.2 204 R(ard-search-history) +-.1 E 2.5("C-T" transpose-chars)151.2 216 R 2.5("C-U" unix-line-discard) +151.2 228 R 2.5("C-V" quoted-insert)151.2 240 R 2.5("C-W" unix-w)151.2 +252 R(ord-rubout)-.1 E 2.5("C-Y" yank)151.2 264 R 2.5("C-_" vi-undo) +151.2 276 R -4.166 3.333("" f)151.2 288 T(orw)-3.333 E(ard-char)-.1 E +2.5("#" insert-comment)151.2 300 R 2.5("$" end-of-line)151.2 312 R 2.5 +("%" vi-match)151.2 324 R 2.5("&" vi-tilde-e)151.2 336 R(xpand)-.15 E +2.5("*" vi-complete)151.2 348 R 2.5("+" ne)151.2 360 R(xt-history)-.15 E +2.5("," vi-char)151.2 372 R(-search)-.2 E 2.5("-" pre)151.2 384 R +(vious-history)-.25 E 2.5("." vi-redo)151.2 396 R 2.5("/" vi-search) +151.2 408 R 2.5("0" be)151.2 420 R(ginning-of-line)-.15 E("1" to "9") +151.2 432 Q(vi-ar)5 E(g-digit)-.18 E 2.5(";" vi-char)151.2 444 R +(-search)-.2 E 2.5("=" vi-complete)151.2 456 R 2.5("?" vi-search)151.2 +468 R 2.5("A" vi-append-eol)151.2 480 R 2.5("B" vi-pre)151.2 492 R(v-w) +-.25 E(ord)-.1 E 2.5("C" vi-change-to)151.2 504 R 2.5("D" vi-delete-to) +151.2 516 R 2.5("E" vi-end-w)151.2 528 R(ord)-.1 E 2.5("F" vi-char)151.2 +540 R(-search)-.2 E 2.5("G" vi-fetch-history)151.2 552 R 2.5 +("I" vi-insert-be)151.2 564 R(g)-.15 E 2.5("N" vi-search-ag)151.2 576 R +(ain)-.05 E 2.5("P" vi-put)151.2 588 R 2.5("R" vi-replace)151.2 600 R +2.5("S" vi-subst)151.2 612 R 2.5("T" vi-char)151.2 624 R(-search)-.2 E +2.5("U" re)151.2 636 R -.15(ve)-.25 G(rt-line).15 E 2.5("W" vi-ne)151.2 +648 R(xt-w)-.15 E(ord)-.1 E 2.5("X" backw)151.2 660 R(ard-delete-char) +-.1 E 2.5("Y" vi-yank-to)151.2 672 R 2.5("\\" vi-complete)151.2 684 R +2.5("^" vi-\214rst-print)151.2 696 R 2.5("_" vi-yank-ar)151.2 708 R(g) +-.18 E 2.5("`" vi-goto-mark)151.2 720 R(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(16)185.115 E 0 Cg EP +%%Page: 17 17 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R +(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("a" vi-append-mode) +151.2 84 R 2.5("b" vi-pre)151.2 96 R(v-w)-.25 E(ord)-.1 E 2.5 +("c" vi-change-to)151.2 108 R 2.5("d" vi-delete-to)151.2 120 R 2.5 +("e" vi-end-w)151.2 132 R(ord)-.1 E 2.5("f" vi-char)151.2 144 R(-search) +-.2 E 2.5("h" backw)151.2 156 R(ard-char)-.1 E 2.5 +("i" vi-insertion-mode)151.2 168 R 2.5("j" ne)151.2 180 R(xt-history) +-.15 E 2.5("k" pre)151.2 192 R(v-history)-.25 E 2.5("l" forw)151.2 204 R +(ard-char)-.1 E 2.5("m" vi-set-mark)151.2 216 R 2.5("n" vi-search-ag) +151.2 228 R(ain)-.05 E 2.5("p" vi-put)151.2 240 R 2.5 +("r" vi-change-char)151.2 252 R 2.5("s" vi-subst)151.2 264 R 2.5 +("t" vi-char)151.2 276 R(-search)-.2 E 2.5("u" vi-undo)151.2 288 R 2.5 +("w" vi-ne)151.2 300 R(xt-w)-.15 E(ord)-.1 E 2.5("x" vi-delete)151.2 312 +R 2.5("y" vi-yank-to)151.2 324 R 2.5("|" vi-column)151.2 336 R 2.5 +("~" vi-change-case)151.2 348 R/F1 10.95/Times-Bold@0 SF(SEE ALSO)72 +364.8 Q/F2 10/Times-Italic@0 SF(The Gnu Readline Libr)108 376.8 Q(ary) +-.15 E F0 2.5(,B)C(rian F)-2.5 E(ox and Chet Rame)-.15 E(y)-.15 E F2 +(The Gnu History Libr)108 388.8 Q(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E +(ox and Chet Rame)-.15 E(y)-.15 E F2(bash)108 400.8 Q F0(\(1\))A F1 +(FILES)72 417.6 Q F2(~/.inputr)109.666 429.6 Q(c)-.37 E F0(Indi)144 +441.6 Q(vidual)-.25 E/F3 10/Times-Bold@0 SF -.18(re)2.5 G(adline).18 E +F0(initialization \214le)2.5 E F1 -.548(AU)72 458.4 S(THORS).548 E F0 +(Brian F)108 470.4 Q(ox, Free Softw)-.15 E(are F)-.1 E(oundation)-.15 E +(bfox@gnu.or)108 482.4 Q(g)-.18 E(Chet Rame)108 499.2 Q 1.3 -.65(y, C) +-.15 H(ase W).65 E(estern Reserv)-.8 E 2.5(eU)-.15 G(ni)-2.5 E -.15(ve) +-.25 G(rsity).15 E(chet.rame)108 511.2 Q(y@case.edu)-.15 E F1 -.11(BU)72 +528 S 2.738(GR).11 G(EPOR)-2.738 E(TS)-.438 E F0 .69(If you \214nd a b) +108 540 R .69(ug in)-.2 F F3 -.18(re)3.19 G(adline,).18 E F0 .69 +(you should report it.)3.19 F .691(But \214rst, you should mak)5.69 F +3.191(es)-.1 G .691(ure that it really is a b)-3.191 F(ug,)-.2 E +(and that it appears in the latest v)108 552 Q(ersion of the)-.15 E F3 +-.18(re)2.5 G(adline).18 E F0(library that you ha)2.5 E -.15(ve)-.2 G(.) +.15 E .705(Once you ha)108 568.8 R 1.005 -.15(ve d)-.2 H .705 +(etermined that a b).15 F .704(ug actually e)-.2 F .704(xists, mail a b) +-.15 F .704(ug report to)-.2 F F2 -.2(bu)3.204 G(g\255r).2 E(eadline) +-.37 E F0(@)A F2(gnu.or)A(g)-.37 E F0 5.704(.I)C 3.204(fy)-5.704 G(ou) +-3.204 E(ha)108 580.8 Q 1.809 -.15(ve a \214)-.2 H 1.509 +(x, you are welcome to mail that as well!).15 F 1.51 +(Suggestions and `philosophical' b)6.51 F 1.51(ug reports may be)-.2 F +(mailed to)108 592.8 Q F2 -.2(bu)2.5 G(g-r).2 E(eadline)-.37 E F0(@)A F2 +(gnu.or)A(g)-.37 E F0(or posted to the Usenet ne)2.5 E(wsgroup)-.25 E F3 +(gnu.bash.b)2.5 E(ug)-.2 E F0(.)A(Comments and b)108 609.6 Q +(ug reports concerning this manual page should be directed to)-.2 E F2 +-.15(ch)2.5 G(et.r).15 E(ame)-.15 E(y@case)-.3 E(.edu)-.15 E F0(.).25 E +F1 -.11(BU)72 626.4 S(GS).11 E F0(It')108 638.4 Q 2.5(st)-.55 G +(oo big and too slo)-2.5 E -.65(w.)-.25 G(GNU Readline 8.2)72 768 Q +(2022 September 19)120.405 E(17)185.115 E 0 Cg EP +%%Trailer +end +%%EOF diff --git a/doc/rlman.texi b/doc/rlman.texi new file mode 100644 index 0000000..d046b87 --- /dev/null +++ b/doc/rlman.texi @@ -0,0 +1,84 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header (This is for running Texinfo on a region.) +@setfilename readline.info +@settitle GNU Readline Library +@include version.texi + +@comment %**end of header (This is for running Texinfo on a region.) +@synindex vr fn + +@copying +This manual describes the GNU Readline Library +(version @value{VERSION}, @value{UPDATED}), a library which aids in the +consistency of user interface across discrete programs which provide +a command line interface. + +Copyright @copyright{} 1988--2022 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled +``GNU Free Documentation License''. + +@end quotation +@end copying + +@dircategory Libraries +@direntry +* Readline: (readline). The GNU readline library API. +@end direntry + +@titlepage +@title GNU Readline Library +@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}. +@subtitle @value{UPDATED-MONTH} +@author Chet Ramey, Case Western Reserve University +@author Brian Fox, Free Software Foundation + +@page +@vskip 0pt plus 1filll +@insertcopying + +@end titlepage + +@contents + +@ifnottex +@node Top +@top GNU Readline Library + +This document describes the GNU Readline Library, a utility which aids +in the consistency of user interface across discrete programs which +provide a command line interface. +The Readline home page is @url{http://www.gnu.org/software/readline/}. + +@menu +* Command Line Editing:: GNU Readline User's Manual. +* Programming with GNU Readline:: GNU Readline Programmer's Manual. +* GNU Free Documentation License:: License for copying this manual. +* Concept Index:: Index of concepts described in this manual. +* Function and Variable Index:: Index of externally visible functions + and variables. +@end menu +@end ifnottex + +@include rluser.texi +@include rltech.texi + +@node GNU Free Documentation License +@appendix GNU Free Documentation License + +@include fdl.texi + +@node Concept Index +@unnumbered Concept Index +@printindex cp + +@node Function and Variable Index +@unnumbered Function and Variable Index +@printindex fn + +@bye diff --git a/doc/rltech.texi b/doc/rltech.texi new file mode 100644 index 0000000..a93f77d --- /dev/null +++ b/doc/rltech.texi @@ -0,0 +1,2815 @@ +@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.) + +@ifinfo +This document describes the GNU Readline Library, a utility for aiding +in the consistency of user interface across discrete programs that need +to provide a command line interface. + +Copyright (C) 1988--2022 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +pare preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). +@end ignore + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation approved +by the Foundation. +@end ifinfo + +@node Programming with GNU Readline +@chapter Programming with GNU Readline + +This chapter describes the interface between the @sc{gnu} Readline Library and +other programs. If you are a programmer, and you wish to include the +features found in @sc{gnu} Readline +such as completion, line editing, and interactive history manipulation +in your own programs, this section is for you. + +@menu +* Basic Behavior:: Using the default behavior of Readline. +* Custom Functions:: Adding your own functions to Readline. +* Readline Variables:: Variables accessible to custom + functions. +* Readline Convenience Functions:: Functions which Readline supplies to + aid in writing your own custom + functions. +* Readline Signal Handling:: How Readline behaves when it receives signals. +* Custom Completers:: Supplanting or supplementing Readline's + completion functions. +@end menu + +@node Basic Behavior +@section Basic Behavior + +Many programs provide a command line interface, such as @code{mail}, +@code{ftp}, and @code{sh}. For such programs, the default behaviour of +Readline is sufficient. This section describes how to use Readline in +the simplest way possible, perhaps to replace calls in your code to +@code{gets()} or @code{fgets()}. + +@findex readline +@cindex readline, function + +The function @code{readline()} prints a prompt @var{prompt} +and then reads and returns a single line of text from the user. +If @var{prompt} is @code{NULL} or the empty string, no prompt is displayed. +The line @code{readline} returns is allocated with @code{malloc()}; +the caller should @code{free()} the line when it has finished with it. +The declaration for @code{readline} in ANSI C is + +@example +@code{char *readline (const char *@var{prompt});} +@end example + +@noindent +So, one might say +@example +@code{char *line = readline ("Enter a line: ");} +@end example +@noindent +in order to read a line of text from the user. +The line returned has the final newline removed, so only the +text remains. + +If @code{readline} encounters an @code{EOF} while reading the line, and the +line is empty at that point, then @code{(char *)NULL} is returned. +Otherwise, the line is ended just as if a newline had been typed. + +Readline performs some expansion on the @var{prompt} before it is +displayed on the screen. See the description of @code{rl_expand_prompt} +(@pxref{Redisplay}) for additional details, especially if @var{prompt} +will contain characters that do not consume physical screen space when +displayed. + +If you want the user to be able to get at the line later, (with +@key{C-p} for example), you must call @code{add_history()} to save the +line away in a @dfn{history} list of such lines. + +@example +@code{add_history (line)}; +@end example + +@noindent +For full details on the GNU History Library, see the associated manual. + +It is preferable to avoid saving empty lines on the history list, since +users rarely have a burning need to reuse a blank line. Here is +a function which usefully replaces the standard @code{gets()} library +function, and has the advantage of no static buffer to overflow: + +@example +/* A static variable for holding the line. */ +static char *line_read = (char *)NULL; + +/* Read a string, and return a pointer to it. + Returns NULL on EOF. */ +char * +rl_gets () +@{ + /* If the buffer has already been allocated, + return the memory to the free pool. */ + if (line_read) + @{ + free (line_read); + line_read = (char *)NULL; + @} + + /* Get a line from the user. */ + line_read = readline (""); + + /* If the line has any text in it, + save it on the history. */ + if (line_read && *line_read) + add_history (line_read); + + return (line_read); +@} +@end example + +This function gives the user the default behaviour of @key{TAB} +completion: completion on file names. If you do not want Readline to +complete on filenames, you can change the binding of the @key{TAB} key +with @code{rl_bind_key()}. + +@example +@code{int rl_bind_key (int @var{key}, rl_command_func_t *@var{function});} +@end example + +@code{rl_bind_key()} takes two arguments: @var{key} is the character that +you want to bind, and @var{function} is the address of the function to +call when @var{key} is pressed. Binding @key{TAB} to @code{rl_insert()} +makes @key{TAB} insert itself. +@code{rl_bind_key()} returns non-zero if @var{key} is not a valid +ASCII character code (between 0 and 255). + +Thus, to disable the default @key{TAB} behavior, the following suffices: +@example +@code{rl_bind_key ('\t', rl_insert);} +@end example + +This code should be executed once at the start of your program; you +might write a function called @code{initialize_readline()} which +performs this and other desired initializations, such as installing +custom completers (@pxref{Custom Completers}). + +@node Custom Functions +@section Custom Functions + +Readline provides many functions for manipulating the text of +the line, but it isn't possible to anticipate the needs of all +programs. This section describes the various functions and variables +defined within the Readline library which allow a user program to add +customized functionality to Readline. + +Before declaring any functions that customize Readline's behavior, or +using any functionality Readline provides in other code, an +application writer should include the file @code{} +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{} should be included before @code{readline.h}. + +@code{readline.h} defines a C preprocessor variable that should +be treated as an integer, @code{RL_READLINE_VERSION}, which may +be used to conditionally compile application code depending on +the installed Readline version. The value is a hexadecimal +encoding of the major and minor version numbers of the library, +of the form 0x@var{MMmm}. @var{MM} is the two-digit major +version number; @var{mm} is the two-digit minor version number. +For Readline 4.2, for example, the value of +@code{RL_READLINE_VERSION} would be @code{0x0402}. + +@menu +* Readline Typedefs:: C declarations to make code readable. +* Function Writing:: Variables and calling conventions. +@end menu + +@node Readline Typedefs +@subsection Readline Typedefs + +For readability, we declare a number of new object types, all pointers +to functions. + +The reason for declaring these new types is to make it easier to write +code describing pointers to C functions with appropriately prototyped +arguments and return values. + +For instance, say we want to declare a variable @var{func} as a pointer +to a function which takes two @code{int} arguments and returns an +@code{int} (this is the type of all of the Readline bindable functions). +Instead of the classic C declaration + +@code{int (*func)();} + +@noindent +or the ANSI-C style declaration + +@code{int (*func)(int, int);} + +@noindent +we may write + +@code{rl_command_func_t *func;} + +The full list of function pointer types available is + +@table @code +@item typedef int rl_command_func_t (int, int); + +@item typedef char *rl_compentry_func_t (const char *, int); + +@item typedef char **rl_completion_func_t (const char *, int, int); + +@item typedef char *rl_quote_func_t (char *, int, char *); + +@item typedef char *rl_dequote_func_t (char *, int); + +@item typedef int rl_compignore_func_t (char **); + +@item typedef void rl_compdisp_func_t (char **, int, int); + +@item typedef int rl_hook_func_t (void); + +@item typedef int rl_getc_func_t (FILE *); + +@item typedef int rl_linebuf_func_t (char *, int); + +@item typedef int rl_intfunc_t (int); +@item #define rl_ivoidfunc_t rl_hook_func_t +@item typedef int rl_icpfunc_t (char *); +@item typedef int rl_icppfunc_t (char **); + +@item typedef void rl_voidfunc_t (void); +@item typedef void rl_vintfunc_t (int); +@item typedef void rl_vcpfunc_t (char *); +@item typedef void rl_vcppfunc_t (char **); + +@end table + +@node Function Writing +@subsection Writing a New Function + +In order to write new functions for Readline, you need to know the +calling conventions for keyboard-invoked functions, and the names of the +variables that describe the current state of the line read so far. + +The calling sequence for a command @code{foo} looks like + +@example +@code{int foo (int count, int key)} +@end example + +@noindent +where @var{count} is the numeric argument (or 1 if defaulted) and +@var{key} is the key that invoked this function. + +It is completely up to the function as to what should be done with the +numeric argument. Some functions use it as a repeat count, some +as a flag, and others to choose alternate behavior (refreshing the current +line as opposed to refreshing the screen, for example). Some choose to +ignore it. In general, if a +function uses the numeric argument as a repeat count, it should be able +to do something useful with both negative and positive arguments. +At the very least, it should be aware that it can be passed a +negative argument. + +A command function should return 0 if its action completes successfully, +and a value greater than zero if some error occurs. +This is the convention obeyed by all of the builtin Readline bindable +command functions. + +@node Readline Variables +@section Readline Variables + +These variables are available to function writers. + +@deftypevar {char *} rl_line_buffer +This is the line gathered so far. You are welcome to modify the +contents of the line, but see @ref{Allowing Undoing}. The +function @code{rl_extend_line_buffer} is available to increase +the memory allocated to @code{rl_line_buffer}. +@end deftypevar + +@deftypevar int rl_point +The offset of the current cursor position in @code{rl_line_buffer} +(the @emph{point}). +@end deftypevar + +@deftypevar int rl_end +The number of characters present in @code{rl_line_buffer}. When +@code{rl_point} is at the end of the line, @code{rl_point} and +@code{rl_end} are equal. +@end deftypevar + +@deftypevar int rl_mark +The @var{mark} (saved position) in the current line. If set, the mark +and point define a @emph{region}. +@end deftypevar + +@deftypevar int rl_done +Setting this to a non-zero value causes Readline to return the current +line immediately. +Readline will set this variable when it has read a key sequence bound +to @code{accept-line} and is about to return the line to the caller. +@end deftypevar + +@deftypevar int rl_eof_found +Readline will set this variable when it has read an EOF character (e.g., the +stty @samp{EOF} character) on an empty line or encountered a read error and +is about to return a NULL line to the caller. +@end deftypevar + +@deftypevar int rl_num_chars_to_read +Setting this to a positive value before calling @code{readline()} causes +Readline to return after accepting that many characters, rather +than reading up to a character bound to @code{accept-line}. +@end deftypevar + +@deftypevar int rl_pending_input +Setting this to a value makes it the next keystroke read. This is a +way to stuff a single character into the input stream. +@end deftypevar + +@deftypevar int rl_dispatching +Set to a non-zero value if a function is being called from a key binding; +zero otherwise. Application functions can test this to discover whether +they were called directly or by Readline's dispatching mechanism. +@end deftypevar + +@deftypevar int rl_erase_empty_line +Setting this to a non-zero value causes Readline to completely erase +the current line, including any prompt, any time a newline is typed as +the only character on an otherwise-empty line. The cursor is moved to +the beginning of the newly-blank line. +@end deftypevar + +@deftypevar {char *} rl_prompt +The prompt Readline uses. This is set from the argument to +@code{readline()}, and should not be assigned to directly. +The @code{rl_set_prompt()} function (@pxref{Redisplay}) may +be used to modify the prompt string after calling @code{readline()}. +@end deftypevar + +@deftypevar {char *} rl_display_prompt +The string displayed as the prompt. This is usually identical to +@var{rl_prompt}, but may be changed temporarily by functions that +use the prompt string as a message area, such as incremental search. +@end deftypevar + +@deftypevar int rl_already_prompted +If an application wishes to display the prompt itself, rather than have +Readline do it the first time @code{readline()} is called, it should set +this variable to a non-zero value after displaying the prompt. +The prompt must also be passed as the argument to @code{readline()} so +the redisplay functions can update the display properly. +The calling application is responsible for managing the value; Readline +never sets it. +@end deftypevar + +@deftypevar {const char *} rl_library_version +The version number of this revision of the library. +@end deftypevar + +@deftypevar int rl_readline_version +An integer encoding the current version of the library. The encoding is +of the form 0x@var{MMmm}, where @var{MM} is the two-digit major version +number, and @var{mm} is the two-digit minor version number. +For example, for Readline-4.2, @code{rl_readline_version} would have the +value 0x0402. +@end deftypevar + +@deftypevar {int} rl_gnu_readline_p +Always set to 1, denoting that this is @sc{gnu} Readline rather than some +emulation. +@end deftypevar + +@deftypevar {const char *} rl_terminal_name +The terminal type, used for initialization. If not set by the application, +Readline sets this to the value of the @env{TERM} environment variable +the first time it is called. +@end deftypevar + +@deftypevar {const char *} rl_readline_name +This variable is set to a unique name by each application using Readline. +The value allows conditional parsing of the inputrc file +(@pxref{Conditional Init Constructs}). +@end deftypevar + +@deftypevar {FILE *} rl_instream +The stdio stream from which Readline reads input. +If @code{NULL}, Readline defaults to @var{stdin}. +@end deftypevar + +@deftypevar {FILE *} rl_outstream +The stdio stream to which Readline performs output. +If @code{NULL}, Readline defaults to @var{stdout}. +@end deftypevar + +@deftypevar int rl_prefer_env_winsize +If non-zero, Readline gives values found in the @env{LINES} and +@env{COLUMNS} environment variables greater precedence than values fetched +from the kernel when computing the screen dimensions. +@end deftypevar + +@deftypevar {rl_command_func_t *} rl_last_func +The address of the last command function Readline executed. May be used to +test whether or not a function is being executed twice in succession, for +example. +@end deftypevar + +@deftypevar {rl_hook_func_t *} rl_startup_hook +If non-zero, this is the address of a function to call just +before @code{readline} prints the first prompt. +@end deftypevar + +@deftypevar {rl_hook_func_t *} rl_pre_input_hook +If non-zero, this is the address of a function to call after +the first prompt has been printed and just before @code{readline} +starts reading input characters. +@end deftypevar + +@deftypevar {rl_hook_func_t *} rl_event_hook +If non-zero, this is the address of a function to call periodically +when Readline is waiting for terminal input. +By default, this will be called at most ten times a second if there +is no keyboard input. +@end deftypevar + +@deftypevar {rl_getc_func_t *} rl_getc_function +If non-zero, Readline will call indirectly through this pointer +to get a character from the input stream. By default, it is set to +@code{rl_getc}, the default Readline character input function +(@pxref{Character Input}). +In general, an application that sets @var{rl_getc_function} should consider +setting @var{rl_input_available_hook} as well. +@end deftypevar + +@deftypevar {rl_hook_func_t *} rl_signal_event_hook +If non-zero, this is the address of a function to call if a read system +call is interrupted when Readline is reading terminal input. +@end deftypevar + +@deftypevar {rl_hook_func_t *} rl_timeout_event_hook +If non-zero, this is the address of a function to call if Readline times +out while reading input. +@end deftypevar + +@deftypevar {rl_hook_func_t *} rl_input_available_hook +If non-zero, Readline will use this function's return value when it needs +to determine whether or not there is available input on the current input +source. +The default hook checks @code{rl_instream}; if an application is using a +different input source, it should set the hook appropriately. +Readline queries for available input when implementing intra-key-sequence +timeouts during input and incremental searches. +This may use an application-specific timeout before returning a value; +Readline uses the value passed to @code{rl_set_keyboard_input_timeout()} +or the value of the user-settable @var{keyseq-timeout} variable. +This is designed for use by applications using Readline's callback interface +(@pxref{Alternate Interface}), which may not use the traditional +@code{read(2)} and file descriptor interface, or other applications using +a different input mechanism. +If an application uses an input mechanism or hook that can potentially exceed +the value of @var{keyseq-timeout}, it should increase the timeout or set +this hook appropriately even when not using the callback interface. +In general, an application that sets @var{rl_getc_function} should consider +setting @var{rl_input_available_hook} as well. +@end deftypevar + +@deftypevar {rl_voidfunc_t *} rl_redisplay_function +If non-zero, Readline will call indirectly through this pointer +to update the display with the current contents of the editing buffer. +By default, it is set to @code{rl_redisplay}, the default Readline +redisplay function (@pxref{Redisplay}). +@end deftypevar + +@deftypevar {rl_vintfunc_t *} rl_prep_term_function +If non-zero, Readline will call indirectly through this pointer +to initialize the terminal. The function takes a single argument, an +@code{int} flag that says whether or not to use eight-bit characters. +By default, this is set to @code{rl_prep_terminal} +(@pxref{Terminal Management}). +@end deftypevar + +@deftypevar {rl_voidfunc_t *} rl_deprep_term_function +If non-zero, Readline will call indirectly through this pointer +to reset the terminal. This function should undo the effects of +@code{rl_prep_term_function}. +By default, this is set to @code{rl_deprep_terminal} +(@pxref{Terminal Management}). +@end deftypevar + +@deftypevar {Keymap} rl_executing_keymap +This variable is set to the keymap (@pxref{Keymaps}) in which the +currently executing Readline function was found. +@end deftypevar + +@deftypevar {Keymap} rl_binding_keymap +This variable is set to the keymap (@pxref{Keymaps}) in which the +last key binding occurred. +@end deftypevar + +@deftypevar {char *} rl_executing_macro +This variable is set to the text of any currently-executing macro. +@end deftypevar + +@deftypevar int rl_executing_key +The key that caused the dispatch to the currently-executing Readline function. +@end deftypevar + +@deftypevar {char *} rl_executing_keyseq +The full key sequence that caused the dispatch to the currently-executing +Readline function. +@end deftypevar + +@deftypevar int rl_key_sequence_length +The number of characters in @var{rl_executing_keyseq}. +@end deftypevar + +@deftypevar {int} rl_readline_state +A variable with bit values that encapsulate the current Readline state. +A bit is set with the @code{RL_SETSTATE} macro, and unset with the +@code{RL_UNSETSTATE} macro. Use the @code{RL_ISSTATE} macro to test +whether a particular state bit is set. Current state bits include: + +@table @code +@item RL_STATE_NONE +Readline has not yet been called, nor has it begun to initialize. +@item RL_STATE_INITIALIZING +Readline is initializing its internal data structures. +@item RL_STATE_INITIALIZED +Readline has completed its initialization. +@item RL_STATE_TERMPREPPED +Readline has modified the terminal modes to do its own input and redisplay. +@item RL_STATE_READCMD +Readline is reading a command from the keyboard. +@item RL_STATE_METANEXT +Readline is reading more input after reading the meta-prefix character. +@item RL_STATE_DISPATCHING +Readline is dispatching to a command. +@item RL_STATE_MOREINPUT +Readline is reading more input while executing an editing command. +@item RL_STATE_ISEARCH +Readline is performing an incremental history search. +@item RL_STATE_NSEARCH +Readline is performing a non-incremental history search. +@item RL_STATE_SEARCH +Readline is searching backward or forward through the history for a string. +@item RL_STATE_NUMERICARG +Readline is reading a numeric argument. +@item RL_STATE_MACROINPUT +Readline is currently getting its input from a previously-defined keyboard +macro. +@item RL_STATE_MACRODEF +Readline is currently reading characters defining a keyboard macro. +@item RL_STATE_OVERWRITE +Readline is in overwrite mode. +@item RL_STATE_COMPLETING +Readline is performing word completion. +@item RL_STATE_SIGHANDLER +Readline is currently executing the readline signal handler. +@item RL_STATE_UNDOING +Readline is performing an undo. +@item RL_STATE_INPUTPENDING +Readline has input pending due to a call to @code{rl_execute_next()}. +@item RL_STATE_TTYCSAVED +Readline has saved the values of the terminal's special characters. +@item RL_STATE_CALLBACK +Readline is currently using the alternate (callback) interface +(@pxref{Alternate Interface}). +@item RL_STATE_VIMOTION +Readline is reading the argument to a vi-mode "motion" command. +@item RL_STATE_MULTIKEY +Readline is reading a multiple-keystroke command. +@item RL_STATE_VICMDONCE +Readline has entered vi command (movement) mode at least one time during +the current call to @code{readline()}. +@item RL_STATE_DONE +Readline has read a key sequence bound to @code{accept-line} +and is about to return the line to the caller. +@item RL_STATE_TIMEOUT +Readline has timed out (it did not receive a line or specified number of +characters before the timeout duration specified by @code{rl_set_timeout} +elapsed) and is returning that status to the caller. +@item RL_STATE_EOF +Readline has read an EOF character (e.g., the stty @samp{EOF} character) +or encountered a read error and is about to return a NULL line to the caller. +@end table + +@end deftypevar + +@deftypevar {int} rl_explicit_arg +Set to a non-zero value if an explicit numeric argument was specified by +the user. Only valid in a bindable command function. +@end deftypevar + +@deftypevar {int} rl_numeric_arg +Set to the value of any numeric argument explicitly specified by the user +before executing the current Readline function. Only valid in a bindable +command function. +@end deftypevar + +@deftypevar {int} rl_editing_mode +Set to a value denoting Readline's current editing mode. A value of +@var{1} means Readline is currently in emacs mode; @var{0} +means that vi mode is active. +@end deftypevar + + +@node Readline Convenience Functions +@section Readline Convenience Functions + +@menu +* Function Naming:: How to give a function you write a name. +* Keymaps:: Making keymaps. +* Binding Keys:: Changing Keymaps. +* Associating Function Names and Bindings:: Translate function names to + key sequences. +* Allowing Undoing:: How to make your functions undoable. +* Redisplay:: Functions to control line display. +* Modifying Text:: Functions to modify @code{rl_line_buffer}. +* Character Input:: Functions to read keyboard input. +* Terminal Management:: Functions to manage terminal settings. +* Utility Functions:: Generally useful functions and hooks. +* Miscellaneous Functions:: Functions that don't fall into any category. +* Alternate Interface:: Using Readline in a `callback' fashion. +* A Readline Example:: An example Readline function. +* Alternate Interface Example:: An example program using the alternate interface. +@end menu + +@node Function Naming +@subsection Naming a Function + +The user can dynamically change the bindings of keys while using +Readline. This is done by representing the function with a descriptive +name. The user is able to type the descriptive name when referring to +the function. Thus, in an init file, one might find + +@example +Meta-Rubout: backward-kill-word +@end example + +This binds the keystroke @key{Meta-Rubout} to the function +@emph{descriptively} named @code{backward-kill-word}. You, as the +programmer, should bind the functions you write to descriptive names as +well. Readline provides a function for doing that: + +@deftypefun int rl_add_defun (const char *name, rl_command_func_t *function, int key) +Add @var{name} to the list of named functions. Make @var{function} be +the function that gets called. If @var{key} is not -1, then bind it to +@var{function} using @code{rl_bind_key()}. +@end deftypefun + +Using this function alone is sufficient for most applications. +It is the recommended way to add a few functions to the default +functions that Readline has built in. +If you need to do something other than adding a function to Readline, +you may need to use the underlying functions described below. + +@node Keymaps +@subsection Selecting a Keymap + +Key bindings take place on a @dfn{keymap}. The keymap is the +association between the keys that the user types and the functions that +get run. You can make your own keymaps, copy existing keymaps, and tell +Readline which keymap to use. + +@deftypefun Keymap rl_make_bare_keymap (void) +Returns a new, empty keymap. The space for the keymap is allocated with +@code{malloc()}; the caller should free it by calling +@code{rl_free_keymap()} when done. +@end deftypefun + +@deftypefun Keymap rl_copy_keymap (Keymap map) +Return a new keymap which is a copy of @var{map}. +@end deftypefun + +@deftypefun Keymap rl_make_keymap (void) +Return a new keymap with the printing characters bound to rl_insert, +the lowercase Meta characters bound to run their equivalents, and +the Meta digits bound to produce numeric arguments. +@end deftypefun + +@deftypefun void rl_discard_keymap (Keymap keymap) +Free the storage associated with the data in @var{keymap}. +The caller should free @var{keymap}. +@end deftypefun + +@deftypefun void rl_free_keymap (Keymap keymap) +Free all storage associated with @var{keymap}. This calls +@code{rl_discard_keymap} to free subordindate keymaps and macros. +@end deftypefun + +@deftypefun int rl_empty_keymap (Keymap keymap) +Return non-zero if there are no keys bound to functions in @var{keymap}; +zero if there are any keys bound. +@end deftypefun + +Readline has several internal keymaps. These functions allow you to +change which keymap is active. + +@deftypefun Keymap rl_get_keymap (void) +Returns the currently active keymap. +@end deftypefun + +@deftypefun void rl_set_keymap (Keymap keymap) +Makes @var{keymap} the currently active keymap. +@end deftypefun + +@deftypefun Keymap rl_get_keymap_by_name (const char *name) +Return the keymap matching @var{name}. @var{name} is one which would +be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}). +@end deftypefun + +@deftypefun {char *} rl_get_keymap_name (Keymap keymap) +Return the name matching @var{keymap}. @var{name} is one which would +be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}). +@end deftypefun + +@deftypefun int rl_set_keymap_name (const char *name, Keymap keymap) +Set the name of @var{keymap}. This name will then be "registered" and +available for use in a @code{set keymap} inputrc directive +@pxref{Readline Init File}). +The @var{name} may not be one of Readline's builtin keymap names; +you may not add a different name for one of Readline's builtin keymaps. +You may replace the name associated with a given keymap by calling this +function more than once with the same @var{keymap} argument. +You may associate a registered @var{name} with a new keymap by calling this +function more than once with the same @var{name} argument. +There is no way to remove a named keymap once the name has been +registered. +Readline will make a copy of @var{name}. +The return value is greater than zero unless @var{name} is one of +Readline's builtin keymap names or @var{keymap} is one of Readline's +builtin keymaps. +@end deftypefun + +@node Binding Keys +@subsection Binding Keys + +Key sequences are associate with functions through the keymap. +Readline has several internal keymaps: @code{emacs_standard_keymap}, +@code{emacs_meta_keymap}, @code{emacs_ctlx_keymap}, +@code{vi_movement_keymap}, and @code{vi_insertion_keymap}. +@code{emacs_standard_keymap} is the default, and the examples in +this manual assume that. + +Since @code{readline()} installs a set of default key bindings the first +time it is called, there is always the danger that a custom binding +installed before the first call to @code{readline()} will be overridden. +An alternate mechanism is to install custom key bindings in an +initialization function assigned to the @code{rl_startup_hook} variable +(@pxref{Readline Variables}). + +These functions manage key bindings. + +@deftypefun int rl_bind_key (int key, rl_command_func_t *function) +Binds @var{key} to @var{function} in the currently active keymap. +Returns non-zero in the case of an invalid @var{key}. +@end deftypefun + +@deftypefun int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map) +Bind @var{key} to @var{function} in @var{map}. +Returns non-zero in the case of an invalid @var{key}. +@end deftypefun + +@deftypefun int rl_bind_key_if_unbound (int key, rl_command_func_t *function) +Binds @var{key} to @var{function} if it is not already bound in the +currently active keymap. +Returns non-zero in the case of an invalid @var{key} or if @var{key} is +already bound. +@end deftypefun + +@deftypefun int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *function, Keymap map) +Binds @var{key} to @var{function} if it is not already bound in @var{map}. +Returns non-zero in the case of an invalid @var{key} or if @var{key} is +already bound. +@end deftypefun + +@deftypefun int rl_unbind_key (int key) +Bind @var{key} to the null function in the currently active keymap. +Returns non-zero in case of error. +@end deftypefun + +@deftypefun int rl_unbind_key_in_map (int key, Keymap map) +Bind @var{key} to the null function in @var{map}. +Returns non-zero in case of error. +@end deftypefun + +@deftypefun int rl_unbind_function_in_map (rl_command_func_t *function, Keymap map) +Unbind all keys that execute @var{function} in @var{map}. +@end deftypefun + +@deftypefun int rl_unbind_command_in_map (const char *command, Keymap map) +Unbind all keys that are bound to @var{command} in @var{map}. +@end deftypefun + +@deftypefun int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function) +Bind the key sequence represented by the string @var{keyseq} to the function +@var{function}, beginning in the current keymap. +This makes new keymaps as necessary. +The return value is non-zero if @var{keyseq} is invalid. +@end deftypefun + +@deftypefun int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) +Bind the key sequence represented by the string @var{keyseq} to the function +@var{function}. This makes new keymaps as necessary. +Initial bindings are performed in @var{map}. +The return value is non-zero if @var{keyseq} is invalid. +@end deftypefun + +@deftypefun int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map) +Equivalent to @code{rl_bind_keyseq_in_map}. +@end deftypefun + +@deftypefun int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *function) +Binds @var{keyseq} to @var{function} if it is not already bound in the +currently active keymap. +Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is +already bound. +@end deftypefun + +@deftypefun int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) +Binds @var{keyseq} to @var{function} if it is not already bound in @var{map}. +Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is +already bound. +@end deftypefun + +@deftypefun int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map) +Bind the key sequence represented by the string @var{keyseq} to the arbitrary +pointer @var{data}. @var{type} says what kind of data is pointed to by +@var{data}; this can be a function (@code{ISFUNC}), a macro +(@code{ISMACR}), or a keymap (@code{ISKMAP}). This makes new keymaps as +necessary. The initial keymap in which to do bindings is @var{map}. +@end deftypefun + +@deftypefun int rl_parse_and_bind (char *line) +Parse @var{line} as if it had been read from the @code{inputrc} file and +perform any key bindings and variable assignments found +(@pxref{Readline Init File}). +@end deftypefun + +@deftypefun int rl_read_init_file (const char *filename) +Read keybindings and variable assignments from @var{filename} +(@pxref{Readline Init File}). +@end deftypefun + +@node Associating Function Names and Bindings +@subsection Associating Function Names and Bindings + +These functions allow you to find out what keys invoke named functions +and the functions invoked by a particular key sequence. You may also +associate a new function name with an arbitrary function. + +@deftypefun {rl_command_func_t *} rl_named_function (const char *name) +Return the function with name @var{name}. +@end deftypefun + +@deftypefun {rl_command_func_t *} rl_function_of_keyseq (const char *keyseq, Keymap map, int *type) +Return the function invoked by @var{keyseq} in keymap @var{map}. +If @var{map} is @code{NULL}, the current keymap is used. If @var{type} is +not @code{NULL}, the type of the object is returned in the @code{int} variable +it points to (one of @code{ISFUNC}, @code{ISKMAP}, or @code{ISMACR}). +It takes a "translated" key sequence and should not be used if the key sequence +can include NUL. +@end deftypefun + +@deftypefun {rl_command_func_t *} rl_function_of_keyseq_len (const char *keyseq, size_t len, Keymap map, int *type) +Return the function invoked by @var{keyseq} of length @var{len} +in keymap @var{map}. Equivalent to @code{rl_function_of_keyseq} with the +addition of the @var{len} parameter. +It takes a "translated" key sequence and should be used if the key sequence +can include NUL. +@end deftypefun + +@deftypefun {int} rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map) +If there is a numeric argument at the beginning of @var{keyseq}, possibly +including digits, return the index of the first character in @var{keyseq} +following the numeric argument. +This can be used to skip over the numeric argument (which is available as +@code{rl_numeric_arg} while traversing the key sequence that invoked the +current command. +@end deftypefun + +@deftypefun {char **} rl_invoking_keyseqs (rl_command_func_t *function) +Return an array of strings representing the key sequences used to +invoke @var{function} in the current keymap. +@end deftypefun + +@deftypefun {char **} rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) +Return an array of strings representing the key sequences used to +invoke @var{function} in the keymap @var{map}. +@end deftypefun + +@deftypefun void rl_function_dumper (int readable) +Print the Readline function names and the key sequences currently +bound to them to @code{rl_outstream}. If @var{readable} is non-zero, +the list is formatted in such a way that it can be made part of an +@code{inputrc} file and re-read. +@end deftypefun + +@deftypefun void rl_list_funmap_names (void) +Print the names of all bindable Readline functions to @code{rl_outstream}. +@end deftypefun + +@deftypefun {const char **} rl_funmap_names (void) +Return a NULL terminated array of known function names. The array is +sorted. The array itself is allocated, but not the strings inside. You +should free the array, but not the pointers, using @code{free} or +@code{rl_free} when you are done. +@end deftypefun + +@deftypefun int rl_add_funmap_entry (const char *name, rl_command_func_t *function) +Add @var{name} to the list of bindable Readline command names, and make +@var{function} the function to be called when @var{name} is invoked. +@end deftypefun + +@node Allowing Undoing +@subsection Allowing Undoing + +Supporting the undo command is a painless thing, and makes your +functions much more useful. It is certainly easy to try +something if you know you can undo it. + +If your function simply inserts text once, or deletes text once, and +uses @code{rl_insert_text()} or @code{rl_delete_text()} to do it, then +undoing is already done for you automatically. + +If you do multiple insertions or multiple deletions, or any combination +of these operations, you should group them together into one operation. +This is done with @code{rl_begin_undo_group()} and +@code{rl_end_undo_group()}. + +The types of events that can be undone are: + +@smallexample +enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @}; +@end smallexample + +Notice that @code{UNDO_DELETE} means to insert some text, and +@code{UNDO_INSERT} means to delete some text. That is, the undo code +tells what to undo, not how to undo it. @code{UNDO_BEGIN} and +@code{UNDO_END} are tags added by @code{rl_begin_undo_group()} and +@code{rl_end_undo_group()}. + +@deftypefun int rl_begin_undo_group (void) +Begins saving undo information in a group construct. The undo +information usually comes from calls to @code{rl_insert_text()} and +@code{rl_delete_text()}, but could be the result of calls to +@code{rl_add_undo()}. +@end deftypefun + +@deftypefun int rl_end_undo_group (void) +Closes the current undo group started with @code{rl_begin_undo_group +()}. There should be one call to @code{rl_end_undo_group()} +for each call to @code{rl_begin_undo_group()}. +@end deftypefun + +@deftypefun void rl_add_undo (enum undo_code what, int start, int end, char *text) +Remember how to undo an event (according to @var{what}). The affected +text runs from @var{start} to @var{end}, and encompasses @var{text}. +@end deftypefun + +@deftypefun void rl_free_undo_list (void) +Free the existing undo list. +@end deftypefun + +@deftypefun int rl_do_undo (void) +Undo the first thing on the undo list. Returns @code{0} if there was +nothing to undo, non-zero if something was undone. +@end deftypefun + +Finally, if you neither insert nor delete text, but directly modify the +existing text (e.g., change its case), call @code{rl_modifying()} +once, just before you modify the text. You must supply the indices of +the text range that you are going to modify. + +@deftypefun int rl_modifying (int start, int end) +Tell Readline to save the text between @var{start} and @var{end} as a +single undo unit. It is assumed that you will subsequently modify +that text. +@end deftypefun + +@node Redisplay +@subsection Redisplay + +@deftypefun void rl_redisplay (void) +Change what's displayed on the screen to reflect the current contents +of @code{rl_line_buffer}. +@end deftypefun + +@deftypefun int rl_forced_update_display (void) +Force the line to be updated and redisplayed, whether or not +Readline thinks the screen display is correct. +@end deftypefun + +@deftypefun int rl_on_new_line (void) +Tell the update functions that we have moved onto a new (empty) line, +usually after outputting a newline. +@end deftypefun + +@deftypefun int rl_on_new_line_with_prompt (void) +Tell the update functions that we have moved onto a new line, with +@var{rl_prompt} already displayed. +This could be used by applications that want to output the prompt string +themselves, but still need Readline to know the prompt string length for +redisplay. +It should be used after setting @var{rl_already_prompted}. +@end deftypefun + +@deftypefun int rl_clear_visible_line (void) +Clear the screen lines corresponding to the current line's contents. +@end deftypefun + +@deftypefun int rl_reset_line_state (void) +Reset the display state to a clean state and redisplay the current line +starting on a new line. +@end deftypefun + +@deftypefun int rl_crlf (void) +Move the cursor to the start of the next screen line. +@end deftypefun + +@deftypefun int rl_show_char (int c) +Display character @var{c} on @code{rl_outstream}. +If Readline has not been set to display meta characters directly, this +will convert meta characters to a meta-prefixed key sequence. +This is intended for use by applications which wish to do their own +redisplay. +@end deftypefun + +@deftypefun int rl_message (const char *, @dots{}) +The arguments are a format string as would be supplied to @code{printf}, +possibly containing conversion specifications such as @samp{%d}, and +any additional arguments necessary to satisfy the conversion specifications. +The resulting string is displayed in the @dfn{echo area}. The echo area +is also used to display numeric arguments and search strings. +You should call @code{rl_save_prompt} to save the prompt information +before calling this function. +@end deftypefun + +@deftypefun int rl_clear_message (void) +Clear the message in the echo area. If the prompt was saved with a call to +@code{rl_save_prompt} before the last call to @code{rl_message}, +call @code{rl_restore_prompt} before calling this function. +@end deftypefun + +@deftypefun void rl_save_prompt (void) +Save the local Readline prompt display state in preparation for +displaying a new message in the message area with @code{rl_message()}. +@end deftypefun + +@deftypefun void rl_restore_prompt (void) +Restore the local Readline prompt display state saved by the most +recent call to @code{rl_save_prompt}. +if @code{rl_save_prompt} was called to save the prompt before a call +to @code{rl_message}, this function should be called before the +corresponding call to @code{rl_clear_message}. +@end deftypefun + +@deftypefun int rl_expand_prompt (char *prompt) +Expand any special character sequences in @var{prompt} and set up the +local Readline prompt redisplay variables. +This function is called by @code{readline()}. It may also be called to +expand the primary prompt if the @code{rl_on_new_line_with_prompt()} +function or @code{rl_already_prompted} variable is used. +It returns the number of visible characters on the last line of the +(possibly multi-line) prompt. +Applications may indicate that the prompt contains characters that take +up no physical screen space when displayed by bracketing a sequence of +such characters with the special markers @code{RL_PROMPT_START_IGNORE} +and @code{RL_PROMPT_END_IGNORE} (declared in @file{readline.h} as +@samp{\001} and @samp{\002}, respectively). +This may be used to embed terminal-specific escape sequences in prompts. +@end deftypefun + +@deftypefun int rl_set_prompt (const char *prompt) +Make Readline use @var{prompt} for subsequent redisplay. This calls +@code{rl_expand_prompt()} to expand the prompt and sets @code{rl_prompt} +to the result. +@end deftypefun + +@node Modifying Text +@subsection Modifying Text + +@deftypefun int rl_insert_text (const char *text) +Insert @var{text} into the line at the current cursor position. +Returns the number of characters inserted. +@end deftypefun + +@deftypefun int rl_delete_text (int start, int end) +Delete the text between @var{start} and @var{end} in the current line. +Returns the number of characters deleted. +@end deftypefun + +@deftypefun {char *} rl_copy_text (int start, int end) +Return a copy of the text between @var{start} and @var{end} in +the current line. +@end deftypefun + +@deftypefun int rl_kill_text (int start, int end) +Copy the text between @var{start} and @var{end} in the current line +to the kill ring, appending or prepending to the last kill if the +last command was a kill command. The text is deleted. +If @var{start} is less than @var{end}, +the text is appended, otherwise prepended. If the last command was +not a kill, a new kill ring slot is used. +@end deftypefun + +@deftypefun int rl_push_macro_input (char *macro) +Cause @var{macro} to be inserted into the line, as if it had been invoked +by a key bound to a macro. Not especially useful; use +@code{rl_insert_text()} instead. +@end deftypefun + +@node Character Input +@subsection Character Input + +@deftypefun int rl_read_key (void) +Return the next character available from Readline's current input stream. +This handles input inserted into +the input stream via @var{rl_pending_input} (@pxref{Readline Variables}) +and @code{rl_stuff_char()}, macros, and characters read from the keyboard. +While waiting for input, this function will call any function assigned to +the @code{rl_event_hook} variable. +@end deftypefun + +@deftypefun int rl_getc (FILE *stream) +Return the next character available from @var{stream}, which is assumed to +be the keyboard. +@end deftypefun + +@deftypefun int rl_stuff_char (int c) +Insert @var{c} into the Readline input stream. It will be "read" +before Readline attempts to read characters from the terminal with +@code{rl_read_key()}. Up to 512 characters may be pushed back. +@code{rl_stuff_char} returns 1 if the character was successfully inserted; +0 otherwise. +@end deftypefun + +@deftypefun int rl_execute_next (int c) +Make @var{c} be the next command to be executed when @code{rl_read_key()} +is called. This sets @var{rl_pending_input}. +@end deftypefun + +@deftypefun int rl_clear_pending_input (void) +Unset @var{rl_pending_input}, effectively negating the effect of any +previous call to @code{rl_execute_next()}. This works only if the +pending input has not already been read with @code{rl_read_key()}. +@end deftypefun + +@deftypefun int rl_set_keyboard_input_timeout (int u) +While waiting for keyboard input in @code{rl_read_key()}, Readline will +wait for @var{u} microseconds for input before calling any function +assigned to @code{rl_event_hook}. @var{u} must be greater than or equal +to zero (a zero-length timeout is equivalent to a poll). +The default waiting period is one-tenth of a second. +Returns the old timeout value. +@end deftypefun + +@deftypefun int rl_set_timeout (unsigned int secs, unsigned int usecs) +Set a timeout for subsequent calls to @code{readline()}. If Readline does +not read a complete line, or the number of characters specified by +@code{rl_num_chars_to_read}, before the duration specified by @var{secs} +(in seconds) and @var{usecs} (microseconds), it returns and sets +@code{RL_STATE_TIMEOUT} in @code{rl_readline_state}. +Passing 0 for @code{secs} and @code{usecs} cancels any previously set +timeout; the convenience macro @code{rl_clear_timeout()} is shorthand +for this. +Returns 0 if the timeout is set successfully. +@end deftypefun + +@deftypefun int rl_timeout_remaining (unsigned int *secs, unsigned int *usecs) +Return the number of seconds and microseconds remaining in the current +timeout duration in @var{*secs} and @var{*usecs}, respectively. +Both @var{*secs} and @var{*usecs} must be non-NULL to return any values. +The return value is -1 on error or when there is no timeout set, +0 when the timeout has expired (leaving @var{*secs} and @var{*usecs} +unchanged), +and 1 if the timeout has not expired. +If either of @var{secs} and @var{usecs} is @code{NULL}, +the return value indicates whether the timeout has expired. +@end deftypefun + +@node Terminal Management +@subsection Terminal Management + +@deftypefun void rl_prep_terminal (int meta_flag) +Modify the terminal settings for Readline's use, so @code{readline()} +can read a single character at a time from the keyboard. +The @var{meta_flag} argument should be non-zero if Readline should +read eight-bit input. +@end deftypefun + +@deftypefun void rl_deprep_terminal (void) +Undo the effects of @code{rl_prep_terminal()}, leaving the terminal in +the state in which it was before the most recent call to +@code{rl_prep_terminal()}. +@end deftypefun + +@deftypefun void rl_tty_set_default_bindings (Keymap kmap) +Read the operating system's terminal editing characters (as would be +displayed by @code{stty}) to their Readline equivalents. +The bindings are performed in @var{kmap}. +@end deftypefun + +@deftypefun void rl_tty_unset_default_bindings (Keymap kmap) +Reset the bindings manipulated by @code{rl_tty_set_default_bindings} so +that the terminal editing characters are bound to @code{rl_insert}. +The bindings are performed in @var{kmap}. +@end deftypefun + +@deftypefun int rl_tty_set_echoing (int value) +Set Readline's idea of whether or not it is echoing output to its output +stream (@var{rl_outstream}). If @var{value} is 0, Readline does not display +output to @var{rl_outstream}; any other value enables output. The initial +value is set when Readline initializes the terminal settings. +This function returns the previous value. +@end deftypefun + +@deftypefun int rl_reset_terminal (const char *terminal_name) +Reinitialize Readline's idea of the terminal settings using +@var{terminal_name} as the terminal type (e.g., @code{vt100}). +If @var{terminal_name} is @code{NULL}, the value of the @code{TERM} +environment variable is used. +@end deftypefun + +@node Utility Functions +@subsection Utility Functions + +@deftypefun int rl_save_state (struct readline_state *sp) +Save a snapshot of Readline's internal state to @var{sp}. +The contents of the @var{readline_state} structure are documented +in @file{readline.h}. +The caller is responsible for allocating the structure. +@end deftypefun + +@deftypefun int rl_restore_state (struct readline_state *sp) +Restore Readline's internal state to that stored in @var{sp}, which must +have been saved by a call to @code{rl_save_state}. +The contents of the @var{readline_state} structure are documented +in @file{readline.h}. +The caller is responsible for freeing the structure. +@end deftypefun + +@deftypefun void rl_free (void *mem) +Deallocate the memory pointed to by @var{mem}. @var{mem} must have been +allocated by @code{malloc}. +@end deftypefun + +@deftypefun void rl_replace_line (const char *text, int clear_undo) +Replace the contents of @code{rl_line_buffer} with @var{text}. +The point and mark are preserved, if possible. +If @var{clear_undo} is non-zero, the undo list associated with the +current line is cleared. +@end deftypefun + +@deftypefun void rl_extend_line_buffer (int len) +Ensure that @code{rl_line_buffer} has enough space to hold @var{len} +characters, possibly reallocating it if necessary. +@end deftypefun + +@deftypefun int rl_initialize (void) +Initialize or re-initialize Readline's internal state. +It's not strictly necessary to call this; @code{readline()} calls it before +reading any input. +@end deftypefun + +@deftypefun int rl_ding (void) +Ring the terminal bell, obeying the setting of @code{bell-style}. +@end deftypefun + +@deftypefun int rl_alphabetic (int c) +Return 1 if @var{c} is an alphabetic character. +@end deftypefun + +@deftypefun void rl_display_match_list (char **matches, int len, int max) +A convenience function for displaying a list of strings in +columnar format on Readline's output stream. @code{matches} is the list +of strings, in argv format, such as a list of completion matches. +@code{len} is the number of strings in @code{matches}, and @code{max} +is the length of the longest string in @code{matches}. This function uses +the setting of @code{print-completions-horizontally} to select how the +matches are displayed (@pxref{Readline Init File Syntax}). +When displaying completions, this function sets the number of columns used +for display to the value of @code{completion-display-width}, the value of +the environment variable @env{COLUMNS}, or the screen width, in that order. +@end deftypefun + +The following are implemented as macros, defined in @code{chardefs.h}. +Applications should refrain from using them. + +@deftypefun int _rl_uppercase_p (int c) +Return 1 if @var{c} is an uppercase alphabetic character. +@end deftypefun + +@deftypefun int _rl_lowercase_p (int c) +Return 1 if @var{c} is a lowercase alphabetic character. +@end deftypefun + +@deftypefun int _rl_digit_p (int c) +Return 1 if @var{c} is a numeric character. +@end deftypefun + +@deftypefun int _rl_to_upper (int c) +If @var{c} is a lowercase alphabetic character, return the corresponding +uppercase character. +@end deftypefun + +@deftypefun int _rl_to_lower (int c) +If @var{c} is an uppercase alphabetic character, return the corresponding +lowercase character. +@end deftypefun + +@deftypefun int _rl_digit_value (int c) +If @var{c} is a number, return the value it represents. +@end deftypefun + +@node Miscellaneous Functions +@subsection Miscellaneous Functions + +@deftypefun int rl_macro_bind (const char *keyseq, const char *macro, Keymap map) +Bind the key sequence @var{keyseq} to invoke the macro @var{macro}. +The binding is performed in @var{map}. When @var{keyseq} is invoked, the +@var{macro} will be inserted into the line. This function is deprecated; +use @code{rl_generic_bind()} instead. +@end deftypefun + +@deftypefun void rl_macro_dumper (int readable) +Print the key sequences bound to macros and their values, using +the current keymap, to @code{rl_outstream}. +If @var{readable} is non-zero, the list is formatted in such a way +that it can be made part of an @code{inputrc} file and re-read. +@end deftypefun + +@deftypefun int rl_variable_bind (const char *variable, const char *value) +Make the Readline variable @var{variable} have @var{value}. +This behaves as if the Readline command +@samp{set @var{variable} @var{value}} had been executed in an @code{inputrc} +file (@pxref{Readline Init File Syntax}). +@end deftypefun + +@deftypefun {char *} rl_variable_value (const char *variable) +Return a string representing the value of the Readline variable @var{variable}. +For boolean variables, this string is either @samp{on} or @samp{off}. +@end deftypefun + +@deftypefun void rl_variable_dumper (int readable) +Print the Readline variable names and their current values +to @code{rl_outstream}. +If @var{readable} is non-zero, the list is formatted in such a way +that it can be made part of an @code{inputrc} file and re-read. +@end deftypefun + +@deftypefun int rl_set_paren_blink_timeout (int u) +Set the time interval (in microseconds) that Readline waits when showing +a balancing character when @code{blink-matching-paren} has been enabled. +@end deftypefun + +@deftypefun {char *} rl_get_termcap (const char *cap) +Retrieve the string value of the termcap capability @var{cap}. +Readline fetches the termcap entry for the current terminal name and +uses those capabilities to move around the screen line and perform other +terminal-specific operations, like erasing a line. Readline does not +use all of a terminal's capabilities, and this function will return +values for only those capabilities Readline uses. +@end deftypefun + +@deftypefun {void} rl_clear_history (void) +Clear the history list by deleting all of the entries, in the same manner +as the History library's @code{clear_history()} function. +This differs from @code{clear_history} because it frees private data +Readline saves in the history list. +@end deftypefun + +@deftypefun {void} rl_activate_mark (void) +Enable an @emph{active} mark. +When this is enabled, the text between point and mark (the @var{region}) is +displayed in the terminal's standout mode (a @var{face}). +This is called by various Readline functions that set the mark and insert +text, and is available for applications to call. +@end deftypefun + +@deftypefun {void} rl_deactivate_mark (void) +Turn off the active mark. +@end deftypefun + +@deftypefun {void} rl_keep_mark_active (void) +Indicate that the mark should remain active when the current Readline +function completes and after redisplay occurs. +In most cases, the mark remains active for only the duration of a single +bindable Readline function. +@end deftypefun + +@deftypefun {int} rl_mark_active_p (void) +Return a non-zero value if the mark is currently active; zero otherwise. +@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 accommodate this need, Readline can +also be invoked as a `callback' function from an event loop. There +are functions available to make this easy. + +@deftypefun void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler) +Set up the terminal for Readline I/O and display the initial +expanded value of @var{prompt}. Save the value of @var{lhandler} to +use as a handler function to call when a complete line of input has been +entered. +The handler function receives the text of the line as an argument. +As with @code{readline()}, the handler function should @code{free} the +line when it it finished with it. +@end deftypefun + +@deftypefun void rl_callback_read_char (void) +Whenever an application determines that keyboard input is available, it +should call @code{rl_callback_read_char()}, which will read the next +character from the current input source. +If that character completes the line, @code{rl_callback_read_char} will +invoke the @var{lhandler} function installed by +@code{rl_callback_handler_install} to process the line. +Before calling the @var{lhandler} function, the terminal settings are +reset to the values they had before calling +@code{rl_callback_handler_install}. +If the @var{lhandler} function returns, +and the line handler remains installed, +the terminal settings are modified for Readline's use again. +@code{EOF} is indicated by calling @var{lhandler} with a +@code{NULL} line. +@end deftypefun + +@deftypefun void rl_callback_sigcleanup (void) +Clean up any internal state the callback interface uses to maintain state +between calls to rl_callback_read_char (e.g., the state of any active +incremental searches). This is intended to be used by applications that +wish to perform their own signal handling; Readline's internal signal handler +calls this when appropriate. +@end deftypefun + +@deftypefun void rl_callback_handler_remove (void) +Restore the terminal to its initial state and remove the line handler. +You may call this function from within a callback as well as independently. +If the @var{lhandler} installed by @code{rl_callback_handler_install} +does not exit the program, either this function or the function referred +to by the value of @code{rl_deprep_term_function} should be called before +the program exits to reset the terminal settings. +@end deftypefun + +@node A Readline Example +@subsection A Readline Example + +Here is a function which changes lowercase characters to their uppercase +equivalents, and uppercase characters to lowercase. If +this function was bound to @samp{M-c}, then typing @samp{M-c} would +change the case of the character under point. Typing @samp{M-1 0 M-c} +would change the case of the following 10 characters, leaving the cursor on +the last character changed. + +@example +/* Invert the case of the COUNT following characters. */ +int +invert_case_line (count, key) + int count, key; +@{ + register int start, end, i; + + start = rl_point; + + if (rl_point >= rl_end) + return (0); + + if (count < 0) + @{ + direction = -1; + count = -count; + @} + else + direction = 1; + + /* Find the end of the range to modify. */ + end = start + (count * direction); + + /* Force it to be within range. */ + if (end > rl_end) + end = rl_end; + else if (end < 0) + end = 0; + + if (start == end) + return (0); + + if (start > end) + @{ + int temp = start; + start = end; + end = temp; + @} + + /* Tell readline that we are modifying the line, + so it will save the undo information. */ + rl_modifying (start, end); + + for (i = start; i != end; i++) + @{ + if (_rl_uppercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]); + else if (_rl_lowercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]); + @} + /* Move point to on top of the last character changed. */ + rl_point = (direction == 1) ? end - 1 : start; + return (0); +@} +@end example + +@node Alternate Interface Example +@subsection Alternate Interface Example + +Here is a complete program that illustrates Readline's alternate interface. +It reads lines from the terminal and displays them, providing the +standard history and TAB completion functions. +It understands the EOF character or "exit" to exit the program. + +@example +/* Standard include files. stdio.h is required. */ +#include +#include +#include +#include + +/* Used for select(2) */ +#include +#include + +#include + +#include + +/* Standard readline include files. */ +#include +#include + +static void cb_linehandler (char *); +static void sighandler (int); + +int running; +int sigwinch_received; +const char *prompt = "rltest$ "; + +/* Handle SIGWINCH and window size changes when readline is not active and + reading a character. */ +static void +sighandler (int sig) +@{ + sigwinch_received = 1; +@} + +/* Callback function called for each line when accept-line executed, EOF + seen, or EOF character read. This sets a flag and returns; it could + also call exit(3). */ +static void +cb_linehandler (char *line) +@{ + /* Can use ^D (stty eof) or `exit' to exit. */ + if (line == NULL || strcmp (line, "exit") == 0) + @{ + if (line == 0) + printf ("\n"); + printf ("exit\n"); + /* This function needs to be called to reset the terminal settings, + and calling it from the line handler keeps one extra prompt from + being displayed. */ + rl_callback_handler_remove (); + + running = 0; + @} + else + @{ + if (*line) + add_history (line); + printf ("input line: %s\n", line); + free (line); + @} +@} + +int +main (int c, char **v) +@{ + fd_set fds; + int r; + + /* Set the default locale values according to environment variables. */ + setlocale (LC_ALL, ""); + + /* Handle window size changes when readline is not active and reading + characters. */ + signal (SIGWINCH, sighandler); + + /* Install the line handler. */ + rl_callback_handler_install (prompt, cb_linehandler); + + /* Enter a simple event loop. This waits until something is available + to read on readline's input stream (defaults to standard input) and + calls the builtin character read callback to read it. It does not + have to modify the user's terminal settings. */ + running = 1; + while (running) + @{ + FD_ZERO (&fds); + FD_SET (fileno (rl_instream), &fds); + + r = select (FD_SETSIZE, &fds, NULL, NULL, NULL); + if (r < 0 && errno != EINTR) + @{ + perror ("rltest: select"); + rl_callback_handler_remove (); + break; + @} + if (sigwinch_received) + @{ + rl_resize_terminal (); + sigwinch_received = 0; + @} + if (r < 0) + continue; + + if (FD_ISSET (fileno (rl_instream), &fds)) + rl_callback_read_char (); + @} + + printf ("rltest: Event loop has exited\n"); + 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 terminal's interrupt key, +or a network connection being broken. There is a class of signals that can +be sent to the process currently reading input from the keyboard. Since +Readline changes the terminal attributes when it is called, it needs to +perform special processing when such a signal is received in order to +restore the terminal to a sane state, or provide application writers with +functions to do so manually. + +Readline contains an internal signal handler that is installed for a +number of signals (@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM}, +@code{SIGHUP}, +@code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}). +When one of these signals is received, the signal handler +will reset the terminal attributes to those that were in effect before +@code{readline()} was called, reset the signal handling to what it was +before @code{readline()} was called, and resend the signal to the calling +application. +If and when the calling application's signal handler returns, Readline +will reinitialize the terminal and continue to accept input. +When a @code{SIGINT} is received, the Readline signal handler performs +some additional work, which will cause any partially-entered line to be +aborted (see the description of @code{rl_free_line_state()} below). + +There is an additional Readline signal handler, for @code{SIGWINCH}, which +the kernel sends to a process whenever the terminal's size changes (for +example, if a user resizes an @code{xterm}). The Readline @code{SIGWINCH} +handler updates Readline's internal screen size information, and then calls +any @code{SIGWINCH} signal handler the calling application has installed. +Readline calls the application's @code{SIGWINCH} signal handler without +resetting the terminal to its original state. If the application's signal +handler does more than update its idea of the terminal size and return (for +example, a @code{longjmp} back to a main processing loop), it @emph{must} +call @code{rl_cleanup_after_signal()} (described below), to restore the +terminal state. + +When an application is using the callback interface +(@pxref{Alternate Interface}), Readline installs signal handlers only for +the duration of the call to @code{rl_callback_read_char}. Applications +using the callback interface should be prepared to clean up Readline's +state if they wish to handle the signal before the line handler completes +and restores the terminal state. + +If an application using the callback interface wishes to have Readline +install its signal handlers at the time the application calls +@code{rl_callback_handler_install} and remove them only when a complete +line of input has been read, it should set the +@code{rl_persistent_signal_handlers} variable to a non-zero value. +This allows an application to defer all of the handling of the signals +Readline catches to Readline. +Applications should use this variable with care; it can result in Readline +catching signals and not acting on them (or allowing the application to react +to them) until the application calls @code{rl_callback_read_char}. This +can result in an application becoming less responsive to keyboard signals +like SIGINT. +If an application does not want or need to perform any signal handling, or +does not need to do any processing between calls to @code{rl_callback_read_char}, +setting this variable may be desirable. + +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{SIGHUP}, @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 set to a non-zero value, +Readline will install a signal handler for @code{SIGWINCH}. + +The default value of @code{rl_catch_sigwinch} is 1. +@end deftypevar + +@deftypevar int rl_persistent_signal_handlers +If an application using the callback interface wishes Readline's signal +handlers to be installed and active during the set of calls to +@code{rl_callback_read_char} that constitutes an entire single line, +it should set this variable to a non-zero value. + +The default value of @code{rl_persistent_signal_handlers} is 0. +@end deftypevar + +@deftypevar int rl_change_environment +If this variable is set to a non-zero value, +and Readline is handling @code{SIGWINCH}, Readline will modify the +@var{LINES} and @var{COLUMNS} environment variables upon receipt of a +@code{SIGWINCH} + +The default value of @code{rl_change_environment} 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 int rl_pending_signal (void) +Return the signal number of the most recent signal Readline received but +has not yet handled, or 0 if there is no pending signal. +@end deftypefun + +@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 wants to force Readline to handle any signals that +have arrived while it has been executing, @code{rl_check_signals()} +will call Readline's internal signal handler if there are any pending +signals. This is primarily intended for those applications that use +a custom @code{rl_getc_function} (@pxref{Readline Variables}) and wish +to handle signals received while waiting for input. + +@deftypefun void rl_check_signals (void) +If there are any pending signals, call Readline's internal signal handling +functions to process them. @code{rl_pending_signal()} can be used independently +to determine whether or not there are any pending signals. +@end deftypefun + +If an application does not wish Readline to catch @code{SIGWINCH}, it may +call @code{rl_resize_terminal()} or @code{rl_set_screen_size()} to force +Readline to update its idea of the terminal size when it receives +a @code{SIGWINCH}. + +@deftypefun void rl_echo_signal_char (int sig) +If an application wishes to install its own signal handlers, but still +have Readline display characters that generate signals, calling this +function with @var{sig} set to @code{SIGINT}, @code{SIGQUIT}, or +@code{SIGTSTP} will display the character generating that signal. +@end deftypefun + +@deftypefun void rl_resize_terminal (void) +Update Readline's internal screen size by reading values from the kernel. +@end deftypefun + +@deftypefun void rl_set_screen_size (int rows, int cols) +Set Readline's idea of the terminal size to @var{rows} rows and +@var{cols} columns. If either @var{rows} or @var{columns} is less than +or equal to 0, Readline's idea of that terminal dimension is unchanged. +This is intended to tell Readline the physical dimensions of the terminal, +and is used internally to calculate the maximum number of characters that +may appear on a single line and on the screen. +@end deftypefun + +If an application does not want to install a @code{SIGWINCH} handler, but +is still interested in the screen dimensions, it may query Readline's idea +of the screen size. + +@deftypefun void rl_get_screen_size (int *rows, int *cols) +Return Readline's idea of the terminal's size in the +variables pointed to by the arguments. +@end deftypefun + +@deftypefun void rl_reset_screen_size (void) +Cause Readline to reobtain the screen size and recalculate its dimensions. +@end deftypefun + +The following functions install and remove Readline's signal handlers. + +@deftypefun int rl_set_signals (void) +Install Readline's signal handler for @code{SIGINT}, @code{SIGQUIT}, +@code{SIGTERM}, @code{SIGHUP}, @code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN}, +@code{SIGTTOU}, and @code{SIGWINCH}, depending on the values of +@code{rl_catch_signals} and @code{rl_catch_sigwinch}. +@end deftypefun + +@deftypefun int rl_clear_signals (void) +Remove all of the Readline signal handlers installed by +@code{rl_set_signals()}. +@end deftypefun + +@node Custom Completers +@section Custom Completers +@cindex application-specific completion functions + +Typically, a program that reads commands from the user has a way of +disambiguating commands and data. If your program is one of these, then +it can provide completion for commands, data, or both. +The following sections describe how your program and Readline +cooperate to provide this service. + +@menu +* How Completing Works:: The logic used to do completion. +* Completion Functions:: Functions provided by Readline. +* Completion Variables:: Variables which control completion. +* A Short Completion Example:: An example of writing completer subroutines. +@end menu + +@node How Completing Works +@subsection How Completing Works + +In order to complete some text, the full list of possible completions +must be available. That is, it is not possible to accurately +expand a partial word without knowing all of the possible words +which make sense in that context. The Readline library provides +the user interface to completion, and two of the most common +completion functions: filename and username. For completing other types +of text, you must write your own completion function. This section +describes exactly what such functions must do, and provides an example. + +There are three major functions used to perform completion: + +@enumerate +@item +The user-interface function @code{rl_complete()}. This function is +called with the same arguments as other bindable Readline functions: +@var{count} and @var{invoking_key}. +It isolates the word to be completed and calls +@code{rl_completion_matches()} to generate a list of possible completions. +It then either lists the possible completions, inserts the possible +completions, or actually performs the +completion, depending on which behavior is desired. + +@item +The internal function @code{rl_completion_matches()} uses an +application-supplied @dfn{generator} function to generate the list of +possible matches, and then returns the array of these matches. +The caller should place the address of its generator function in +@code{rl_completion_entry_function}. + +@item +The generator function is called repeatedly from +@code{rl_completion_matches()}, returning a string each time. The +arguments to the generator function are @var{text} and @var{state}. +@var{text} is the partial word to be completed. @var{state} is zero the +first time the function is called, allowing the generator to perform +any necessary initialization, and a positive non-zero integer for +each subsequent call. The generator function returns +@code{(char *)NULL} to inform @code{rl_completion_matches()} that there are +no more possibilities left. Usually the generator function computes the +list of possible completions when @var{state} is zero, and returns them +one at a time on subsequent calls. Each string the generator function +returns as a match must be allocated with @code{malloc()}; Readline +frees the strings when it has finished with them. +Such a generator function is referred to as an +@dfn{application-specific completion function}. + +@end enumerate + +@deftypefun int rl_complete (int ignore, int invoking_key) +Complete the word at or before point. You have supplied the function +that does the initial simple matching selection algorithm (see +@code{rl_completion_matches()}). The default is to do filename completion. +@end deftypefun + +@deftypevar {rl_compentry_func_t *} rl_completion_entry_function +This is a pointer to the generator function for +@code{rl_completion_matches()}. +If the value of @code{rl_completion_entry_function} is +@code{NULL} then the default filename generator +function, @code{rl_filename_completion_function()}, is used. +An @dfn{application-specific completion function} is a function whose +address is assigned to @code{rl_completion_entry_function} and whose +return values are used to generate possible completions. +@end deftypevar + +@node Completion Functions +@subsection Completion Functions + +Here is the complete list of callable completion functions present in +Readline. + +@deftypefun int rl_complete_internal (int what_to_do) +Complete the word at or before point. @var{what_to_do} says what to do +with the completion. A value of @samp{?} means list the possible +completions. @samp{TAB} means do standard completion. @samp{*} means +insert all of the possible completions. @samp{!} means to display +all of the possible completions, if there is more than one, as well as +performing partial completion. @samp{@@} is similar to @samp{!}, but +possible completions are not listed if the possible completions share +a common prefix. +@end deftypefun + +@deftypefun int rl_complete (int ignore, int invoking_key) +Complete the word at or before point. You have supplied the function +that does the initial simple matching selection algorithm (see +@code{rl_completion_matches()} and @code{rl_completion_entry_function}). +The default is to do filename +completion. This calls @code{rl_complete_internal()} with an +argument depending on @var{invoking_key}. +@end deftypefun + +@deftypefun int rl_possible_completions (int count, int invoking_key) +List the possible completions. See description of @code{rl_complete +()}. This calls @code{rl_complete_internal()} with an argument of +@samp{?}. +@end deftypefun + +@deftypefun int rl_insert_completions (int count, int invoking_key) +Insert the list of possible completions into the line, deleting the +partially-completed word. See description of @code{rl_complete()}. +This calls @code{rl_complete_internal()} with an argument of @samp{*}. +@end deftypefun + +@deftypefun int rl_completion_mode (rl_command_func_t *cfunc) +Returns the appropriate value to pass to @code{rl_complete_internal()} +depending on whether @var{cfunc} was called twice in succession and +the values of the @code{show-all-if-ambiguous} and +@code{show-all-if-unmodified} variables. +Application-specific completion functions may use this function to present +the same interface as @code{rl_complete()}. +@end deftypefun + +@deftypefun {char **} rl_completion_matches (const char *text, rl_compentry_func_t *entry_func) +Returns an array of strings which is a list of completions for +@var{text}. If there are no completions, returns @code{NULL}. +The first entry in the returned array is the substitution for @var{text}. +The remaining entries are the possible completions. The array is +terminated with a @code{NULL} pointer. + +@var{entry_func} is a function of two args, and returns a +@code{char *}. The first argument is @var{text}. The second is a +state argument; it is zero on the first call, and non-zero on subsequent +calls. @var{entry_func} returns a @code{NULL} pointer to the caller +when there are no more matches. +@end deftypefun + +@deftypefun {char *} rl_filename_completion_function (const char *text, int state) +A generator function for filename completion in the general case. +@var{text} is a partial filename. +The Bash source is a useful reference for writing application-specific +completion functions (the Bash completion functions call this and other +Readline functions). +@end deftypefun + +@deftypefun {char *} rl_username_completion_function (const char *text, int state) +A completion generator for usernames. @var{text} contains a partial +username preceded by a random character (usually @samp{~}). As with all +completion generators, @var{state} is zero on the first call and non-zero +for subsequent calls. +@end deftypefun + +@node Completion Variables +@subsection Completion Variables + +@deftypevar {rl_compentry_func_t *} rl_completion_entry_function +A pointer to the generator function for @code{rl_completion_matches()}. +@code{NULL} means to use @code{rl_filename_completion_function()}, +the default filename completer. +@end deftypevar + +@deftypevar {rl_completion_func_t *} rl_attempted_completion_function +A pointer to an alternative function to create matches. +The function is called with @var{text}, @var{start}, and @var{end}. +@var{start} and @var{end} are indices in @code{rl_line_buffer} defining +the boundaries of @var{text}, which is a character string. +If this function exists and returns @code{NULL}, or if this variable is +set to @code{NULL}, then @code{rl_complete()} will call the value of +@code{rl_completion_entry_function} to generate matches, otherwise the +array of strings returned will be used. +If this function sets the @code{rl_attempted_completion_over} +variable to a non-zero value, Readline will not perform its default +completion even if this function returns no matches. +@end deftypevar + +@deftypevar {rl_quote_func_t *} rl_filename_quoting_function +A pointer to a function that will quote a filename in an +application-specific fashion. This is called if filename completion is being +attempted and one of the characters in @code{rl_filename_quote_characters} +appears in a completed filename. The function is called with +@var{text}, @var{match_type}, and @var{quote_pointer}. The @var{text} +is the filename to be quoted. The @var{match_type} is either +@code{SINGLE_MATCH}, if there is only one completion match, or +@code{MULT_MATCH}. Some functions use this to decide whether or not to +insert a closing quote character. The @var{quote_pointer} is a pointer +to any opening quote character the user typed. Some functions choose +to reset this character. +@end deftypevar + +@deftypevar {rl_dequote_func_t *} rl_filename_dequoting_function +A pointer to a function that will remove application-specific quoting +characters from a filename before completion is attempted, so those +characters do not interfere with matching the text against names in +the filesystem. It is called with @var{text}, the text of the word +to be dequoted, and @var{quote_char}, which is the quoting character +that delimits the filename (usually @samp{'} or @samp{"}). If +@var{quote_char} is zero, the filename was not in an embedded string. +@end deftypevar + +@deftypevar {rl_linebuf_func_t *} rl_char_is_quoted_p +A pointer to a function to call that determines whether or not a specific +character in the line buffer is quoted, according to whatever quoting +mechanism the program calling Readline uses. The function is called with +two arguments: @var{text}, the text of the line, and @var{index}, the +index of the character in the line. It is used to decide whether a +character found in @code{rl_completer_word_break_characters} should be +used to break words for the completer. +@end deftypevar + +@deftypevar {rl_compignore_func_t *} rl_ignore_some_completions_function +This function, if defined, is called by the completer when real filename +completion is done, after all the matching names have been generated. +It is passed a @code{NULL} terminated array of matches. +The first element (@code{matches[0]}) is the +maximal substring common to all matches. This function can +re-arrange the list of matches as required, but each element deleted +from the array must be freed. +@end deftypevar + +@deftypevar {rl_icppfunc_t *} rl_directory_completion_hook +This function, if defined, is allowed to modify the directory portion +of filenames Readline completes. +It could be used to expand symbolic links or shell variables in pathnames. +It is called with the address of a string (the current directory name) as an +argument, and may modify that string. +If the string is replaced with a new string, the old value should be freed. +Any modified directory name should have a trailing slash. +The modified value will be used as part of the completion, replacing +the directory portion of the pathname the user typed. +At the least, even if no other expansion is performed, this function should +remove any quote characters from the directory name, because its result will +be passed directly to @code{opendir()}. + +The directory completion hook returns an integer that should be non-zero if +the function modifies its directory argument. +The function should not modify the directory argument if it returns 0. +@end deftypevar + +@deftypevar {rl_icppfunc_t *} rl_directory_rewrite_hook; +If non-zero, this is the address of a function to call when completing +a directory name. This function takes the address of the directory name +to be modified as an argument. Unlike @code{rl_directory_completion_hook}, +it only modifies the directory name used in @code{opendir}, not what is +displayed when the possible completions are printed or inserted. It is +called before rl_directory_completion_hook. +At the least, even if no other expansion is performed, this function should +remove any quote characters from the directory name, because its result will +be passed directly to @code{opendir()}. + +The directory rewrite hook returns an integer that should be non-zero if +the function modifies its directory argument. +The function should not modify the directory argument if it returns 0. +@end deftypevar + +@deftypevar {rl_icppfunc_t *} rl_filename_stat_hook +If non-zero, this is the address of a function for the completer to +call before deciding which character to append to a completed name. +This function modifies its filename name argument, and the modified value +is passed to @code{stat()} to determine the file's type and characteristics. +This function does not need to remove quote characters from the filename. + +The stat hook returns an integer that should be non-zero if +the function modifies its directory argument. +The function should not modify the directory argument if it returns 0. +@end deftypevar + +@deftypevar {rl_dequote_func_t *} rl_filename_rewrite_hook +If non-zero, this is the address of a function called when reading +directory entries from the filesystem for completion and comparing +them to the partial word to be completed. The function should +perform any necessary application or system-specific conversion on +the filename, such as converting between character sets or converting +from a filesystem format to a character input format. +The function takes two arguments: @var{fname}, the filename to be converted, +and @var{fnlen}, its length in bytes. +It must either return its first argument (if no conversion takes place) +or the converted filename in newly-allocated memory. The converted +form is used to compare against the word to be completed, and, if it +matches, is added to the list of matches. Readline will free the +allocated string. +@end deftypevar + +@deftypevar {rl_compdisp_func_t *} rl_completion_display_matches_hook +If non-zero, then this is the address of a function to call when +completing a word would normally display the list of possible matches. +This function is called in lieu of Readline displaying the list. +It takes three arguments: +(@code{char **}@var{matches}, @code{int} @var{num_matches}, @code{int} @var{max_length}) +where @var{matches} is the array of matching strings, +@var{num_matches} is the number of strings in that array, and +@var{max_length} is the length of the longest string in that array. +Readline provides a convenience function, @code{rl_display_match_list}, +that takes care of doing the display to Readline's output stream. +You may call that function from this hook. +@end deftypevar + +@deftypevar {const char *} rl_basic_word_break_characters +The basic list of characters that signal a break between words for the +completer routine. The default value of this variable is the characters +which break words for completion in Bash: +@code{" \t\n\"\\'`@@$><=;|&@{("}. +@end deftypevar + +@deftypevar {const char *} rl_basic_quote_characters +A list of quote characters which can cause a word break. +@end deftypevar + +@deftypevar {const char *} rl_completer_word_break_characters +The list of characters that signal a break between words for +@code{rl_complete_internal()}. The default list is the value of +@code{rl_basic_word_break_characters}. +@end deftypevar + +@deftypevar {rl_cpvfunc_t *} rl_completion_word_break_hook +If non-zero, this is the address of a function to call when Readline is +deciding where to separate words for word completion. It should return +a character string like @code{rl_completer_word_break_characters} to be +used to perform the current completion. The function may choose to set +@code{rl_completer_word_break_characters} itself. If the function +returns @code{NULL}, @code{rl_completer_word_break_characters} is used. +@end deftypevar + +@deftypevar {const char *} rl_completer_quote_characters +A list of characters which can be used to quote a substring of the line. +Completion occurs on the entire substring, and within the substring +@code{rl_completer_word_break_characters} are treated as any other character, +unless they also appear within this list. +@end deftypevar + +@deftypevar {const char *} rl_filename_quote_characters +A list of characters that cause a filename to be quoted by the completer +when they appear in a completed filename. The default is the null string. +@end deftypevar + +@deftypevar {const char *} rl_special_prefixes +The list of characters that are word break characters, but should be +left in @var{text} when it is passed to the completion function. +Programs can use this to help determine what kind of completing to do. +For instance, Bash sets this variable to "$@@" so that it can complete +shell variables and hostnames. +@end deftypevar + +@deftypevar int rl_completion_query_items +Up to this many items will be displayed in response to a +possible-completions call. After that, Readline asks the user for +confirmation before displaying them. +The default value is 100. A negative value +indicates that Readline should never ask for confirmation. +@end deftypevar + +@deftypevar {int} rl_completion_append_character +When a single completion alternative matches at the end of the command +line, this character is appended to the inserted completion text. The +default is a space character (@samp{ }). Setting this to the null +character (@samp{\0}) prevents anything being appended automatically. +This can be changed in application-specific completion functions to +provide the ``most sensible word separator character'' according to +an application-specific command line syntax specification. +It is set to the default before any application-specific completion function +is called, and may only be changed within such a function. +@end deftypevar + +@deftypevar int rl_completion_suppress_append +If non-zero, @var{rl_completion_append_character} is not appended to +matches at the end of the command line, as described above. +It is set to 0 before any application-specific completion function +is called, and may only be changed within such a function. +@end deftypevar + +@deftypevar int rl_completion_quote_character +When Readline is completing quoted text, as delimited by one of the +characters in @var{rl_completer_quote_characters}, it sets this variable +to the quoting character found. +This is set before any application-specific completion function is called. +@end deftypevar + +@deftypevar int rl_completion_suppress_quote +If non-zero, Readline does not append a matching quote character when +performing completion on a quoted string. +It is set to 0 before any application-specific completion function +is called, and may only be changed within such a function. +@end deftypevar + +@deftypevar int rl_completion_found_quote +When Readline is completing quoted text, it sets this variable +to a non-zero value if the word being completed contains or is delimited +by any quoting characters, including backslashes. +This is set before any application-specific completion function is called. +@end deftypevar + +@deftypevar int rl_completion_mark_symlink_dirs +If non-zero, a slash will be appended to completed filenames that are +symbolic links to directory names, subject to the value of the +user-settable @var{mark-directories} variable. +This variable exists so that application-specific completion functions +can override the user's global preference (set via the +@var{mark-symlinked-directories} Readline variable) if appropriate. +This variable is set to the user's preference before any +application-specific completion function is called, so unless that +function modifies the value, the user's preferences are honored. +@end deftypevar + +@deftypevar int rl_ignore_completion_duplicates +If non-zero, then duplicates in the matches are removed. +The default is 1. +@end deftypevar + +@deftypevar int rl_filename_completion_desired +Non-zero means that the results of the matches are to be treated as +filenames. This is @emph{always} zero when completion is attempted, +and can only be changed +within an application-specific completion function. If it is set to a +non-zero value by such a function, directory names have a slash appended +and Readline attempts to quote completed filenames if they contain any +characters in @code{rl_filename_quote_characters} and +@code{rl_filename_quoting_desired} is set to a non-zero value. +@end deftypevar + +@deftypevar int rl_filename_quoting_desired +Non-zero means that the results of the matches are to be quoted using +double quotes (or an application-specific quoting mechanism) if the +completed filename contains any characters in +@code{rl_filename_quote_chars}. This is @emph{always} non-zero +when completion is attempted, and can only be changed within an +application-specific completion function. +The quoting is effected via a call to the function pointed to +by @code{rl_filename_quoting_function}. +@end deftypevar + +@deftypevar int rl_attempted_completion_over +If an application-specific completion function assigned to +@code{rl_attempted_completion_function} sets this variable to a non-zero +value, Readline will not perform its default filename completion even +if the application's completion function returns no matches. +It should be set only by an application's completion function. +@end deftypevar + +@deftypevar int rl_sort_completion_matches +If an application sets this variable to 0, Readline will not sort the +list of completions (which implies that it cannot remove any duplicate +completions). The default value is 1, which means that Readline will +sort the completions and, depending on the value of +@code{rl_ignore_completion_duplicates}, will attempt to remove duplicate +matches. +@end deftypevar + +@deftypevar int rl_completion_type +Set to a character describing the type of completion Readline is currently +attempting; see the description of @code{rl_complete_internal()} +(@pxref{Completion Functions}) for the list of characters. +This is set to the appropriate value before any application-specific +completion function is called, allowing such functions to present +the same interface as @code{rl_complete()}. +@end deftypevar + +@deftypevar int rl_completion_invoking_key +Set to the final character in the key sequence that invoked one of the +completion functions that call @code{rl_complete_internal()}. This is +set to the appropriate value before any application-specific completion +function is called. +@end deftypevar + +@deftypevar int rl_inhibit_completion +If this variable is non-zero, completion is inhibited. The completion +character will be inserted as any other bound to @code{self-insert}. +@end deftypevar + +@node A Short Completion Example +@subsection A Short Completion Example + +Here is a small application demonstrating the use of the GNU Readline +library. It is called @code{fileman}, and the source code resides in +@file{examples/fileman.c}. This sample application provides +completion of command names, line editing features, and access to the +history list. + +@page +@smallexample +/* fileman.c -- A tiny application which demonstrates how to use the + GNU Readline library. This application interactively allows users + to manipulate files and their modes. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#ifdef HAVE_SYS_FILE_H +# include +#endif +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include +#include + +#if defined (HAVE_STRING_H) +# include +#else /* !HAVE_STRING_H */ +# include +#endif /* !HAVE_STRING_H */ + +#ifdef HAVE_STDLIB_H +# include +#endif + +#include + +#include +#include + +extern char *xmalloc PARAMS((size_t)); + +/* The names of functions that actually do the manipulation. */ +int com_list PARAMS((char *)); +int com_view PARAMS((char *)); +int com_rename PARAMS((char *)); +int com_stat PARAMS((char *)); +int com_pwd PARAMS((char *)); +int com_delete PARAMS((char *)); +int com_help PARAMS((char *)); +int com_cd PARAMS((char *)); +int com_quit PARAMS((char *)); + +/* A structure which contains information on the commands this program + can understand. */ + +typedef struct @{ + char *name; /* User printable name of the function. */ + rl_icpfunc_t *func; /* Function to call to do the job. */ + char *doc; /* Documentation for this function. */ +@} COMMAND; + +COMMAND commands[] = @{ + @{ "cd", com_cd, "Change to directory DIR" @}, + @{ "delete", com_delete, "Delete FILE" @}, + @{ "help", com_help, "Display this text" @}, + @{ "?", com_help, "Synonym for `help'" @}, + @{ "list", com_list, "List files in DIR" @}, + @{ "ls", com_list, "Synonym for `list'" @}, + @{ "pwd", com_pwd, "Print the current working directory" @}, + @{ "quit", com_quit, "Quit using Fileman" @}, + @{ "rename", com_rename, "Rename FILE to NEWNAME" @}, + @{ "stat", com_stat, "Print out statistics on FILE" @}, + @{ "view", com_view, "View the contents of FILE" @}, + @{ (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL @} +@}; + +/* Forward declarations. */ +char *stripwhite (); +COMMAND *find_command (); + +/* The name of this program, as taken from argv[0]. */ +char *progname; + +/* When non-zero, this global means the user is done using this program. */ +int done; + +char * +dupstr (s) + char *s; +@{ + char *r; + + r = xmalloc (strlen (s) + 1); + strcpy (r, s); + return (r); +@} + +main (argc, argv) + int argc; + char **argv; +@{ + char *line, *s; + + setlocale (LC_ALL, ""); + + progname = argv[0]; + + initialize_readline (); /* Bind our completer. */ + + /* Loop reading and executing lines until the user quits. */ + for ( ; done == 0; ) + @{ + line = readline ("FileMan: "); + + if (!line) + break; + + /* Remove leading and trailing whitespace from the line. + Then, if there is anything left, add it to the history list + and execute it. */ + s = stripwhite (line); + + if (*s) + @{ + add_history (s); + execute_line (s); + @} + + free (line); + @} + exit (0); +@} + +/* Execute a command line. */ +int +execute_line (line) + char *line; +@{ + register int i; + COMMAND *command; + char *word; + + /* Isolate the command word. */ + i = 0; + while (line[i] && whitespace (line[i])) + i++; + word = line + i; + + while (line[i] && !whitespace (line[i])) + i++; + + if (line[i]) + line[i++] = '\0'; + + command = find_command (word); + + if (!command) + @{ + fprintf (stderr, "%s: No such command for FileMan.\n", word); + return (-1); + @} + + /* Get argument to command, if any. */ + while (whitespace (line[i])) + i++; + + word = line + i; + + /* Call the function. */ + return ((*(command->func)) (word)); +@} + +/* Look up NAME as the name of a command, and return a pointer to that + command. Return a NULL pointer if NAME isn't a command name. */ +COMMAND * +find_command (name) + char *name; +@{ + register int i; + + for (i = 0; commands[i].name; i++) + if (strcmp (name, commands[i].name) == 0) + return (&commands[i]); + + return ((COMMAND *)NULL); +@} + +/* Strip whitespace from the start and end of STRING. Return a pointer + into STRING. */ +char * +stripwhite (string) + char *string; +@{ + register char *s, *t; + + for (s = string; whitespace (*s); s++) + ; + + if (*s == 0) + return (s); + + t = s + strlen (s) - 1; + while (t > s && whitespace (*t)) + t--; + *++t = '\0'; + + return s; +@} + +/* **************************************************************** */ +/* */ +/* Interface to Readline Completion */ +/* */ +/* **************************************************************** */ + +char *command_generator PARAMS((const char *, int)); +char **fileman_completion PARAMS((const char *, int, int)); + +/* Tell the GNU Readline library how to complete. We want to try to complete + on command names if this is the first word in the line, or on filenames + if not. */ +initialize_readline () +@{ + /* Allow conditional parsing of the ~/.inputrc file. */ + rl_readline_name = "FileMan"; + + /* Tell the completer that we want a crack first. */ + rl_attempted_completion_function = fileman_completion; +@} + +/* Attempt to complete on the contents of TEXT. START and END bound the + region of rl_line_buffer that contains the word to complete. TEXT is + the word to complete. We can use the entire contents of rl_line_buffer + in case we want to do some simple parsing. Return the array of matches, + or NULL if there aren't any. */ +char ** +fileman_completion (text, start, end) + const char *text; + int start, end; +@{ + char **matches; + + matches = (char **)NULL; + + /* If this word is at the start of the line, then it is a command + to complete. Otherwise it is the name of a file in the current + directory. */ + if (start == 0) + matches = rl_completion_matches (text, command_generator); + + return (matches); +@} + +/* Generator function for command completion. STATE lets us know whether + to start from scratch; without any state (i.e. STATE == 0), then we + start at the top of the list. */ +char * +command_generator (text, state) + const char *text; + int state; +@{ + static int list_index, len; + char *name; + + /* If this is a new word to complete, initialize now. This includes + saving the length of TEXT for efficiency, and initializing the index + variable to 0. */ + if (!state) + @{ + list_index = 0; + len = strlen (text); + @} + + /* Return the next name which partially matches from the command list. */ + while (name = commands[list_index].name) + @{ + list_index++; + + if (strncmp (name, text, len) == 0) + return (dupstr(name)); + @} + + /* If no names matched, then return NULL. */ + return ((char *)NULL); +@} + +/* **************************************************************** */ +/* */ +/* FileMan Commands */ +/* */ +/* **************************************************************** */ + +/* String to pass to system (). This is for the LIST, VIEW and RENAME + commands. */ +static char syscom[1024]; + +/* List the file(s) named in arg. */ +com_list (arg) + char *arg; +@{ + if (!arg) + arg = ""; + + sprintf (syscom, "ls -FClg %s", arg); + return (system (syscom)); +@} + +com_view (arg) + char *arg; +@{ + if (!valid_argument ("view", arg)) + return 1; + +#if defined (__MSDOS__) + /* more.com doesn't grok slashes in pathnames */ + sprintf (syscom, "less %s", arg); +#else + sprintf (syscom, "more %s", arg); +#endif + return (system (syscom)); +@} + +com_rename (arg) + char *arg; +@{ + too_dangerous ("rename"); + return (1); +@} + +com_stat (arg) + char *arg; +@{ + struct stat finfo; + + if (!valid_argument ("stat", arg)) + return (1); + + if (stat (arg, &finfo) == -1) + @{ + perror (arg); + return (1); + @} + + printf ("Statistics for `%s':\n", arg); + + printf ("%s has %d link%s, and is %d byte%s in length.\n", + arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + finfo.st_size, + (finfo.st_size == 1) ? "" : "s"); + printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); + printf (" Last access at: %s", ctime (&finfo.st_atime)); + printf (" Last modified at: %s", ctime (&finfo.st_mtime)); + return (0); +@} + +com_delete (arg) + char *arg; +@{ + too_dangerous ("delete"); + return (1); +@} + +/* Print out help for ARG, or for all of the commands if ARG is + not present. */ +com_help (arg) + char *arg; +@{ + register int i; + int printed = 0; + + for (i = 0; commands[i].name; i++) + @{ + if (!*arg || (strcmp (arg, commands[i].name) == 0)) + @{ + printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); + printed++; + @} + @} + + if (!printed) + @{ + printf ("No commands match `%s'. Possibilities 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); +@} +@end smallexample diff --git a/doc/rluser.texi b/doc/rluser.texi new file mode 100644 index 0000000..cbcbb45 --- /dev/null +++ b/doc/rluser.texi @@ -0,0 +1,2488 @@ +@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.) + +@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--2022 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. +Command line editing is enabled by default when using an interactive shell, +unless the @option{--noediting} option is supplied at shell invocation. +Line editing is also used when using the @option{-e} option to the +@code{read} builtin command (@pxref{Bash Builtins}). +By default, the line editing commands are similar to those of Emacs. +A vi-style line editing interface is also available. +Line editing can be enabled at any time using the @option{-o emacs} or +@option{-o vi} options to the @code{set} builtin command +(@pxref{The Set Builtin}), or disabled using the @option{+o emacs} or +@option{+o vi} options to @code{set}. +@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. +* A Programmable Completion Example:: An example shell function for + generating possible completions. +@end ifset +@end menu + +@node Introduction and Notation +@section Introduction to Line Editing + +The following paragraphs describe the notation used to represent +keystrokes. + +The text @kbd{C-k} is read as `Control-K' and describes the character +produced when the @key{k} key is pressed while the Control key +is depressed. + +The text @kbd{M-k} is read as `Meta-K' and describes the character +produced when the Meta key (if you have one) is depressed, and the @key{k} +key is pressed. +The Meta key is labeled @key{ALT} on many keyboards. +On keyboards with two keys labeled @key{ALT} (usually to either side of +the space bar), the @key{ALT} on the left side is generally set to +work as a Meta key. +The @key{ALT} key on the right may also be configured to work as a +Meta key or may be configured as some other modifier, such as a +Compose key for typing accented characters. + +If you do not have a Meta or @key{ALT} key, or another key working as +a Meta key, the identical keystroke can be generated by typing @key{ESC} +@emph{first}, and then typing @key{k}. +Either process is known as @dfn{metafying} the @key{k} key. + +The text @kbd{M-C-k} is read as `Meta-Control-k' and describes the +character produced by @dfn{metafying} @kbd{C-k}. + +In addition, several keys have their own names. Specifically, +@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all +stand for themselves when seen in this text, or in an init file +(@pxref{Readline Init File}). +If your keyboard lacks a @key{LFD} key, typing @key{C-j} will +produce the desired character. +The @key{RET} key may be labeled @key{Return} or @key{Enter} on +some keyboards. + +@node Readline Interaction +@section Readline Interaction +@cindex interaction, readline + +Often during an interactive session you type in a long line of text, +only to notice that the first word on the line is misspelled. The +Readline library gives you a set of commands for manipulating the text +as you type it in, allowing you to just fix your typo, and not forcing +you to retype the majority of the line. Using these editing commands, +you move the cursor to the place that needs correction, and delete or +insert the text of the corrections. Then, when you are satisfied with +the line, you simply press @key{RET}. You do not have to be at the +end of the line to press @key{RET}; the entire line is accepted +regardless of the location of the cursor within the line. + +@menu +* Readline Bare Essentials:: The least you need to know about Readline. +* Readline Movement Commands:: Moving about the input line. +* Readline Killing Commands:: How to delete text, and how to get it back! +* Readline Arguments:: Giving numeric arguments to commands. +* Searching:: Searching through previous lines. +@end menu + +@node Readline Bare Essentials +@subsection Readline Bare Essentials +@cindex notation, readline +@cindex command editing +@cindex editing command lines + +In order to enter characters into the line, simply type them. The typed +character appears where the cursor was, and then the cursor moves one +space to the right. If you mistype a character, you can use your +erase character to back up and delete the mistyped character. + +Sometimes you may mistype a character, and +not notice the error until you have typed several other characters. In +that case, you can type @kbd{C-b} to move the cursor to the left, and then +correct your mistake. Afterwards, you can move the cursor to the right +with @kbd{C-f}. + +When you add text in the middle of a line, you will notice that characters +to the right of the cursor are `pushed over' to make room for the text +that you have inserted. Likewise, when you delete text behind the cursor, +characters to the right of the cursor are `pulled back' to fill in the +blank space created by the removal of the text. A list of the bare +essentials for editing the text of an input line follows. + +@table @asis +@item @kbd{C-b} +Move back one character. +@item @kbd{C-f} +Move forward one character. +@item @key{DEL} or @key{Backspace} +Delete the character to the left of the cursor. +@item @kbd{C-d} +Delete the character underneath the cursor. +@item @w{Printing characters} +Insert the character into the line at the cursor. +@item @kbd{C-_} or @kbd{C-x C-u} +Undo the last editing command. You can undo all the way back to an +empty line. +@end table + +@noindent +(Depending on your configuration, the @key{Backspace} key might be set to +delete the character to the left of the cursor and the @key{DEL} key set +to delete the character underneath the cursor, like @kbd{C-d}, rather +than the character to the left of the cursor.) + +@node Readline Movement Commands +@subsection Readline Movement Commands + + +The above table describes the most basic keystrokes that you need +in order to do editing of the input line. For your convenience, many +other commands have been added in addition to @kbd{C-b}, @kbd{C-f}, +@kbd{C-d}, and @key{DEL}. Here are some commands for moving more rapidly +about the line. + +@table @kbd +@item C-a +Move to the start of the line. +@item C-e +Move to the end of the line. +@item M-f +Move forward a word, where a word is composed of letters and digits. +@item M-b +Move backward a word. +@item C-l +Clear the screen, reprinting the current line at the top. +@end table + +Notice how @kbd{C-f} moves forward a character, while @kbd{M-f} moves +forward a word. It is a loose convention that control keystrokes +operate on characters while meta keystrokes operate on words. + +@node Readline Killing Commands +@subsection Readline Killing Commands + +@cindex killing text +@cindex yanking text + +@dfn{Killing} text means to delete the text from the line, but to save +it away for later use, usually by @dfn{yanking} (re-inserting) +it back into the line. +(`Cut' and `paste' are more recent jargon for `kill' and `yank'.) + +If the description for a command says that it `kills' text, then you can +be sure that you can get the text back in a different (or the same) +place later. + +When you use a kill command, the text is saved in a @dfn{kill-ring}. +Any number of consecutive kills save all of the killed text together, so +that when you yank it back, you get it all. The kill +ring is not line specific; the text that you killed on a previously +typed line is available to be yanked back later, when you are typing +another line. +@cindex kill ring + +Here is the list of commands for killing text. + +@table @kbd +@item C-k +Kill the text from the current cursor position to the end of the line. + +@item M-d +Kill from the cursor to the end of the current word, or, if between +words, to the end of the next word. +Word boundaries are the same as those used by @kbd{M-f}. + +@item M-@key{DEL} +Kill from the cursor to the start of the current word, or, if between +words, to the start of the previous word. +Word boundaries are the same as those used by @kbd{M-b}. + +@item C-w +Kill from the cursor to the previous whitespace. This is different than +@kbd{M-@key{DEL}} because the word boundaries differ. + +@end table + +Here is how to @dfn{yank} the text back into the line. Yanking +means to copy the most-recently-killed text from the kill buffer. + +@table @kbd +@item C-y +Yank the most recently killed text back into the buffer at the cursor. + +@item M-y +Rotate the kill-ring, and yank the new top. You can only do this if +the prior command is @kbd{C-y} or @kbd{M-y}. +@end table + +@node Readline Arguments +@subsection Readline Arguments + +You can pass numeric arguments to Readline commands. Sometimes the +argument acts as a repeat count, other times it is the @i{sign} of the +argument that is significant. If you pass a negative argument to a +command which normally acts in a forward direction, that command will +act in a backward direction. For example, to kill text back to the +start of the line, you might type @samp{M-- C-k}. + +The general way to pass numeric arguments to a command is to type meta +digits before the command. If the first `digit' typed is a minus +sign (@samp{-}), then the sign of the argument will be negative. Once +you have typed one meta digit to get the argument started, you can type +the remainder of the digits, and then the command. For example, to give +the @kbd{C-d} command an argument of 10, you could type @samp{M-1 0 C-d}, +which will delete the next ten characters on the input line. + +@node Searching +@subsection Searching for Commands in the History + +Readline provides commands for searching through the command history +@ifset BashFeatures +(@pxref{Bash History Facilities}) +@end ifset +for lines containing a specified string. +There are two search modes: @dfn{incremental} and @dfn{non-incremental}. + +Incremental searches begin before the user has finished typing the +search string. +As each character of the search string is typed, Readline displays +the next entry from the history matching the string typed so far. +An incremental search requires only as many characters as needed to +find the desired history entry. +To search backward in the history for a particular string, type +@kbd{C-r}. Typing @kbd{C-s} searches forward through the history. +The characters present in the value of the @code{isearch-terminators} variable +are used to terminate an incremental search. +If that variable has not been assigned a value, the @key{ESC} and +@kbd{C-J} characters will terminate an incremental search. +@kbd{C-g} will abort an incremental search and restore the original line. +When the search is terminated, the history entry containing the +search string becomes the current line. + +To find other matching entries in the history list, type @kbd{C-r} or +@kbd{C-s} as appropriate. +This will search backward or forward in the history for the next +entry matching the search string typed so far. +Any other key sequence bound to a Readline command will terminate +the search and execute that command. +For instance, a @key{RET} will terminate the search and accept +the line, thereby executing the command from the history list. +A movement command will terminate the search, make the last line found +the current line, and begin editing. + +Readline remembers the last incremental search string. If two +@kbd{C-r}s are typed without any intervening characters defining a new +search string, any remembered search string is used. + +Non-incremental searches read the entire search string before starting +to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. + +@node Readline Init File +@section Readline Init File +@cindex initialization file, readline + +Although the Readline library comes with a set of Emacs-like +keybindings installed by default, it is possible to use a different set +of keybindings. +Any user can customize programs that use Readline by putting +commands in an @dfn{inputrc} file, +conventionally in their home directory. +The name of this +@ifset BashFeatures +file is taken from the value of the shell variable @env{INPUTRC}. If +@end ifset +@ifclear BashFeatures +file is taken from the value of the environment variable @env{INPUTRC}. If +@end ifclear +that variable is unset, the default is @file{~/.inputrc}. If that +file does not exist or cannot be read, the ultimate default is +@file{/etc/inputrc}. +@ifset BashFeatures +The @w{@code{bind}} builtin command can also be used to set Readline +keybindings and variables. +@xref{Bash Builtins}. +@end ifset + +When a program which uses the Readline library starts up, the +init file is read, and the key bindings are set. + +In addition, the @code{C-x C-r} command re-reads this init file, thus +incorporating any changes that you might have made to it. + +@menu +* Readline Init File Syntax:: Syntax for the commands in the inputrc file. + +* Conditional Init Constructs:: Conditional key bindings in the inputrc file. + +* Sample Init File:: An example inputrc file. +@end menu + +@node Readline Init File Syntax +@subsection Readline Init File Syntax + +There are only a few basic constructs allowed in the +Readline init file. Blank lines are ignored. +Lines beginning with a @samp{#} are comments. +Lines beginning with a @samp{$} indicate conditional +constructs (@pxref{Conditional Init Constructs}). Other lines +denote variable settings and key bindings. + +@table @asis +@item Variable Settings +You can modify the run-time behavior of Readline by +altering the values of variables in Readline +using the @code{set} command within the init file. +The syntax is simple: + +@example +set @var{variable} @var{value} +@end example + +@noindent +Here, for example, is how to +change from the default Emacs-like key binding to use +@code{vi} line editing commands: + +@example +set editing-mode vi +@end example + +Variable names and values, where appropriate, are recognized without regard +to case. Unrecognized variable names are ignored. + +Boolean variables (those that can be set to on or off) are set to on if +the value is null or empty, @var{on} (case-insensitive), or 1. Any other +value results in the variable being set to off. + +@ifset BashFeatures +The @w{@code{bind -V}} command lists the current Readline variable names +and values. @xref{Bash Builtins}. +@end ifset + +A great deal of run-time behavior is changeable with the following +variables. + +@cindex variables, readline +@table @code + +@item active-region-start-color +@vindex active-region-start-color +A string variable that controls the text color and background when displaying +the text in the active region (see the description of +@code{enable-active-region} below). +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal before displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that puts the terminal in standout mode, +as obtained from the terminal's terminfo description. +A sample value might be @samp{\e[01;33m}. + +@item active-region-end-color +@vindex active-region-end-color +A string variable that "undoes" the effects of @code{active-region-start-color} +and restores "normal" terminal display appearance after displaying text +in the active region. +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal after displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that restores the terminal from standout mode, +as obtained from the terminal's terminfo description. +A sample value might be @samp{\e[0m}. + +@item bell-style +@vindex bell-style +Controls what happens when Readline wants to ring the terminal bell. +If set to @samp{none}, Readline never rings the bell. If set to +@samp{visible}, Readline uses a visible bell if one is available. +If set to @samp{audible} (the default), Readline attempts to ring +the terminal's bell. + +@item bind-tty-special-chars +@vindex bind-tty-special-chars +If set to @samp{on} (the default), Readline attempts to bind the control +characters treated specially by the kernel's terminal driver to their +Readline equivalents. + +@item blink-matching-paren +@vindex blink-matching-paren +If set to @samp{on}, Readline attempts to briefly move the cursor to an +opening parenthesis when a closing parenthesis is inserted. The default +is @samp{off}. + +@item colored-completion-prefix +@vindex colored-completion-prefix +If set to @samp{on}, when listing completions, Readline displays the +common prefix of the set of possible completions using a different color. +The color definitions are taken from the value of the @env{LS_COLORS} +environment variable. +If there is a color definition in @env{LS_COLORS} for the custom suffix +@samp{readline-colored-completion-prefix}, Readline uses this color for +the common prefix instead of its default. +The default is @samp{off}. + +@item colored-stats +@vindex colored-stats +If set to @samp{on}, Readline displays possible completions using different +colors to indicate their file type. +The color definitions are taken from the value of the @env{LS_COLORS} +environment variable. +The default is @samp{off}. + +@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-display-width +@vindex completion-display-width +The number of screen columns used to display possible matches +when performing completion. +The value is ignored if it is less than 0 or greater than the terminal +screen width. +A value of 0 will cause matches to be displayed one per line. +The default value is -1. + +@item completion-ignore-case +@vindex 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-map-case +@vindex completion-map-case +If set to @samp{on}, and @var{completion-ignore-case} is enabled, Readline +treats hyphens (@samp{-}) and underscores (@samp{_}) as equivalent when +performing case-insensitive filename matching and completion. +The default value is @samp{off}. + +@item completion-prefix-display-length +@vindex completion-prefix-display-length +The length in characters of the common prefix of a list of possible +completions that is displayed without modification. When set to a +value greater than zero, common prefixes longer than this value are +replaced with an ellipsis when displaying possible completions. + +@item completion-query-items +@vindex completion-query-items +The number of possible completions that determines when the user is +asked whether the list of possibilities should be displayed. +If the number of possible completions is greater than or equal to this value, +Readline will ask whether or not the user wishes to view them; +otherwise, they are simply listed. +This variable must be set to an integer value greater than or equal to zero. +A zero value means Readline should never ask; negative values are +treated as zero. +The default limit is @code{100}. + +@item convert-meta +@vindex convert-meta +If set to @samp{on}, Readline will convert characters with the +eighth bit set to an @sc{ascii} key sequence by stripping the eighth +bit and prefixing an @key{ESC} character, converting them to a +meta-prefixed key sequence. +The default value is @samp{on}, but +will be set to @samp{off} if the locale is one that contains +eight-bit characters. +This variable is dependent on the @code{LC_CTYPE} locale category, and +may change if the locale is changed. + +@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 echo-control-characters +@vindex echo-control-characters +When set to @samp{on}, on operating systems that indicate they support it, +Readline echoes a character corresponding to a signal generated from the +keyboard. The default is @samp{on}. + +@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 emacs-mode-string +@vindex emacs-mode-string +If the @var{show-mode-in-prompt} variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when emacs editing mode is active. The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the @samp{\1} and @samp{\2} escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is @samp{@@}. + +@item enable-active-region +@vindex enable-active-region +The @dfn{point} is the current cursor position, and @dfn{mark} refers +to a saved cursor position (@pxref{Commands For Moving}). +The text between the point and mark is referred to as the @dfn{region}. +When this variable is set to @samp{On}, Readline allows certain commands +to designate the region as @dfn{active}. +When the region is active, Readline highlights the text in the region using +the value of the @code{active-region-start-color}, which defaults to the +string that enables +the terminal's standout mode. +The active region shows the text inserted by bracketed-paste and any +matching text found by incremental and non-incremental history searches. +The default is @samp{On}. + +@item enable-bracketed-paste +@vindex enable-bracketed-paste +When set to @samp{On}, Readline configures the terminal to insert each +paste into the editing buffer as a single string of characters, instead +of treating each character as if it had been read from the keyboard. +This is called putting the terminal into @dfn{bracketed paste mode}; +it prevents Readline from executing any editing commands bound to key +sequences appearing in the pasted text. +The default is @samp{On}. + +@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 enable-meta-key +When set to @samp{on}, Readline will try to enable any meta modifier +key the terminal claims to support when it is called. On many terminals, +the meta key is used to send eight-bit characters. +The default is @samp{on}. + +@item expand-tilde +@vindex expand-tilde +If set to @samp{on}, tilde expansion is performed when Readline +attempts word completion. The default is @samp{off}. + +@item history-preserve-point +@vindex history-preserve-point +If set to @samp{on}, the history code attempts to place the point (the +current cursor position) at the +same location on each history line retrieved with @code{previous-history} +or @code{next-history}. The default is @samp{off}. + +@item history-size +@vindex history-size +Set the maximum number of history entries saved in the history list. +If set to zero, any existing history entries are deleted and no new entries +are saved. +If set to a value less than zero, the number of history entries is not +limited. +By default, the number of history entries is not limited. +If an attempt is made to set @var{history-size} to a non-numeric value, +the maximum number of history entries will be set to 500. + +@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. +This variable is automatically set to @samp{on} for terminals of height 1. +By default, this variable is set to @samp{off}. + +@item input-meta +@vindex input-meta +@vindex meta-flag +If set to @samp{on}, Readline will enable eight-bit input (it +will not clear the eighth bit in the characters it reads), +regardless of what the terminal claims it can support. The +default value is @samp{off}, but Readline will set it to @samp{on} if the +locale contains eight-bit characters. +The name @code{meta-flag} is a synonym for this variable. +This variable is dependent on the @code{LC_CTYPE} locale category, and +may change if the locale is changed. + +@item isearch-terminators +@vindex isearch-terminators +The string of characters that should terminate an incremental search without +subsequently executing the character as a command (@pxref{Searching}). +If this variable has not been given a value, the characters @key{ESC} and +@kbd{C-J} will terminate an incremental search. + +@item keymap +@vindex keymap +Sets Readline's idea of the current keymap for key binding commands. +Built-in @code{keymap} names are +@code{emacs}, +@code{emacs-standard}, +@code{emacs-meta}, +@code{emacs-ctlx}, +@code{vi}, +@code{vi-move}, +@code{vi-command}, and +@code{vi-insert}. +@code{vi} is equivalent to @code{vi-command} (@code{vi-move} is also a +synonym); @code{emacs} is equivalent to @code{emacs-standard}. +Applications may add additional names. +The default value is @code{emacs}. +The value of the @code{editing-mode} variable also affects the +default keymap. + +@item keyseq-timeout +Specifies the duration Readline will wait for a character when reading an +ambiguous key sequence (one that can form a complete key sequence using +the input read so far, or can take additional input to complete a longer +key sequence). +If no input is received within the timeout, Readline will use the shorter +but complete key sequence. +Readline uses this value to determine whether or not input is +available on the current input source (@code{rl_instream} by default). +The value is specified in milliseconds, so a value of 1000 means that +Readline will wait one second for additional input. +If this variable is set to a value less than or equal to zero, or to a +non-numeric value, Readline will wait until another key is pressed to +decide which key sequence to complete. +The default value is @code{500}. + +@item mark-directories +If set to @samp{on}, completed directory names have a slash +appended. The default is @samp{on}. + +@item mark-modified-lines +@vindex mark-modified-lines +This variable, when set to @samp{on}, causes Readline to display an +asterisk (@samp{*}) at the start of history lines which have been modified. +This variable is @samp{off} by default. + +@item mark-symlinked-directories +@vindex mark-symlinked-directories +If set to @samp{on}, completed names which are symbolic links +to directories have a slash appended (subject to the value of +@code{mark-directories}). +The default is @samp{off}. + +@item match-hidden-files +@vindex match-hidden-files +This variable, when set to @samp{on}, causes Readline to match files whose +names begin with a @samp{.} (hidden files) when performing filename +completion. +If set to @samp{off}, the leading @samp{.} must be +supplied by the user in the filename to be completed. +This variable is @samp{on} by default. + +@item menu-complete-display-prefix +@vindex menu-complete-display-prefix +If set to @samp{on}, menu completion displays the common prefix of the +list of possible completions (which may be empty) before cycling through +the list. The default is @samp{off}. + +@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}, but Readline will set it to @samp{on} if the +locale contains eight-bit characters. +This variable is dependent on the @code{LC_CTYPE} locale category, and +may change if the locale is changed. + +@item page-completions +@vindex page-completions +If set to @samp{on}, Readline uses an internal @code{more}-like pager +to display a screenful of possible completions at a time. +This variable is @samp{on} by default. + +@item print-completions-horizontally +If set to @samp{on}, Readline will display completions with matches +sorted horizontally in alphabetical order, rather than down the screen. +The default is @samp{off}. + +@item revert-all-at-newline +@vindex revert-all-at-newline +If set to @samp{on}, Readline will undo all changes to history lines +before returning when @code{accept-line} is executed. By default, +history lines may be modified and retain individual undo lists across +calls to @code{readline()}. The default is @samp{off}. + +@item show-all-if-ambiguous +@vindex show-all-if-ambiguous +This alters the default behavior of the completion functions. If +set to @samp{on}, +words which have more than one possible completion cause the +matches to be listed immediately instead of ringing the bell. +The default value is @samp{off}. + +@item show-all-if-unmodified +@vindex show-all-if-unmodified +This alters the default behavior of the completion functions in +a fashion similar to @var{show-all-if-ambiguous}. +If set to @samp{on}, +words which have more than one possible completion without any +possible partial completion (the possible completions don't share +a common prefix) cause the matches to be listed immediately instead +of ringing the bell. +The default value is @samp{off}. + +@item show-mode-in-prompt +@vindex show-mode-in-prompt +If set to @samp{on}, add a string to the beginning of the prompt +indicating the editing mode: emacs, vi command, or vi insertion. +The mode strings are user-settable (e.g., @var{emacs-mode-string}). +The default value is @samp{off}. + +@item skip-completed-text +@vindex skip-completed-text +If set to @samp{on}, this alters the default completion behavior when +inserting a single match into the line. It's only active when +performing completion in the middle of a word. If enabled, Readline +does not insert characters from the completion that match characters +after point in the word being completed, so portions of the word +following the cursor are not duplicated. +For instance, if this is enabled, attempting completion when the cursor +is after the @samp{e} in @samp{Makefile} will result in @samp{Makefile} +rather than @samp{Makefilefile}, assuming there is a single possible +completion. +The default value is @samp{off}. + +@item vi-cmd-mode-string +@vindex vi-cmd-mode-string +If the @var{show-mode-in-prompt} variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in command mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the @samp{\1} and @samp{\2} escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is @samp{(cmd)}. + +@item vi-ins-mode-string +@vindex vi-ins-mode-string +If the @var{show-mode-in-prompt} variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in insertion mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the @samp{\1} and @samp{\2} escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is @samp{(ins)}. + +@item visible-stats +@vindex visible-stats +If set to @samp{on}, a character denoting a file's type +is appended to the filename when listing possible +completions. The default is @samp{off}. + +@end table + +@item Key Bindings +The syntax for controlling key bindings in the init file is +simple. First you need to find the name of the command that you +want to change. The following sections contain tables of the command +name, the default keybinding, if any, and a short description of what +the command does. + +Once you know the name of the command, simply place on a line +in the init file the name of the key +you wish to bind the command to, a colon, and then the name of the +command. +There can be no space between the key name and the colon -- that will be +interpreted as part of the key name. +The name of the key can be expressed in different ways, depending on +what you find most comfortable. + +In addition to command names, Readline allows keys to be bound +to a string that is inserted when the key is pressed (a @var{macro}). + +@ifset BashFeatures +The @w{@code{bind -p}} command displays Readline function names and +bindings in a format that can be 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 example above, @kbd{C-u} is bound to the function +@code{universal-argument}, +@kbd{M-DEL} is bound to the function @code{backward-kill-word}, and +@kbd{C-o} is bound to run the macro +expressed on the right hand side (that is, to insert the text +@samp{> output} into the line). + +A number of symbolic character names are recognized while +processing this key binding syntax: +@var{DEL}, +@var{ESC}, +@var{ESCAPE}, +@var{LFD}, +@var{NEWLINE}, +@var{RET}, +@var{RETURN}, +@var{RUBOUT}, +@var{SPACE}, +@var{SPC}, +and +@var{TAB}. + +@item @w{"@var{keyseq}": @var{function-name} or @var{macro}} +@var{keyseq} differs from @var{keyname} above in that strings +denoting an entire key sequence can be specified, by placing +the key sequence in double quotes. Some @sc{gnu} Emacs style key +escapes can be used, as in the following example, but the +special character names are not recognized. + +@example +"\C-u": universal-argument +"\C-x\C-r": re-read-init-file +"\e[11~": "Function Key 1" +@end example + +In the above example, @kbd{C-u} is again bound to the function +@code{universal-argument} (just as it was in the first example), +@samp{@kbd{C-x} @kbd{C-r}} is bound to the function @code{re-read-init-file}, +and @samp{@key{ESC} @key{[} @key{1} @key{1} @key{~}} is bound to insert +the text @samp{Function Key 1}. + +@end table + +The following @sc{gnu} Emacs style escape sequences are available when +specifying key sequences: + +@table @code +@item @kbd{\C-} +control prefix +@item @kbd{\M-} +meta prefix +@item @kbd{\e} +an escape character +@item @kbd{\\} +backslash +@item @kbd{\"} +@key{"}, a double quotation mark +@item @kbd{\'} +@key{'}, a single quote or apostrophe +@end table + +In addition to the @sc{gnu} Emacs style escape sequences, a second +set of backslash escapes is available: + +@table @code +@item \a +alert (bell) +@item \b +backspace +@item \d +delete +@item \f +form feed +@item \n +newline +@item \r +carriage return +@item \t +horizontal tab +@item \v +vertical tab +@item \@var{nnn} +the eight-bit character whose value is the octal value @var{nnn} +(one to three digits) +@item \x@var{HH} +the eight-bit character whose value is the hexadecimal value @var{HH} +(one or two hex digits) +@end table + +When entering the text of a macro, single or double quotes must +be used to indicate a macro definition. +Unquoted text is assumed to be a function name. +In the macro body, the backslash escapes described above are expanded. +Backslash will quote any other character in the macro text, +including @samp{"} and @samp{'}. +For example, the following binding will make @samp{@kbd{C-x} \} +insert a single @samp{\} into the line: +@example +"\C-x\\": "\\" +@end example + +@end table + +@node Conditional Init Constructs +@subsection Conditional Init Constructs + +Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key +bindings and variable settings to be performed as the result +of tests. There are four parser directives used. + +@table @code +@item $if +The @code{$if} construct allows bindings to be made based on the +editing mode, the terminal being used, or the application using +Readline. The text of the test, after any comparison operator, +extends to the end of the line; +unless otherwise noted, 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 version +The @code{version} test may be used to perform comparisons against +specific Readline versions. +The @code{version} expands to the current Readline version. +The set of comparison operators includes +@samp{=} (and @samp{==}), @samp{!=}, @samp{<=}, @samp{>=}, @samp{<}, +and @samp{>}. +The version number supplied on the right side of the operator consists +of a major version number, an optional decimal point, and an optional +minor version (e.g., @samp{7.1}). If the minor version is omitted, it +is assumed to be @samp{0}. +The operator may be separated from the string @code{version} and +from the version number argument by whitespace. +The following example sets a variable if the Readline version being used +is 7.0 or newer: +@example +$if version >= 7.0 +set show-mode-in-prompt on +$endif +@end example + +@item application +The @var{application} construct is used to include +application-specific settings. Each program using the Readline +library sets the @var{application name}, and you can test for +a particular value. +This could be used to bind key sequences to functions useful for +a specific program. For instance, the following command adds a +key sequence that quotes the current or previous word in Bash: +@example +$if Bash +# Quote the current or previous word +"\C-xq": "\eb\"\ef\"" +$endif +@end example + +@item variable +The @var{variable} construct provides simple equality tests for Readline +variables and values. +The permitted comparison operators are @samp{=}, @samp{==}, and @samp{!=}. +The variable name must be separated from the comparison operator by +whitespace; the operator may be separated from the value on the right hand +side by whitespace. +Both string and boolean variables may be tested. Boolean variables must be +tested against the values @var{on} and @var{off}. +The following example is equivalent to the @code{mode=emacs} test described +above: +@example +$if editing-mode == emacs +set show-mode-in-prompt on +$endif +@end example +@end table + +@item $endif +This command, as seen in the previous example, terminates an +@code{$if} command. + +@item $else +Commands in this branch of the @code{$if} directive are executed if +the test fails. + +@item $include +This directive takes a single filename as an argument and reads commands +and bindings from that file. +For example, the following directive reads from @file{/etc/inputrc}: +@example +$include /etc/inputrc +@end example +@end table + +@node Sample Init File +@subsection Sample Init File + +Here is an example of an @var{inputrc} file. This illustrates key +binding, variable assignment, and conditional syntax. + +@example +@page +# This file controls the behaviour of line input editing for +# programs that use the GNU Readline library. Existing +# programs include FTP, Bash, and GDB. +# +# You can re-read the inputrc file with C-x C-r. +# Lines beginning with '#' are comments. +# +# First, include any system-wide 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 150 or more possible completions for a word, +# ask whether or not the user wants to see all of them +set completion-query-items 150 + +# For FTP +$if Ftp +"\C-xg": "get \M-?" +"\C-xt": "put \M-?" +"\M-.": yank-last-arg +$endif +@end example + +@node Bindable Readline Commands +@section Bindable Readline Commands + +@menu +* Commands For Moving:: Moving about the line. +* Commands For History:: Getting at previous lines. +* Commands For Text:: Commands for changing text. +* Commands For Killing:: Commands for killing and yanking. +* Numeric Arguments:: Specifying numeric arguments, repeat counts. +* Commands For Completion:: Getting Readline to do the typing for you. +* Keyboard Macros:: Saving and re-executing typed characters +* Miscellaneous Commands:: Other miscellaneous commands. +@end menu + +This section describes Readline commands that may be bound to key +sequences. +@ifset BashFeatures +You can list your key bindings by executing +@w{@code{bind -P}} or, for a more terse format, suitable for an +@var{inputrc} file, @w{@code{bind -p}}. (@xref{Bash Builtins}.) +@end ifset +Command names without an accompanying key sequence are unbound by default. + +In the following descriptions, @dfn{point} refers to the current cursor +position, and @dfn{mark} refers to a cursor position saved by the +@code{set-mark} command. +The text between the point and mark is referred to as the @dfn{region}. + +@node Commands For Moving +@subsection Commands For Moving +@ftable @code +@item beginning-of-line (C-a) +Move to the start of the current line. + +@item end-of-line (C-e) +Move to the end of the line. + +@item forward-char (C-f) +Move forward a character. + +@item backward-char (C-b) +Move back a character. + +@item forward-word (M-f) +Move forward to the end of the next word. +Words are composed of letters and digits. + +@item backward-word (M-b) +Move back to the start of the current or previous word. +Words are composed of letters and digits. + +@ifset BashFeatures +@item shell-forward-word (M-C-f) +Move forward to the end of the next word. +Words are delimited by non-quoted shell metacharacters. + +@item shell-backward-word (M-C-b) +Move back to the start of the current or previous word. +Words are delimited by non-quoted shell metacharacters. +@end ifset + +@item previous-screen-line () +Attempt to move point to the same physical screen column on the previous +physical screen line. This will not have the desired effect if the current +Readline line does not take up more than one physical line or if point is not +greater than the length of the prompt plus the screen width. + +@item next-screen-line () +Attempt to move point to the same physical screen column on the next +physical screen line. This will not have the desired effect if the current +Readline line does not take up more than one physical line or if the length +of the current Readline line is not greater than the length of the prompt +plus the screen width. + +@item clear-display (M-C-l) +Clear the screen and, if possible, the terminal's scrollback buffer, +then redraw the current line, +leaving the current line at the top of the screen. + +@item clear-screen (C-l) +Clear the screen, +then redraw the current line, +leaving the current line at the top of the screen. + +@item redraw-current-line () +Refresh the current line. By default, this is unbound. + +@end ftable + +@node Commands For History +@subsection Commands For Manipulating The History + +@ftable @code +@item accept-line (Newline or Return) +@ifset BashFeatures +Accept the line regardless of where the cursor is. +If this line is +non-empty, add it to the history list according to the setting of +the @env{HISTCONTROL} and @env{HISTIGNORE} variables. +If this line is a modified history line, then restore the history line +to its original state. +@end ifset +@ifclear BashFeatures +Accept the line regardless of where the cursor is. +If this line is +non-empty, it may be added to the history list for future recall with +@code{add_history()}. +If this line is a modified history line, the history line is restored +to its original state. +@end ifclear + +@item previous-history (C-p) +Move `back' through the history list, fetching the previous command. + +@item next-history (C-n) +Move `forward' through the history list, fetching the next command. + +@item beginning-of-history (M-<) +Move to the first line in the history. + +@item end-of-history (M->) +Move to the end of the input history, i.e., the line currently +being entered. + +@item reverse-search-history (C-r) +Search backward starting at the current line and moving `up' through +the history as necessary. This is an incremental search. +This command sets the region to the matched text and activates the mark. + +@item 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. +This command sets the region to the matched text and activates the mark. + +@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. +The search string may match anywhere in a history line. + +@item non-incremental-forward-search-history (M-n) +Search forward starting at the current line and moving `down' +through the history as necessary using a non-incremental search +for a string supplied by the user. +The search string may match anywhere in a history line. + +@item history-search-forward () +Search forward through the history for the string of characters +between the start of the current line and the point. +The search string must match at the beginning of a history line. +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. +The search string must match at the beginning of a history line. +This is a non-incremental search. +By default, this command is unbound. + +@item history-substring-search-forward () +Search forward through the history for the string of characters +between the start of the current line and the point. +The search string may match anywhere in a history line. +This is a non-incremental search. +By default, this command is unbound. + +@item history-substring-search-backward () +Search backward through the history for the string of characters +between the start of the current line and the point. +The search string may match anywhere in a history line. +This is a non-incremental search. +By default, this command is unbound. + +@item yank-nth-arg (M-C-y) +Insert the first argument to the previous command (usually +the second word on the previous line) at point. +With an argument @var{n}, +insert the @var{n}th word from the previous command (the words +in the previous command begin with word 0). A negative argument +inserts the @var{n}th word from the end of the previous command. +Once the argument @var{n} is computed, the argument is extracted +as if the @samp{!@var{n}} history expansion had been specified. + +@item yank-last-arg (M-. or M-_) +Insert last argument to the previous command (the last word of the +previous history entry). +With a numeric argument, behave exactly like @code{yank-nth-arg}. +Successive calls to @code{yank-last-arg} move back through the history +list, inserting the last word (or the word specified by the argument to +the first call) of each line in turn. +Any numeric argument supplied to these successive calls determines +the direction to move through the history. A negative argument switches +the direction through the history (back or forward). +The history expansion facilities are used to extract the last argument, +as if the @samp{!$} history expansion had been specified. + +@item operate-and-get-next (C-o) +Accept the current line for return to the calling application as if a +newline had been entered, +and fetch the next line relative to the current line from the history +for editing. +A numeric argument, if supplied, specifies the history entry to use instead +of the current line. + +@item fetch-history () +With a numeric argument, fetch that entry from the history list +and make it the current line. +Without an argument, move back to the first entry in the history list. + +@end ftable + +@node Commands For Text +@subsection Commands For Changing Text + +@ftable @code + +@item @i{end-of-file} (usually C-d) +The character indicating end-of-file as set, for example, by +@code{stty}. If this character is read when there are no characters +on the line, and point is at the beginning of the line, Readline +interprets it as the end of input and returns @sc{eof}. + +@item delete-char (C-d) +Delete the character at point. If this function is bound to the +same character as the tty @sc{eof} character, as @kbd{C-d} +commonly is, see above for the effects. + +@item backward-delete-char (Rubout) +Delete the character behind the cursor. A numeric argument means +to kill the characters instead of deleting them. + +@item forward-backward-delete-char () +Delete the character under the cursor, unless the cursor is at the +end of the line, in which case the character behind the cursor is +deleted. By default, this is not bound to a key. + +@item quoted-insert (C-q or C-v) +Add the next character typed to the line verbatim. This is +how to insert key sequences like @kbd{C-q}, for example. + +@ifclear BashFeatures +@item tab-insert (M-@key{TAB}) +Insert a tab character. +@end ifclear + +@item self-insert (a, b, A, 1, !, @dots{}) +Insert yourself. + +@item bracketed-paste-begin () +This function is intended to be bound to the "bracketed paste" escape +sequence sent by some terminals, and such a binding is assigned by default. +It allows Readline to insert the pasted text as a single unit without treating +each character as if it had been read from the keyboard. The characters +are inserted as if each one was bound to @code{self-insert} instead of +executing any editing commands. + +Bracketed paste sets the region (the characters between point and the mark) +to the inserted text. It uses the concept of an @emph{active mark}: when the +mark is active, Readline redisplay uses the terminal's standout mode to +denote the region. + +@item transpose-chars (C-t) +Drag the character before the cursor forward over +the character at the cursor, moving the +cursor forward as well. If the insertion point +is at the end of the line, then this +transposes the last two characters of the line. +Negative arguments have no effect. + +@item transpose-words (M-t) +Drag the word before point past the word after point, +moving point past that word as well. +If the insertion point is at the end of the line, this transposes +the last two words on the line. + +@item upcase-word (M-u) +Uppercase the current (or following) word. With a negative argument, +uppercase the previous word, but do not move the cursor. + +@item downcase-word (M-l) +Lowercase the current (or following) word. With a negative argument, +lowercase the previous word, but do not move the cursor. + +@item capitalize-word (M-c) +Capitalize the current (or following) word. With a negative argument, +capitalize the previous word, but do not move the cursor. + +@item overwrite-mode () +Toggle overwrite mode. With an explicit positive numeric argument, +switches to overwrite mode. With an explicit non-positive numeric +argument, switches to insert mode. This command affects only +@code{emacs} mode; @code{vi} mode does overwrite differently. +Each call to @code{readline()} starts in insert mode. + +In overwrite mode, characters bound to @code{self-insert} replace +the text at point rather than pushing the text to the right. +Characters bound to @code{backward-delete-char} replace the character +before point with a space. + +By default, this command is unbound. + +@end ftable + +@node Commands For Killing +@subsection Killing And Yanking + +@ftable @code + +@item kill-line (C-k) +Kill the text from point to the end of the line. +With a negative numeric argument, kill backward from the cursor to the +beginning of the current line. + +@item backward-kill-line (C-x Rubout) +Kill backward from the cursor to the beginning of the current line. +With a negative numeric argument, kill forward from the cursor to the +end of the current line. + +@item unix-line-discard (C-u) +Kill backward from the cursor to the beginning of the current line. + +@item kill-whole-line () +Kill all characters on the current line, no matter where point is. +By default, this is unbound. + +@item kill-word (M-d) +Kill from point to the end of the current word, or if between +words, to the end of the next word. +Word boundaries are the same as @code{forward-word}. + +@item backward-kill-word (M-@key{DEL}) +Kill the word behind point. +Word boundaries are the same as @code{backward-word}. + +@ifset BashFeatures +@item shell-kill-word (M-C-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{shell-forward-word}. + +@item shell-backward-kill-word () +Kill the word behind point. +Word boundaries are the same as @code{shell-backward-word}. +@end ifset + +@item shell-transpose-words (M-C-t) +Drag the word before point past the word after point, +moving point past that word as well. +If the insertion point is at the end of the line, this transposes +the last two words on the line. +Word boundaries are the same as @code{shell-forward-word} and +@code{shell-backward-word}. + +@item unix-word-rubout (C-w) +Kill the word behind point, using white space as a word boundary. +The killed text is saved on the kill-ring. + +@item unix-filename-rubout () +Kill the word behind point, using white space and the slash character +as the word boundaries. +The killed text is saved on the kill-ring. + +@item delete-horizontal-space () +Delete all spaces and tabs around point. By default, this is unbound. + +@item kill-region () +Kill the text in the current region. +By default, this command is unbound. + +@item copy-region-as-kill () +Copy the text in the region to the kill buffer, so it can be yanked +right away. By default, this command is unbound. + +@item copy-backward-word () +Copy the word before point to the kill buffer. +The word boundaries are the same as @code{backward-word}. +By default, this command is unbound. + +@item copy-forward-word () +Copy the word following point to the kill buffer. +The word boundaries are the same as @code{forward-word}. +By default, this command is unbound. + +@item yank (C-y) +Yank the top of the kill ring into the buffer at point. + +@item yank-pop (M-y) +Rotate the kill-ring, and yank the new top. You can only do this if +the prior command is @code{yank} or @code{yank-pop}. +@end ftable + +@node Numeric Arguments +@subsection Specifying Numeric Arguments +@ftable @code + +@item digit-argument (@kbd{M-0}, @kbd{M-1}, @dots{} @kbd{M--}) +Add this digit to the argument already accumulating, or start a new +argument. @kbd{M--} starts a negative argument. + +@item universal-argument () +This is another way to specify an argument. +If this command is followed by one or more digits, optionally with a +leading minus sign, those digits define the argument. +If the command is followed by digits, executing @code{universal-argument} +again ends the numeric argument, but is otherwise ignored. +As a special case, if this command is immediately followed by a +character that is neither a digit nor minus sign, the argument count +for the next command is multiplied by four. +The argument count is initially one, so executing this function the +first time makes the argument count four, a second time makes the +argument count sixteen, and so on. +By default, this is not bound to a key. +@end ftable + +@node Commands For Completion +@subsection Letting Readline Type For You + +@ftable @code +@item complete (@key{TAB}) +Attempt to perform completion on the text before point. +The actual completion performed is application-specific. +@ifset BashFeatures +Bash attempts completion treating the text as a variable (if the +text begins with @samp{$}), username (if the text begins with +@samp{~}), hostname (if the text begins with @samp{@@}), or +command (including aliases and functions) in turn. If none +of these produces a match, filename completion is attempted. +@end ifset +@ifclear BashFeatures +The default is filename completion. +@end ifclear + +@item possible-completions (M-?) +List the possible completions of the text before point. +When displaying completions, Readline sets the number of columns used +for display to the value of @code{completion-display-width}, the value of +the environment variable @env{COLUMNS}, or the screen width, in that order. + +@item insert-completions (M-*) +Insert all completions of the text before point that would have +been generated by @code{possible-completions}. + +@item menu-complete () +Similar to @code{complete}, but replaces the word to be completed +with a single match from the list of possible completions. +Repeated execution of @code{menu-complete} steps through the list +of possible completions, inserting each match in turn. +At the end of the list of completions, the bell is rung +(subject to the setting of @code{bell-style}) +and the original text is restored. +An argument of @var{n} moves @var{n} positions forward in the list +of matches; a negative argument may be used to move backward +through the list. +This command is intended to be bound to @key{TAB}, but is unbound +by default. + +@item menu-complete-backward () +Identical to @code{menu-complete}, but moves backward through the list +of possible completions, as if @code{menu-complete} had been given a +negative argument. + +@item delete-char-or-list () +Deletes the character under the cursor if not at the beginning or +end of the line (like @code{delete-char}). +If at the end of the line, behaves identically to +@code{possible-completions}. +This command is unbound by default. + +@ifset BashFeatures +@item complete-filename (M-/) +Attempt filename completion on the text before point. + +@item possible-filename-completions (C-x /) +List the possible completions of the text before point, +treating it as a filename. + +@item complete-username (M-~) +Attempt completion on the text before point, treating +it as a username. + +@item possible-username-completions (C-x ~) +List the possible completions of the text before point, +treating it as a username. + +@item complete-variable (M-$) +Attempt completion on the text before point, treating +it as a shell variable. + +@item possible-variable-completions (C-x $) +List the possible completions of the text before point, +treating it as a shell variable. + +@item complete-hostname (M-@@) +Attempt completion on the text before point, treating +it as a hostname. + +@item possible-hostname-completions (C-x @@) +List the possible completions of the text before point, +treating it as a hostname. + +@item complete-command (M-!) +Attempt completion on the text before point, treating +it as a command name. Command completion attempts to +match the text against aliases, reserved words, shell +functions, shell builtins, and finally executable filenames, +in that order. + +@item possible-command-completions (C-x !) +List the possible completions of the text before point, +treating it as a command name. + +@item dynamic-complete-history (M-@key{TAB}) +Attempt completion on the text before point, comparing +the text against lines from the history list for possible +completion matches. + +@item dabbrev-expand () +Attempt menu 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. + +@item print-last-kbd-macro () +Print the last keyboard macro defined in a format suitable for the +@var{inputrc} file. + +@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-lowercase-version (M-A, M-B, M-@var{x}, @dots{}) +If the metafied character @var{x} is upper case, run the command +that is bound to the corresponding metafied lower case character. +The behavior is undefined if @var{x} is already lower case. + +@item prefix-meta (@key{ESC}) +Metafy the next character typed. This is for keyboards +without a meta key. Typing @samp{@key{ESC} f} is equivalent to typing +@kbd{M-f}. + +@item undo (C-_ or C-x C-u) +Incremental undo, separately remembered for each line. + +@item revert-line (M-r) +Undo all changes made to this line. This is like executing the @code{undo} +command enough times to get back to the beginning. + +@ifset BashFeatures +@item tilde-expand (M-&) +@end ifset +@ifclear BashFeatures +@item tilde-expand (M-~) +@end ifclear +Perform tilde expansion on the current word. + +@item set-mark (C-@@) +Set the mark to the point. If a +numeric argument is supplied, the mark is set to that position. + +@item exchange-point-and-mark (C-x C-x) +Swap the point with the mark. The current cursor position is set to +the saved position, and the old cursor position is saved as the mark. + +@item character-search (C-]) +A character is read and point is moved to the next occurrence of that +character. A negative argument 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 argument searches for subsequent +occurrences. + +@item skip-csi-sequence () +Read enough characters to consume a multi-key sequence such as those +defined for keys like Home and End. Such sequences begin with a +Control Sequence Indicator (CSI), usually ESC-[. If this sequence is +bound to "\e[", keys producing such sequences will have no effect +unless explicitly bound to a Readline command, instead of inserting +stray characters into the editing buffer. This is unbound by default, +but usually bound to ESC-[. + +@item insert-comment (M-#) +Without a numeric argument, the value of the @code{comment-begin} +variable is inserted at the beginning of the current line. +If a numeric argument is supplied, this command acts as a toggle: if +the characters at the beginning of the line do not match the value +of @code{comment-begin}, the value is inserted, otherwise +the characters in @code{comment-begin} are deleted from the beginning of +the line. +In either case, the line is accepted as if a newline had been typed. +@ifset BashFeatures +The default value of @code{comment-begin} causes this command +to make the current line a shell comment. +If a numeric argument causes the comment character to be removed, the line +will be executed by the shell. +@end ifset + +@item dump-functions () +Print all of the functions and their key bindings to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an @var{inputrc} file. This command is unbound by default. + +@item dump-variables () +Print all of the settable variables and their values to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an @var{inputrc} file. This command is unbound by default. + +@item dump-macros () +Print all of the Readline key sequences bound to macros and the +strings they output. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an @var{inputrc} file. This command is unbound by default. + +@ifset BashFeatures +@item spell-correct-word (C-x s) +Perform spelling correction on the current word, treating it as a directory +or filename, in the same way as the @code{cdspell} shell option. +Word boundaries are the same as those used by @code{shell-forward-word}. + +@item glob-complete-word (M-g) +The word before point is treated as a pattern for pathname expansion, +with an asterisk implicitly appended. This pattern is used to +generate a list of matching file names for possible completions. + +@item glob-expand-word (C-x *) +The word before point is treated as a pattern for pathname expansion, +and the list of matching file names is inserted, replacing the word. +If a numeric argument is supplied, a @samp{*} is appended before +pathname expansion. + +@item glob-list-expansions (C-x g) +The list of expansions that would have been generated by +@code{glob-expand-word} is displayed, and the line is redrawn. +If a numeric argument is supplied, a @samp{*} is appended before +pathname expansion. + +@item display-shell-version (C-x C-v) +Display version information about the current instance of Bash. + +@item shell-expand-line (M-C-e) +Expand the line as the shell does. +This performs alias and history expansion as well as all of the shell +word expansions (@pxref{Shell Expansions}). + +@item history-expand-line (M-^) +Perform history expansion on the current line. + +@item magic-space () +Perform history expansion on the current line and insert a space +(@pxref{History Interaction}). + +@item alias-expand-line () +Perform alias expansion on the current line (@pxref{Aliases}). + +@item history-and-alias-expand-line () +Perform history and alias expansion on the current line. + +@item insert-last-argument (M-. or M-_) +A synonym for @code{yank-last-arg}. + +@item edit-and-execute-command (C-x C-e) +Invoke an editor on the current command line, and execute the result as shell +commands. +Bash attempts to invoke +@code{$VISUAL}, @code{$EDITOR}, and @code{emacs} +as the editor, in that order. + +@end ifset + +@ifclear BashFeatures +@item emacs-editing-mode (C-e) +When in @code{vi} command mode, this causes a switch to @code{emacs} +editing mode. + +@item vi-editing-mode (M-C-j) +When in @code{emacs} editing mode, this causes a switch to @code{vi} +editing mode. + +@end ifclear + +@end ftable + +@node Readline vi Mode +@section Readline vi Mode + +While the Readline library does not have a full set of @code{vi} +editing functions, it does contain enough to allow simple editing +of the line. The Readline @code{vi} mode behaves as specified in +the @sc{posix} standard. + +@ifset BashFeatures +In order to switch interactively between @code{emacs} and @code{vi} +editing modes, use the @samp{set -o emacs} and @samp{set -o vi} +commands (@pxref{The Set Builtin}). +@end ifset +@ifclear BashFeatures +In order to switch interactively between @code{emacs} and @code{vi} +editing modes, use the command @kbd{M-C-j} (bound to emacs-editing-mode +when in @code{vi} mode and to vi-editing-mode in @code{emacs} mode). +@end ifclear +The Readline default is @code{emacs} mode. + +When you enter a line in @code{vi} mode, you are already placed in +`insertion' mode, as if you had typed an @samp{i}. Pressing @key{ESC} +switches you into `command' mode, where you can edit the text of the +line with the standard @code{vi} movement keys, move to previous +history lines with @samp{k} and subsequent lines with @samp{j}, and +so forth. + +@ifset BashFeatures +@node Programmable Completion +@section Programmable Completion +@cindex programmable completion + +When word completion is attempted for an argument to a command for +which a completion specification (a @var{compspec}) has been defined +using the @code{complete} builtin (@pxref{Programmable Completion Builtins}), +the programmable completion facilities are invoked. + +First, the command name is identified. +If a compspec has been defined for that command, the +compspec is used to generate the list of possible completions for the word. +If the command word is the empty string (completion attempted at the +beginning of an empty line), any compspec defined with +the @option{-E} option to @code{complete} is used. +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. +If those searches do not result in a compspec, any compspec defined with +the @option{-D} option to @code{complete} is used as the default. +If there is no default compspec, Bash attempts alias expansion +on the command word as a final resort, and attempts to find a compspec +for the command word from any successful expansion + +Once a compspec has been found, it is used to generate the list of +matching words. +If a compspec is not found, the default Bash completion +described above (@pxref{Commands For Completion}) is performed. + +First, the actions specified by the compspec are used. +Only matches which are prefixed by the word being completed are +returned. +When the @option{-f} or @option{-d} option is used for filename or +directory name completion, the shell variable @env{FIGNORE} is +used to filter the matches. +@xref{Bash Variables}, for a description of @env{FIGNORE}. + +Any completions specified by a filename expansion pattern to the +@option{-G} option are generated next. +The words generated by the pattern need not match the word being completed. +The @env{GLOBIGNORE} shell variable is not used to filter the matches, +but the @env{FIGNORE} shell variable is used. + +Next, the string specified as the argument to the @option{-W} option +is considered. +The string is first split using the characters in the @env{IFS} +special variable as delimiters. +Shell quoting is honored within the string, in order to provide a +mechanism for the words to contain shell metacharacters or characters +in the value of @env{IFS}. +Each word is then expanded using +brace expansion, tilde expansion, parameter and variable expansion, +command substitution, and arithmetic expansion, +as described above (@pxref{Shell Expansions}). +The results are split using the rules described above +(@pxref{Word Splitting}). +The results of the expansion are prefix-matched against the word being +completed, and the matching words become the possible completions. + +After these matches have been generated, any shell function or command +specified with the @option{-F} and @option{-C} options is invoked. +When the command or function is invoked, the @env{COMP_LINE}, +@env{COMP_POINT}, @env{COMP_KEY}, and @env{COMP_TYPE} variables are +assigned values as described above (@pxref{Bash Variables}). +If a shell function is being invoked, the @env{COMP_WORDS} and +@env{COMP_CWORD} variables are also set. +When the function or command is invoked, the first argument ($1) is the +name of the command whose arguments are being completed, the +second argument ($2) is the word being completed, and the third argument +($3) is the word preceding the word being completed on the current command +line. +No filtering of the generated completions against the word being completed +is performed; the function or command has complete freedom in generating +the matches. + +Any function specified with @option{-F} is invoked first. +The function may use any of the shell facilities, including the +@code{compgen} and @code{compopt} builtins described below +(@pxref{Programmable Completion Builtins}), to generate the matches. +It must put the possible completions in the @env{COMPREPLY} array +variable, one per array element. + +Next, any command specified with the @option{-C} option is invoked +in an environment equivalent to command substitution. +It should print a list of completions, one per line, to +the standard output. +Backslash may be used to escape a newline, if necessary. + +After all of the possible completions are generated, any filter +specified with the @option{-X} option is applied to the list. +The filter is a pattern as used for pathname expansion; a @samp{&} +in the pattern is replaced with the text of the word being completed. +A literal @samp{&} may be escaped with a backslash; the backslash +is removed before attempting a match. +Any completion that matches the pattern will be removed from the list. +A leading @samp{!} negates the pattern; in this case any completion +not matching the pattern will be removed. +If the @code{nocasematch} shell option +(see the description of @code{shopt} in @ref{The Shopt Builtin}) +is enabled, the match is performed without regard to the case +of alphabetic characters. + +Finally, any prefix and suffix specified with the @option{-P} and @option{-S} +options are added to each member of the completion list, and the result is +returned to the Readline completion code as the list of possible +completions. + +If the previously-applied actions do not generate any matches, and the +@option{-o dirnames} option was supplied to @code{complete} when the +compspec was defined, directory name completion is attempted. + +If the @option{-o plusdirs} option was supplied to @code{complete} when +the compspec was defined, directory name completion is attempted and any +matches are added to the results of the other actions. + +By default, if a compspec is found, whatever it generates is returned to +the completion code as the full set of possible completions. +The default Bash completions are not attempted, and the Readline default +of filename completion is disabled. +If the @option{-o bashdefault} option was supplied to @code{complete} when +the compspec was defined, the default Bash completions are attempted +if the compspec generates no matches. +If the @option{-o default} option was supplied to @code{complete} when the +compspec was defined, Readline's default completion will be performed +if the compspec (and, if attempted, the default Bash completions) +generate no matches. + +When a compspec indicates that directory name completion is desired, +the programmable completion functions force Readline to append a slash +to completed names which are symbolic links to directories, subject to +the value of the @var{mark-directories} Readline variable, regardless +of the setting of the @var{mark-symlinked-directories} Readline variable. + +There is some support for dynamically modifying completions. This is +most useful when used in combination with a default completion specified +with @option{-D}. It's possible for shell functions executed as completion +handlers to indicate that completion should be retried by returning an +exit status of 124. If a shell function returns 124, and changes +the compspec associated with the command on which completion is being +attempted (supplied as the first argument when the function is executed), +programmable completion restarts from the beginning, with an +attempt to find a new compspec for that command. This allows a set of +completions to be built dynamically as completion is attempted, rather than +being loaded all at once. + +For instance, assuming that there is a library of compspecs, each kept in a +file corresponding to the name of the command, the following default +completion function would load completions dynamically: + +@example +_completion_loader() +@{ + . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124 +@} +complete -D -F _completion_loader -o bashdefault -o default +@end example + +@node Programmable Completion Builtins +@section Programmable Completion Builtins +@cindex completion builtins + +Three builtin commands are available to manipulate the programmable completion +facilities: one to specify how the arguments to a particular command are to +be completed, and two to modify the completion as it is happening. + +@table @code +@item compgen +@btindex compgen +@example +@code{compgen [@var{option}] [@var{word}]} +@end example + +Generate possible completion matches for @var{word} according to +the @var{option}s, which may be any option accepted by the +@code{complete} +builtin with the exception of @option{-p} and @option{-r}, and write +the matches to the standard output. +When using the @option{-F} or @option{-C} options, the various shell variables +set by the programmable completion facilities, while available, will not +have useful values. + +The matches will be generated in the same way as if the programmable +completion code had generated them directly from a completion specification +with the same flags. +If @var{word} is specified, only those completions matching @var{word} +will be displayed. + +The return value is true unless an invalid option is supplied, or no +matches were generated. + +@item complete +@btindex complete +@example +@code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-DEI] [-A @var{action}] [-G @var{globpat}] +[-W @var{wordlist}] [-F @var{function}] [-C @var{command}] [-X @var{filterpat}] +[-P @var{prefix}] [-S @var{suffix}] @var{name} [@var{name} @dots{}]} +@code{complete -pr [-DEI] [@var{name} @dots{}]} +@end example + +Specify how arguments to each @var{name} should be completed. +If the @option{-p} option is supplied, or if no options are supplied, existing +completion specifications are printed in a way that allows them to be +reused as input. +The @option{-r} option removes a completion specification for +each @var{name}, or, if no @var{name}s are supplied, all +completion specifications. +The @option{-D} option indicates that other supplied options and actions should +apply to the ``default'' command completion; that is, completion attempted +on a command for which no completion has previously been defined. +The @option{-E} option indicates that other supplied options and actions should +apply to ``empty'' command completion; that is, completion attempted on a +blank line. +The @option{-I} option indicates that other supplied options and actions should +apply to completion on the initial non-assignment word on the line, or after a +command delimiter such as @samp{;} or @samp{|}, which is usually command +name completion. +If multiple options are supplied, the @option{-D} option takes precedence +over @option{-E}, and both take precedence over @option{-I}. +If any of @option{-D}, @option{-E}, or @option{-I} are supplied, any other +@var{name} arguments are ignored; these completions only apply to the case +specified by the option. + +The process of applying these completion specifications when word completion +is attempted is described above (@pxref{Programmable Completion}). + +Other options, if specified, have the following meanings. +The arguments to the @option{-G}, @option{-W}, and @option{-X} options +(and, if necessary, the @option{-P} and @option{-S} options) +should be quoted to protect them from expansion before the +@code{complete} builtin is invoked. + + +@table @code +@item -o @var{comp-option} +The @var{comp-option} controls several aspects of the compspec's behavior +beyond the simple generation of completions. +@var{comp-option} may be one of: + +@table @code + +@item bashdefault +Perform the rest of the default Bash completions if the compspec +generates no matches. + +@item default +Use Readline's default filename completion if the compspec generates +no matches. + +@item dirnames +Perform directory name completion if the compspec generates no matches. + +@item filenames +Tell Readline that the compspec generates filenames, so it can perform any +filename-specific processing (like adding a slash to directory names, +quoting special characters, or suppressing trailing spaces). +This option is intended to be used with shell functions specified +with @option{-F}. + +@item noquote +Tell Readline not to quote the completed words if they are filenames +(quoting filenames is the default). + +@item nosort +Tell Readline not to sort the list of possible completions alphabetically. + +@item nospace +Tell Readline not to append a space (the default) to words completed at +the end of the line. + +@item plusdirs +After any matches defined by the compspec are generated, +directory name completion is attempted and any +matches are added to the results of the other actions. + +@end table + +@item -A @var{action} +The @var{action} may be one of the following to generate a list of possible +completions: + +@table @code +@item alias +Alias names. May also be specified as @option{-a}. + +@item arrayvar +Array variable names. + +@item binding +Readline key binding names (@pxref{Bindable Readline Commands}). + +@item builtin +Names of shell builtin commands. May also be specified as @option{-b}. + +@item command +Command names. May also be specified as @option{-c}. + +@item directory +Directory names. May also be specified as @option{-d}. + +@item disabled +Names of disabled shell builtins. + +@item enabled +Names of enabled shell builtins. + +@item export +Names of exported shell variables. May also be specified as @option{-e}. + +@item file +File names. May also be specified as @option{-f}. + +@item function +Names of shell functions. + +@item group +Group names. May also be specified as @option{-g}. + +@item helptopic +Help topics as accepted by the @code{help} builtin (@pxref{Bash Builtins}). + +@item hostname +Hostnames, as taken from the file specified by the +@env{HOSTFILE} shell variable (@pxref{Bash Variables}). + +@item job +Job names, if job control is active. May also be specified as @option{-j}. + +@item keyword +Shell reserved words. May also be specified as @option{-k}. + +@item running +Names of running jobs, if job control is active. + +@item service +Service names. May also be specified as @option{-s}. + +@item setopt +Valid arguments for the @option{-o} option to the @code{set} builtin +(@pxref{The Set Builtin}). + +@item shopt +Shell option names as accepted by the @code{shopt} builtin +(@pxref{Bash Builtins}). + +@item signal +Signal names. + +@item stopped +Names of stopped jobs, if job control is active. + +@item user +User names. May also be specified as @option{-u}. + +@item variable +Names of all shell variables. May also be specified as @option{-v}. +@end table + +@item -C @var{command} +@var{command} is executed in a subshell environment, and its output is +used as the possible completions. +Arguments are passed as with the @option{-F} option. + +@item -F @var{function} +The shell function @var{function} is executed in the current shell +environment. +When it is executed, $1 is the name of the command whose arguments are +being completed, $2 is the word being completed, and $3 is the word +preceding the word being completed, as described above +(@pxref{Programmable Completion}). +When it finishes, the possible completions are retrieved from the value +of the @env{COMPREPLY} array variable. + +@item -G @var{globpat} +The filename expansion pattern @var{globpat} is expanded to generate +the possible completions. + +@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. + +@item -W @var{wordlist} +The @var{wordlist} is split using the characters in the +@env{IFS} special variable as delimiters, and each resultant word +is expanded. +The possible completions are the members of the resultant list which +match the word being completed. + +@item -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. +@end table + +The return value is true unless an invalid option is supplied, an option +other than @option{-p} or @option{-r} is supplied without a @var{name} +argument, an attempt is made to remove a completion specification for +a @var{name} for which no specification exists, or +an error occurs adding a completion specification. + +@item compopt +@btindex compopt +@example +@code{compopt} [-o @var{option}] [-DEI] [+o @var{option}] [@var{name}] +@end example +Modify completion options for each @var{name} according to the +@var{option}s, or for the currently-executing completion if no @var{name}s +are supplied. +If no @var{option}s are given, display the completion options for each +@var{name} or the current completion. +The possible values of @var{option} are those valid for the @code{complete} +builtin described above. +The @option{-D} option indicates that other supplied options should +apply to the ``default'' command completion; that is, completion attempted +on a command for which no completion has previously been defined. +The @option{-E} option indicates that other supplied options should +apply to ``empty'' command completion; that is, completion attempted on a +blank line. +The @option{-I} option indicates that other supplied options should +apply to completion on the initial non-assignment word on the line, or after a +command delimiter such as @samp{;} or @samp{|}, which is usually command +name completion. + +If multiple options are supplied, the @option{-D} option takes precedence +over @option{-E}, and both take precedence over @option{-I} + +The return value is true unless an invalid option is supplied, an attempt +is made to modify the options for a @var{name} for which no completion +specification exists, or an output error occurs. + +@end table + +@node A Programmable Completion Example +@section A Programmable Completion Example + +The most common way to obtain additional completion functionality beyond +the default actions @code{complete} and @code{compgen} provide is to use +a shell function and bind it to a particular command using @code{complete -F}. + +The following function provides completions for the @code{cd} builtin. +It is a reasonably good example of what shell functions must do when +used for completion. This function uses the word passed as @code{$2} +to determine the directory name to complete. You can also use the +@code{COMP_WORDS} array variable; the current word is indexed by the +@code{COMP_CWORD} variable. + +The function relies on the @code{complete} and @code{compgen} builtins +to do much of the work, adding only the things that the Bash @code{cd} +does beyond accepting basic directory names: +tilde expansion (@pxref{Tilde Expansion}), +searching directories in @var{$CDPATH}, which is described above +(@pxref{Bourne Shell Builtins}), +and basic support for the @code{cdable_vars} shell option +(@pxref{The Shopt Builtin}). +@code{_comp_cd} modifies the value of @var{IFS} so that it contains only +a newline to accommodate file names containing spaces and tabs -- +@code{compgen} prints the possible completions it generates one per line. + +Possible completions go into the @var{COMPREPLY} array variable, one +completion per array element. The programmable completion system retrieves +the completions from there when the function returns. + +@example +# A completion function for the cd builtin +# based on the cd completion function from the bash_completion package +_comp_cd() +@{ + local IFS=$' \t\n' # normalize IFS + local cur _skipdot _cdpath + local i j k + + # Tilde expansion, which also expands tilde to full pathname + case "$2" in + \~*) eval cur="$2" ;; + *) cur=$2 ;; + esac + + # no cdpath or absolute pathname -- straight directory completion + if [[ -z "$@{CDPATH:-@}" ]] || [[ "$cur" == @@(./*|../*|/*) ]]; then + # compgen prints paths one per line; could also use while loop + IFS=$'\n' + COMPREPLY=( $(compgen -d -- "$cur") ) + IFS=$' \t\n' + # CDPATH+directories in the current directory if not in CDPATH + else + IFS=$'\n' + _skipdot=false + # preprocess CDPATH to convert null directory names to . + _cdpath=$@{CDPATH/#:/.:@} + _cdpath=$@{_cdpath//::/:.:@} + _cdpath=$@{_cdpath/%:/:.@} + for i in $@{_cdpath//:/$'\n'@}; do + if [[ $i -ef . ]]; then _skipdot=true; fi + k="$@{#COMPREPLY[@@]@}" + for j in $( compgen -d -- "$i/$cur" ); do + COMPREPLY[k++]=$@{j#$i/@} # cut off directory + done + done + $_skipdot || COMPREPLY+=( $(compgen -d -- "$cur") ) + IFS=$' \t\n' + fi + + # variable names if appropriate shell option set and no completions + if shopt -q cdable_vars && [[ $@{#COMPREPLY[@@]@} -eq 0 ]]; then + COMPREPLY=( $(compgen -v -- "$cur") ) + fi + + return 0 +@} +@end example + +We install the completion function using the @option{-F} option to +@code{complete}: + +@example +# Tell readline to quote appropriate and append slashes to directories; +# use the bash default completion for other arguments +complete -o filenames -o nospace -o bashdefault -F _comp_cd cd +@end example + +@noindent +Since we'd like Bash and Readline to take care of some +of the other details for us, we use several other options to tell Bash +and Readline what to do. The @option{-o filenames} option tells Readline +that the possible completions should be treated as filenames, and quoted +appropriately. That option will also cause Readline to append a slash to +filenames it can determine are directories (which is why we might want to +extend @code{_comp_cd} to append a slash if we're using directories found +via @var{CDPATH}: Readline can't tell those completions are directories). +The @option{-o nospace} option tells Readline to not append a space +character to the directory name, in case we want to append to it. +The @option{-o bashdefault} option brings in the rest of the "Bash default" +completions -- possible completions that Bash adds to the default Readline +set. These include things like command name completion, variable completion +for words beginning with @samp{$} or @samp{$@{}, completions containing pathname +expansion patterns (@pxref{Filename Expansion}), and so on. + +Once installed using @code{complete}, @code{_comp_cd} will be called every +time we attempt word completion for a @code{cd} command. + +Many more examples -- an extensive collection of completions for most of +the common GNU, Unix, and Linux commands -- are available as part of the +bash_completion project. This is installed by default on many GNU/Linux +distributions. Originally written by Ian Macdonald, the project now lives +at @url{https://github.com/scop/bash-completion/}. There are ports for +other systems such as Solaris and Mac OS X. + +An older version of the bash_completion package is distributed with bash +in the @file{examples/complete} subdirectory. + +@end ifset diff --git a/doc/rluserman.dvi b/doc/rluserman.dvi new file mode 100644 index 0000000..e9c9e54 Binary files /dev/null and b/doc/rluserman.dvi differ diff --git a/doc/rluserman.html b/doc/rluserman.html new file mode 100644 index 0000000..b594615 --- /dev/null +++ b/doc/rluserman.html @@ -0,0 +1,2529 @@ + + + + + + +GNU Readline Library + + + + + + + + + + + + + + + + + +

GNU Readline Library

+ + + + + + + + + +
+ +

GNU Readline Library

+ +

This document describes the end user interface of the GNU Readline Library, +a utility which aids in the consistency of user interface across discrete +programs which provide a command line interface. +The Readline home page is http://www.gnu.org/software/readline/. +

+ + + + + + +
+
+ +

1 Command Line Editing

+ +

This chapter describes the basic features of the GNU +command line editing interface. +

+ + +
+
+ +

1.1 Introduction to Line Editing

+ +

The following paragraphs describe the notation used to represent +keystrokes. +

+

The text C-k is read as ‘Control-K’ and describes the character +produced when the k key is pressed while the Control key +is depressed. +

+

The text M-k is read as ‘Meta-K’ and describes the character +produced when the Meta key (if you have one) is depressed, and the k +key is pressed. +The Meta key is labeled ALT on many keyboards. +On keyboards with two keys labeled ALT (usually to either side of +the space bar), the ALT on the left side is generally set to +work as a Meta key. +The ALT key on the right may also be configured to work as a +Meta key or may be configured as some other modifier, such as a +Compose key for typing accented characters. +

+

If you do not have a Meta or ALT key, or another key working as +a Meta key, the identical keystroke can be generated by typing ESC +first, and then typing k. +Either process is known as metafying the k key. +

+

The text M-C-k is read as ‘Meta-Control-k’ and describes the +character produced by metafying C-k. +

+

In addition, several keys have their own names. Specifically, +DEL, ESC, LFD, SPC, RET, and TAB all +stand for themselves when seen in this text, or in an init file +(see 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. +

+
+
+
+ +

1.2 Readline Interaction

+ + +

Often during an interactive session you type in a long line of text, +only to notice that the first word on the line is misspelled. The +Readline library gives you a set of commands for manipulating the text +as you type it in, allowing you to just fix your typo, and not forcing +you to retype the majority of the line. Using these editing commands, +you move the cursor to the place that needs correction, and delete or +insert the text of the corrections. Then, when you are satisfied with +the line, you simply press RET. You do not have to be at the +end of the line to press RET; the entire line is accepted +regardless of the location of the cursor within the line. +

+ + +
+
+ +

1.2.1 Readline Bare Essentials

+ + + + +

In order to enter characters into the line, simply type them. The typed +character appears where the cursor was, and then the cursor moves one +space to the right. If you mistype a character, you can use your +erase character to back up and delete the mistyped character. +

+

Sometimes you may mistype a character, and +not notice the error until you have typed several other characters. In +that case, you can type C-b to move the cursor to the left, and then +correct your mistake. Afterwards, you can move the cursor to the right +with C-f. +

+

When you add text in the middle of a line, you will notice that characters +to the right of the cursor are ‘pushed over’ to make room for the text +that you have inserted. Likewise, when you delete text behind the cursor, +characters to the right of the cursor are ‘pulled back’ to fill in the +blank space created by the removal of the text. A list of the bare +essentials for editing the text of an input line follows. +

+
+
C-b
+

Move back one character. +

+
C-f
+

Move forward one character. +

+
DEL or Backspace
+

Delete the character to the left of the cursor. +

+
C-d
+

Delete the character underneath the cursor. +

+
Printing characters
+

Insert the character into the line at the cursor. +

+
C-_ or C-x C-u
+

Undo the last editing command. You can undo all the way back to an +empty line. +

+
+ +

(Depending on your configuration, the Backspace key might 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.) +

+
+
+
+ +

1.2.2 Readline Movement Commands

+ + +

The above table describes the most basic keystrokes that you need +in order to do editing of the input line. For your convenience, many +other commands have been added in addition to C-b, C-f, +C-d, and DEL. Here are some commands for moving more rapidly +about the line. +

+
+
C-a
+

Move to the start of the line. +

+
C-e
+

Move to the end of the line. +

+
M-f
+

Move forward a word, where a word is composed of letters and digits. +

+
M-b
+

Move backward a word. +

+
C-l
+

Clear the screen, reprinting the current line at the top. +

+
+ +

Notice how C-f moves forward a character, while M-f moves +forward a word. It is a loose convention that control keystrokes +operate on characters while meta keystrokes operate on words. +

+
+
+
+ +

1.2.3 Readline Killing Commands

+ + + + +

Killing text means to delete the text from the line, but to save +it away for later use, usually by yanking (re-inserting) +it back into the line. +(‘Cut’ and ‘paste’ are more recent jargon for ‘kill’ and ‘yank’.) +

+

If the description for a command says that it ‘kills’ text, then you can +be sure that you can get the text back in a different (or the same) +place later. +

+

When you use a kill command, the text is saved in a kill-ring. +Any number of consecutive kills save all of the killed text together, so +that when you yank it back, you get it all. The kill +ring is not line specific; the text that you killed on a previously +typed line is available to be yanked back later, when you are typing +another line. + +

+

Here is the list of commands for killing text. +

+
+
C-k
+

Kill the text from the current cursor position to the end of the line. +

+
+
M-d
+

Kill from the cursor to the end of the current word, or, if between +words, to the end of the next word. +Word boundaries are the same as those used by M-f. +

+
+
M-DEL
+

Kill from the cursor to the start of the current word, or, if between +words, to the start of the previous word. +Word boundaries are the same as those used by M-b. +

+
+
C-w
+

Kill from the cursor to the previous whitespace. This is different than +M-DEL because the word boundaries differ. +

+
+
+ +

Here is how to yank the text back into the line. Yanking +means to copy the most-recently-killed text from the kill buffer. +

+
+
C-y
+

Yank the most recently killed text back into the buffer at the cursor. +

+
+
M-y
+

Rotate the kill-ring, and yank the new top. You can only do this if +the prior command is C-y or M-y. +

+
+ +
+
+
+ +

1.2.4 Readline Arguments

+ +

You can pass numeric arguments to Readline commands. Sometimes the +argument acts as a repeat count, other times it is the sign of the +argument that is significant. If you pass a negative argument to a +command which normally acts in a forward direction, that command will +act in a backward direction. For example, to kill text back to the +start of the line, you might type ‘M-- C-k’. +

+

The general way to pass numeric arguments to a command is to type meta +digits before the command. If the first ‘digit’ typed is a minus +sign (‘-’), then the sign of the argument will be negative. Once +you have typed one meta digit to get the argument started, you can type +the remainder of the digits, and then the command. For example, to give +the C-d command an argument of 10, you could type ‘M-1 0 C-d’, +which will delete the next ten characters on the input line. +

+
+
+
+ +

1.2.5 Searching for Commands in the History

+ +

Readline provides commands for searching through the command history +for lines containing a specified string. +There are two search modes: incremental and non-incremental. +

+

Incremental searches begin before the user has finished typing the +search string. +As each character of the search string is typed, Readline displays +the next entry from the history matching the string typed so far. +An incremental search requires only as many characters as needed to +find the desired history entry. +To search backward in the history for a particular string, type +C-r. Typing C-s searches forward through the history. +The characters present in the value of the isearch-terminators variable +are used to terminate an incremental search. +If that variable has not been assigned a value, the ESC and +C-J characters will terminate an incremental search. +C-g will abort an incremental search and restore the original line. +When the search is terminated, the history entry containing the +search string becomes the current line. +

+

To find other matching entries in the history list, type C-r or +C-s as appropriate. +This will search backward or forward in the history for the next +entry matching the search string typed so far. +Any other key sequence bound to a Readline command will terminate +the search and execute that command. +For instance, a RET will terminate the search and accept +the line, thereby executing the command from the history list. +A movement command will terminate the search, make the last line found +the current line, and begin editing. +

+

Readline remembers the last incremental search string. If two +C-rs are typed without any intervening characters defining a new +search string, any remembered search string is used. +

+

Non-incremental searches read the entire search string before starting +to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. +

+
+
+
+
+ +

1.3 Readline Init File

+ + +

Although the Readline library comes with a set of Emacs-like +keybindings installed by default, it is possible to use a different set +of keybindings. +Any user can customize programs that use Readline by putting +commands in an inputrc file, +conventionally in their home directory. +The name of this +file is taken from the value of the environment variable INPUTRC. If +that variable is unset, the default is ~/.inputrc. If that +file does not exist or cannot be read, the ultimate default is +/etc/inputrc. +

+

When a program which uses the Readline library starts up, the +init file is read, and the key bindings are set. +

+

In addition, the C-x C-r command re-reads this init file, thus +incorporating any changes that you might have made to it. +

+ + +
+
+ +

1.3.1 Readline Init File Syntax

+ +

There are only a few basic constructs allowed in the +Readline init file. Blank lines are ignored. +Lines beginning with a ‘#’ are comments. +Lines beginning with a ‘$’ indicate conditional +constructs (see Conditional Init Constructs). Other lines +denote variable settings and key bindings. +

+
+
Variable Settings
+

You can modify the run-time behavior of Readline by +altering the values of variables in Readline +using the set command within the init file. +The syntax is simple: +

+
+
set variable value
+
+ +

Here, for example, is how to +change from the default Emacs-like key binding to use +vi line editing commands: +

+
+
set editing-mode vi
+
+ +

Variable names and values, where appropriate, are recognized without regard +to case. Unrecognized variable names are ignored. +

+

Boolean variables (those that can be set to on or off) are set to on if +the value is null or empty, on (case-insensitive), or 1. Any other +value results in the variable being set to off. +

+ +

A great deal of run-time behavior is changeable with the following +variables. +

+ +
+
active-region-start-color
+

A string variable that controls the text color and background when displaying +the text in the active region (see the description of +enable-active-region below). +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal before displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that puts the terminal in standout mode, +as obtained from the terminal’s terminfo description. +A sample value might be ‘\e[01;33m’. +

+
+
active-region-end-color
+

A string variable that "undoes" the effects of active-region-start-color +and restores "normal" terminal display appearance after displaying text +in the active region. +This string must not take up any physical character positions on the display, +so it should consist only of terminal escape sequences. +It is output to the terminal after displaying the text in the active region. +This variable is reset to the default value whenever the terminal type changes. +The default value is the string that restores the terminal from standout mode, +as obtained from the terminal’s terminfo description. +A sample value might be ‘\e[0m’. +

+
+
bell-style
+

Controls what happens when Readline wants to ring the terminal bell. +If set to ‘none’, Readline never rings the bell. If set to +‘visible’, Readline uses a visible bell if one is available. +If set to ‘audible’ (the default), Readline attempts to ring +the terminal’s bell. +

+
+
bind-tty-special-chars
+

If set to ‘on’ (the default), Readline attempts to bind the control +characters treated specially by the kernel’s terminal driver to their +Readline equivalents. +

+
+ +

If set to ‘on’, Readline attempts to briefly move the cursor to an +opening parenthesis when a closing parenthesis is inserted. The default +is ‘off’. +

+
+
colored-completion-prefix
+

If set to ‘on’, when listing completions, Readline displays the +common prefix of the set of possible completions using a different color. +The color definitions are taken from the value of the LS_COLORS +environment variable. +If there is a color definition in LS_COLORS for the custom suffix +‘readline-colored-completion-prefix’, Readline uses this color for +the common prefix instead of its default. +The default is ‘off’. +

+
+
colored-stats
+

If set to ‘on’, Readline displays possible completions using different +colors to indicate their file type. +The color definitions are taken from the value of the LS_COLORS +environment variable. +The default is ‘off’. +

+
+
comment-begin
+

The string to insert at the beginning of the line when the +insert-comment command is executed. The default value +is "#". +

+
+
completion-display-width
+

The number of screen columns used to display possible matches +when performing completion. +The value is ignored if it is less than 0 or greater than the terminal +screen width. +A value of 0 will cause matches to be displayed one per line. +The default value is -1. +

+
+
completion-ignore-case
+

If set to ‘on’, Readline performs filename matching and completion +in a case-insensitive fashion. +The default value is ‘off’. +

+
+
completion-map-case
+

If set to ‘on’, and completion-ignore-case is enabled, Readline +treats hyphens (‘-’) and underscores (‘_’) as equivalent when +performing case-insensitive filename matching and completion. +The default value is ‘off’. +

+
+
completion-prefix-display-length
+

The length in characters of the common prefix of a list of possible +completions that is displayed without modification. When set to a +value greater than zero, common prefixes longer than this value are +replaced with an ellipsis when displaying possible completions. +

+
+
completion-query-items
+

The number of possible completions that determines when the user is +asked whether the list of possibilities should be displayed. +If the number of possible completions is greater than or equal to this value, +Readline will ask whether or not the user wishes to view them; +otherwise, they are simply listed. +This variable must be set to an integer value greater than or equal to zero. +A zero value means Readline should never ask; negative values are +treated as zero. +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’, but +will be set to ‘off’ if the locale is one that contains +eight-bit characters. +This variable is dependent on the LC_CTYPE locale category, and +may change if the locale is changed. +

+
+
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’. +

+
+
echo-control-characters
+

When set to ‘on’, on operating systems that indicate they support it, +Readline echoes a character corresponding to a signal generated from the +keyboard. The default is ‘on’. +

+
+
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’. +

+
+
emacs-mode-string
+

If the show-mode-in-prompt variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when emacs editing mode is active. The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the ‘\1’ and ‘\2’ escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is ‘@’. +

+
+
enable-active-region
+

The point is the current cursor position, and mark refers +to a saved cursor position (see Commands For Moving). +The text between the point and mark is referred to as the region. +When this variable is set to ‘On’, Readline allows certain commands +to designate the region as active. +When the region is active, Readline highlights the text in the region using +the value of the active-region-start-color, which defaults to the +string that enables +the terminal’s standout mode. +The active region shows the text inserted by bracketed-paste and any +matching text found by incremental and non-incremental history searches. +The default is ‘On’. +

+
+
enable-bracketed-paste
+

When set to ‘On’, Readline configures the terminal to insert each +paste into the editing buffer as a single string of characters, instead +of treating each character as if it had been read from the keyboard. +This is called putting the terminal into bracketed paste mode; +it prevents Readline from executing any editing commands bound to key +sequences appearing in the pasted text. +The default is ‘On’. +

+
+
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’. +

+
+
enable-meta-key
+

When set to ‘on’, Readline will try to enable any meta modifier +key the terminal claims to support when it is called. On many terminals, +the meta key is used to send eight-bit characters. +The default is ‘on’. +

+
+
expand-tilde
+

If set to ‘on’, tilde expansion is performed when Readline +attempts word completion. The default is ‘off’. +

+
+
history-preserve-point
+

If set to ‘on’, the history code attempts to place the point (the +current cursor position) at the +same location on each history line retrieved with previous-history +or next-history. The default is ‘off’. +

+
+
history-size
+

Set the maximum number of history entries saved in the history list. +If set to zero, any existing history entries are deleted and no new entries +are saved. +If set to a value less than zero, the number of history entries is not +limited. +By default, the number of history entries is not limited. +If an attempt is made to set history-size to a non-numeric value, +the maximum number of history entries will be set to 500. +

+
+
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. +This variable is automatically set to ‘on’ for terminals of height 1. +By default, this variable is set to ‘off’. +

+
+
input-meta
+
+

If set to ‘on’, Readline will enable eight-bit input (it +will not clear the eighth bit in the characters it reads), +regardless of what the terminal claims it can support. The +default value is ‘off’, but Readline will set it to ‘on’ if the +locale contains eight-bit characters. +The name meta-flag is a synonym for this variable. +This variable is dependent on the LC_CTYPE locale category, and +may change if the locale is changed. +

+
+
isearch-terminators
+

The string of characters that should terminate an incremental search without +subsequently executing the character as a command (see Searching for Commands in the History). +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. +Built-in keymap names are +emacs, +emacs-standard, +emacs-meta, +emacs-ctlx, +vi, +vi-move, +vi-command, and +vi-insert. +vi is equivalent to vi-command (vi-move is also a +synonym); emacs is equivalent to emacs-standard. +Applications may add additional names. +The default value is emacs. +The value of the editing-mode variable also affects the +default keymap. +

+
+
keyseq-timeout
+

Specifies the duration Readline will wait for a character when reading an +ambiguous key sequence (one that can form a complete key sequence using +the input read so far, or can take additional input to complete a longer +key sequence). +If no input is received within the timeout, Readline will use the shorter +but complete key sequence. +Readline uses this value to determine whether or not input is +available on the current input source (rl_instream by default). +The value is specified in milliseconds, so a value of 1000 means that +Readline will wait one second for additional input. +If this variable is set to a value less than or equal to zero, or to a +non-numeric value, Readline will wait until another key is pressed to +decide which key sequence to complete. +The default value is 500. +

+
+
mark-directories
+

If set to ‘on’, completed directory names have a slash +appended. The default is ‘on’. +

+
+
mark-modified-lines
+

This variable, when set to ‘on’, causes Readline to display an +asterisk (‘*’) at the start of history lines which have been modified. +This variable is ‘off’ by default. +

+
+
mark-symlinked-directories
+

If set to ‘on’, completed names which are symbolic links +to directories have a slash appended (subject to the value of +mark-directories). +The default is ‘off’. +

+
+
match-hidden-files
+

This variable, when set to ‘on’, causes Readline to match files whose +names begin with a ‘.’ (hidden files) when performing filename +completion. +If set to ‘off’, the leading ‘.’ must be +supplied by the user in the filename to be completed. +This variable is ‘on’ by default. +

+
+
menu-complete-display-prefix
+

If set to ‘on’, menu completion displays the common prefix of the +list of possible completions (which may be empty) before cycling through +the list. The default is ‘off’. +

+
+
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’, but Readline will set it to ‘on’ if the +locale contains eight-bit characters. +This variable is dependent on the LC_CTYPE locale category, and +may change if the locale is changed. +

+
+
page-completions
+

If set to ‘on’, Readline uses an internal more-like pager +to display a screenful of possible completions at a time. +This variable is ‘on’ by default. +

+
+
print-completions-horizontally
+

If set to ‘on’, Readline will display completions with matches +sorted horizontally in alphabetical order, rather than down the screen. +The default is ‘off’. +

+
+
revert-all-at-newline
+

If set to ‘on’, Readline will undo all changes to history lines +before returning when accept-line is executed. By default, +history lines may be modified and retain individual undo lists across +calls to readline(). The default is ‘off’. +

+
+
show-all-if-ambiguous
+

This alters the default behavior of the completion functions. If +set to ‘on’, +words which have more than one possible completion cause the +matches to be listed immediately instead of ringing the bell. +The default value is ‘off’. +

+
+
show-all-if-unmodified
+

This alters the default behavior of the completion functions in +a fashion similar to show-all-if-ambiguous. +If set to ‘on’, +words which have more than one possible completion without any +possible partial completion (the possible completions don’t share +a common prefix) cause the matches to be listed immediately instead +of ringing the bell. +The default value is ‘off’. +

+
+
show-mode-in-prompt
+

If set to ‘on’, add a string to the beginning of the prompt +indicating the editing mode: emacs, vi command, or vi insertion. +The mode strings are user-settable (e.g., emacs-mode-string). +The default value is ‘off’. +

+
+
skip-completed-text
+

If set to ‘on’, this alters the default completion behavior when +inserting a single match into the line. It’s only active when +performing completion in the middle of a word. If enabled, Readline +does not insert characters from the completion that match characters +after point in the word being completed, so portions of the word +following the cursor are not duplicated. +For instance, if this is enabled, attempting completion when the cursor +is after the ‘e’ in ‘Makefile’ will result in ‘Makefile’ +rather than ‘Makefilefile’, assuming there is a single possible +completion. +The default value is ‘off’. +

+
+
vi-cmd-mode-string
+

If the show-mode-in-prompt variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in command mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the ‘\1’ and ‘\2’ escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is ‘(cmd)’. +

+
+
vi-ins-mode-string
+

If the show-mode-in-prompt variable is enabled, +this string is displayed immediately before the last line of the primary +prompt when vi editing mode is active and in insertion mode. +The value is expanded like a +key binding, so the standard set of meta- and control prefixes and +backslash escape sequences is available. +Use the ‘\1’ and ‘\2’ escapes to begin and end sequences of +non-printing characters, which can be used to embed a terminal control +sequence into the mode string. +The default is ‘(ins)’. +

+
+
visible-stats
+

If set to ‘on’, a character denoting a file’s type +is appended to the filename when listing possible +completions. The default is ‘off’. +

+
+
+ +
+
Key Bindings
+

The syntax for controlling key bindings in the init file is +simple. First you need to find the name of the command that you +want to change. The following sections contain tables of the command +name, the default keybinding, if any, and a short description of what +the command does. +

+

Once you know the name of the command, simply place on a line +in the init file the name of the key +you wish to bind the command to, a colon, and then the name of the +command. +There can be no space between the key name and the colon – that will be +interpreted as part of the key name. +The name of the key can be expressed in different ways, depending on +what you find most comfortable. +

+

In addition to command names, Readline allows keys to be bound +to a string that is inserted when the key is pressed (a macro). +

+ +
+
keynamefunction-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 example above, C-u is bound to the function +universal-argument, +M-DEL is bound to the function backward-kill-word, and +C-o is bound to run the macro +expressed on the right hand side (that is, to insert the text +‘> output’ into the line). +

+

A number of symbolic character names are recognized while +processing this key binding syntax: +DEL, +ESC, +ESCAPE, +LFD, +NEWLINE, +RET, +RETURN, +RUBOUT, +SPACE, +SPC, +and +TAB. +

+
+
"keyseq": function-name or macro
+

keyseq differs from keyname above in that strings +denoting an entire key sequence can be specified, by placing +the key sequence in double quotes. Some GNU Emacs style key +escapes can be used, as in the following example, but the +special character names are not recognized. +

+
+
"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+
+ +

In the above example, C-u is again bound to the function +universal-argument (just as it was in the first example), +‘C-x C-r’ is bound to the function re-read-init-file, +and ‘ESC [ 1 1 ~’ is bound to insert +the text ‘Function Key 1’. +

+
+
+ +

The following GNU Emacs style escape sequences are available when +specifying key sequences: +

+
+
\C-
+

control prefix +

+
\M-
+

meta prefix +

+
\e
+

an escape character +

+
\\
+

backslash +

+
\"
+

", a double quotation mark +

+
\'
+

', a single quote or apostrophe +

+
+ +

In addition to the GNU Emacs style escape sequences, a second +set of backslash escapes is available: +

+
+
\a
+

alert (bell) +

+
\b
+

backspace +

+
\d
+

delete +

+
\f
+

form feed +

+
\n
+

newline +

+
\r
+

carriage return +

+
\t
+

horizontal tab +

+
\v
+

vertical tab +

+
\nnn
+

the eight-bit character whose value is the octal value nnn +(one to three digits) +

+
\xHH
+

the eight-bit character whose value is the hexadecimal value HH +(one or two hex digits) +

+
+ +

When entering the text of a macro, single or double quotes must +be used to indicate a macro definition. +Unquoted text is assumed to be a function name. +In the macro body, the backslash escapes described above are expanded. +Backslash will quote any other character in the macro text, +including ‘"’ and ‘'’. +For example, the following binding will make ‘C-x \’ +insert a single ‘\’ into the line: +

+
"\C-x\\": "\\"
+
+ +
+
+ +
+
+
+ +

1.3.2 Conditional Init Constructs

+ +

Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key +bindings and variable settings to be performed as the result +of tests. There are four parser directives used. +

+
+
$if
+

The $if construct allows bindings to be made based on the +editing mode, the terminal being used, or the application using +Readline. The text of the test, after any comparison operator, +extends to the end of the line; +unless otherwise noted, 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. +

+
+
version
+

The version test may be used to perform comparisons against +specific Readline versions. +The version expands to the current Readline version. +The set of comparison operators includes +‘=’ (and ‘==’), ‘!=’, ‘<=’, ‘>=’, ‘<’, +and ‘>’. +The version number supplied on the right side of the operator consists +of a major version number, an optional decimal point, and an optional +minor version (e.g., ‘7.1’). If the minor version is omitted, it +is assumed to be ‘0’. +The operator may be separated from the string version and +from the version number argument by whitespace. +The following example sets a variable if the Readline version being used +is 7.0 or newer: +

+
$if version >= 7.0
+set show-mode-in-prompt on
+$endif
+
+ +
+
application
+

The application construct is used to include +application-specific settings. Each program using the Readline +library sets the application name, and you can test for +a particular value. +This could be used to bind key sequences to functions useful for +a specific program. For instance, the following command adds a +key sequence that quotes the current or previous word in Bash: +

+
$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+
+ +
+
variable
+

The variable construct provides simple equality tests for Readline +variables and values. +The permitted comparison operators are ‘=’, ‘==’, and ‘!=’. +The variable name must be separated from the comparison operator by +whitespace; the operator may be separated from the value on the right hand +side by whitespace. +Both string and boolean variables may be tested. Boolean variables must be +tested against the values on and off. +The following example is equivalent to the mode=emacs test described +above: +

+
$if editing-mode == emacs
+set show-mode-in-prompt on
+$endif
+
+
+
+ +
+
$endif
+

This command, as seen in the previous example, terminates an +$if command. +

+
+
$else
+

Commands in this branch of the $if directive are executed if +the test fails. +

+
+
$include
+

This directive takes a single filename as an argument and reads commands +and bindings from that file. +For example, the following directive reads from /etc/inputrc: +

+
$include /etc/inputrc
+
+
+
+ +
+
+
+ +

1.3.3 Sample Init File

+ +

Here is an example of an inputrc file. This illustrates key +binding, variable assignment, and conditional syntax. +

+
+
# This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any system-wide 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 150 or more possible completions for a word,
+# ask whether or not the user 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
+
+ +
+
+
+
+ +

1.4 Bindable Readline 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. +

+ +
+
+ +

1.4.1 Commands For Moving

+
+
beginning-of-line (C-a)
+

Move to the start of the current line. +

+
+
end-of-line (C-e)
+

Move to the end of the line. +

+
+
forward-char (C-f)
+

Move forward a character. +

+
+
backward-char (C-b)
+

Move back a character. +

+
+
forward-word (M-f)
+

Move forward to the end of the next word. +Words are composed of letters and digits. +

+
+
backward-word (M-b)
+

Move back to the start of the current or previous word. +Words are composed of letters and digits. +

+ +
+
previous-screen-line ()
+

Attempt to move point to the same physical screen column on the previous +physical screen line. This will not have the desired effect if the current +Readline line does not take up more than one physical line or if point is not +greater than the length of the prompt plus the screen width. +

+
+
next-screen-line ()
+

Attempt to move point to the same physical screen column on the next +physical screen line. This will not have the desired effect if the current +Readline line does not take up more than one physical line or if the length +of the current Readline line is not greater than the length of the prompt +plus the screen width. +

+
+
clear-display (M-C-l)
+

Clear the screen and, if possible, the terminal’s scrollback buffer, +then redraw the current line, +leaving the current line at the top of the screen. +

+
+
clear-screen (C-l)
+

Clear the screen, +then 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. +

+
+
+ +
+
+
+ +

1.4.2 Commands For Manipulating The History

+ +
+
accept-line (Newline or Return)
+

Accept the line regardless of where the cursor is. +If this line is +non-empty, it may be added to the history list for future recall with +add_history(). +If this line is a modified history line, the history line is restored +to its original state. +

+
+
previous-history (C-p)
+

Move ‘back’ through the history list, fetching the previous command. +

+
+
next-history (C-n)
+

Move ‘forward’ through the history list, fetching the next command. +

+
+
beginning-of-history (M-<)
+

Move to the first line in the history. +

+
+
end-of-history (M->)
+

Move to the end of the input history, i.e., the line currently +being entered. +

+
+
reverse-search-history (C-r)
+

Search backward starting at the current line and moving ‘up’ through +the history as necessary. This is an incremental search. +This command sets the region to the matched text and activates the mark. +

+
+
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. +This command sets the region to the matched text and activates the mark. +

+
+
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. +The search string may match anywhere in a history line. +

+
+
non-incremental-forward-search-history (M-n)
+

Search forward starting at the current line and moving ‘down’ +through the history as necessary using a non-incremental search +for a string supplied by the user. +The search string may match anywhere in a history line. +

+
+
history-search-forward ()
+

Search forward through the history for the string of characters +between the start of the current line and the point. +The search string must match at the beginning of a history line. +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. +The search string must match at the beginning of a history line. +This is a non-incremental search. +By default, this command is unbound. +

+
+
history-substring-search-forward ()
+

Search forward through the history for the string of characters +between the start of the current line and the point. +The search string may match anywhere in a history line. +This is a non-incremental search. +By default, this command is unbound. +

+
+
history-substring-search-backward ()
+

Search backward through the history for the string of characters +between the start of the current line and the point. +The search string may match anywhere in a history line. +This is a non-incremental search. +By default, this command is unbound. +

+
+
yank-nth-arg (M-C-y)
+

Insert the first argument to the previous command (usually +the second word on the previous line) at point. +With an argument n, +insert the nth word from the previous command (the words +in the previous command begin with word 0). A negative argument +inserts the nth word from the end of the previous command. +Once the argument n is computed, the argument is extracted +as if the ‘!n’ history expansion had been specified. +

+
+
yank-last-arg (M-. or M-_)
+

Insert last argument to the previous command (the last word of the +previous history entry). +With a numeric argument, behave exactly like yank-nth-arg. +Successive calls to yank-last-arg move back through the history +list, inserting the last word (or the word specified by the argument to +the first call) of each line in turn. +Any numeric argument supplied to these successive calls determines +the direction to move through the history. A negative argument switches +the direction through the history (back or forward). +The history expansion facilities are used to extract the last argument, +as if the ‘!$’ history expansion had been specified. +

+
+
operate-and-get-next (C-o)
+

Accept the current line for return to the calling application as if a +newline had been entered, +and fetch the next line relative to the current line from the history +for editing. +A numeric argument, if supplied, specifies the history entry to use instead +of the current line. +

+
+
fetch-history ()
+

With a numeric argument, fetch that entry from the history list +and make it the current line. +Without an argument, move back to the first entry in the history list. +

+
+
+ +
+
+
+ +

1.4.3 Commands For Changing Text

+ +
+
end-of-file (usually C-d)
+

The character indicating end-of-file as set, for example, by +stty. If this character is read when there are no characters +on the line, and point is at the beginning of the line, Readline +interprets it as the end of input and returns EOF. +

+
+
delete-char (C-d)
+

Delete the character at point. If this function is bound to the +same character as the tty EOF character, as C-d +commonly is, see above for the effects. +

+
+
backward-delete-char (Rubout)
+

Delete the character behind the cursor. A numeric argument means +to kill the characters instead of deleting them. +

+
+
forward-backward-delete-char ()
+

Delete the character under the cursor, unless the cursor is at the +end of the line, in which case the character behind the cursor is +deleted. By default, this is not bound to a key. +

+
+
quoted-insert (C-q or C-v)
+

Add the next character typed to the line verbatim. This is +how to insert key sequences like C-q, for example. +

+
+
tab-insert (M-TAB)
+

Insert a tab character. +

+
+
self-insert (a, b, A, 1, !, …)
+

Insert yourself. +

+
+
bracketed-paste-begin ()
+

This function is intended to be bound to the "bracketed paste" escape +sequence sent by some terminals, and such a binding is assigned by default. +It allows Readline to insert the pasted text as a single unit without treating +each character as if it had been read from the keyboard. The characters +are inserted as if each one was bound to self-insert instead of +executing any editing commands. +

+

Bracketed paste sets the region (the characters between point and the mark) +to the inserted text. It uses the concept of an active mark: when the +mark is active, Readline redisplay uses the terminal’s standout mode to +denote the region. +

+
+
transpose-chars (C-t)
+

Drag the character before the cursor forward over +the character at the cursor, moving the +cursor forward as well. If the insertion point +is at the end of the line, then this +transposes the last two characters of the line. +Negative arguments have no effect. +

+
+
transpose-words (M-t)
+

Drag the word before point past the word after point, +moving point past that word as well. +If the insertion point is at the end of the line, this transposes +the last two words on the line. +

+
+
upcase-word (M-u)
+

Uppercase the current (or following) word. With a negative argument, +uppercase the previous word, but do not move the cursor. +

+
+
downcase-word (M-l)
+

Lowercase the current (or following) word. With a negative argument, +lowercase the previous word, but do not move the cursor. +

+
+
capitalize-word (M-c)
+

Capitalize the current (or following) word. With a negative argument, +capitalize the previous word, but do not move the cursor. +

+
+
overwrite-mode ()
+

Toggle overwrite mode. With an explicit positive numeric argument, +switches to overwrite mode. With an explicit non-positive numeric +argument, switches to insert mode. This command affects only +emacs mode; vi mode does overwrite differently. +Each call to readline() starts in insert mode. +

+

In overwrite mode, characters bound to self-insert replace +the text at point rather than pushing the text to the right. +Characters bound to backward-delete-char replace the character +before point with a space. +

+

By default, this command is unbound. +

+
+
+ +
+
+
+ +

1.4.4 Killing And Yanking

+ +
+
kill-line (C-k)
+

Kill the text from point to the end of the line. +With a negative numeric argument, kill backward from the cursor to the +beginning of the current line. +

+
+
backward-kill-line (C-x Rubout)
+

Kill backward from the cursor to the beginning of the current line. +With a negative numeric argument, kill forward from the cursor to the +end of the current line. +

+
+
unix-line-discard (C-u)
+

Kill backward from the cursor to the beginning of the current line. +

+
+
kill-whole-line ()
+

Kill all characters on the current line, no matter where point is. +By default, this is unbound. +

+
+
kill-word (M-d)
+

Kill from point to the end of the current word, or if between +words, to the end of the next word. +Word boundaries are the same as forward-word. +

+
+
backward-kill-word (M-DEL)
+

Kill the word behind point. +Word boundaries are the same as backward-word. +

+ +
+
shell-transpose-words (M-C-t)
+

Drag the word before point past the word after point, +moving point past that word as well. +If the insertion point is at the end of the line, this transposes +the last two words on the line. +Word boundaries are the same as shell-forward-word and +shell-backward-word. +

+
+
unix-word-rubout (C-w)
+

Kill the word behind point, using white space as a word boundary. +The killed text is saved on the kill-ring. +

+
+
unix-filename-rubout ()
+

Kill the word behind point, using white space and the slash character +as the word boundaries. +The killed text is saved on the kill-ring. +

+
+
delete-horizontal-space ()
+

Delete all spaces and tabs around point. By default, this is unbound. +

+
+
kill-region ()
+

Kill the text in the current region. +By default, this command is unbound. +

+
+
copy-region-as-kill ()
+

Copy the text in the region to the kill buffer, so it can be yanked +right away. By default, this command is unbound. +

+
+
copy-backward-word ()
+

Copy the word before point to the kill buffer. +The word boundaries are the same as backward-word. +By default, this command is unbound. +

+
+
copy-forward-word ()
+

Copy the word following point to the kill buffer. +The word boundaries are the same as forward-word. +By default, this command is unbound. +

+
+
yank (C-y)
+

Yank the top of the kill ring into the buffer at point. +

+
+
yank-pop (M-y)
+

Rotate the kill-ring, and yank the new top. You can only do this if +the prior command is yank or yank-pop. +

+
+ +
+
+
+ +

1.4.5 Specifying Numeric Arguments

+
+
digit-argument (M-0, M-1, … M--)
+

Add this digit to the argument already accumulating, or start a new +argument. M-- starts a negative argument. +

+
+
universal-argument ()
+

This is another way to specify an argument. +If this command is followed by one or more digits, optionally with a +leading minus sign, those digits define the argument. +If the command is followed by digits, executing universal-argument +again ends the numeric argument, but is otherwise ignored. +As a special case, if this command is immediately followed by a +character that is neither a digit nor 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. +

+
+ +
+
+
+ +

1.4.6 Letting Readline Type For You

+ +
+
complete (TAB)
+

Attempt to perform completion on the text before point. +The actual completion performed is application-specific. +The default is filename completion. +

+
+
possible-completions (M-?)
+

List the possible completions of the text before point. +When displaying completions, Readline sets the number of columns used +for display to the value of completion-display-width, the value of +the environment variable COLUMNS, or the screen width, in that order. +

+
+
insert-completions (M-*)
+

Insert all completions of the text before point that would have +been generated by possible-completions. +

+
+
menu-complete ()
+

Similar to complete, but replaces the word to be completed +with a single match from the list of possible completions. +Repeated execution of menu-complete steps through the list +of possible completions, inserting each match in turn. +At the end of the list of completions, the bell is rung +(subject to the setting of bell-style) +and the original text is restored. +An argument of n moves n positions forward in the list +of matches; a negative argument may be used to move backward +through the list. +This command is intended to be bound to TAB, but is unbound +by default. +

+
+
menu-complete-backward ()
+

Identical to menu-complete, but moves backward through the list +of possible completions, as if menu-complete had been given a +negative argument. +

+
+
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. +

+
+
+ +
+
+
+ +

1.4.7 Keyboard Macros

+
+
start-kbd-macro (C-x ()
+

Begin saving the characters typed into the current keyboard macro. +

+
+
end-kbd-macro (C-x ))
+

Stop saving the characters typed into the current keyboard macro +and save the definition. +

+
+
call-last-kbd-macro (C-x e)
+

Re-execute the last keyboard macro defined, by making the characters +in the macro appear as if typed at the keyboard. +

+
+
print-last-kbd-macro ()
+

Print the last keyboard macro defined in a format suitable for the +inputrc file. +

+
+
+ +
+
+
+ +

1.4.8 Some Miscellaneous Commands

+
+
re-read-init-file (C-x C-r)
+

Read in the contents of the inputrc file, and incorporate +any bindings or variable assignments found there. +

+
+
abort (C-g)
+

Abort the current editing command and +ring the terminal’s bell (subject to the setting of +bell-style). +

+
+
do-lowercase-version (M-A, M-B, M-x, …)
+

If the metafied character x is upper case, run the command +that is bound to the corresponding metafied lower case character. +The behavior is undefined if x is already lower case. +

+
+
prefix-meta (ESC)
+

Metafy the next character typed. This is for keyboards +without a meta key. Typing ‘ESC f’ is equivalent to typing +M-f. +

+
+
undo (C-_ or C-x C-u)
+

Incremental undo, separately remembered for each line. +

+
+
revert-line (M-r)
+

Undo all changes made to this line. This is like executing the undo +command enough times to get back to the beginning. +

+
+
tilde-expand (M-~)
+

Perform tilde expansion on the current word. +

+
+
set-mark (C-@)
+

Set the mark to the point. If a +numeric argument is supplied, the mark is set to that position. +

+
+
exchange-point-and-mark (C-x C-x)
+

Swap the point with the mark. The current cursor position is set to +the saved position, and the old cursor position is saved as the mark. +

+
+
character-search (C-])
+

A character is read and point is moved to the next occurrence of that +character. A negative argument 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 argument searches for subsequent +occurrences. +

+
+
skip-csi-sequence ()
+

Read enough characters to consume a multi-key sequence such as those +defined for keys like Home and End. Such sequences begin with a +Control Sequence Indicator (CSI), usually ESC-[. If this sequence is +bound to "\e[", keys producing such sequences will have no effect +unless explicitly bound to a Readline command, instead of inserting +stray characters into the editing buffer. This is unbound by default, +but usually bound to ESC-[. +

+
+
insert-comment (M-#)
+

Without a numeric argument, the value of the comment-begin +variable is inserted at the beginning of the current line. +If a numeric argument is supplied, this command acts as a toggle: if +the characters at the beginning of the line do not match the value +of comment-begin, the value is inserted, otherwise +the characters in comment-begin are deleted from the beginning of +the line. +In either case, the line is accepted as if a newline had been typed. +

+
+
dump-functions ()
+

Print all of the functions and their key bindings to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. +

+
+
dump-variables ()
+

Print all of the settable variables and their values to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. +

+
+
dump-macros ()
+

Print all of the Readline key sequences bound to macros and the +strings they output. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. +

+ +
+
emacs-editing-mode (C-e)
+

When in vi command mode, this causes a switch to emacs +editing mode. +

+
+
vi-editing-mode (M-C-j)
+

When in emacs editing mode, this causes a switch to vi +editing mode. +

+ +
+
+ +
+
+
+
+ +

1.5 Readline vi Mode

+ +

While the Readline library does not have a full set of vi +editing functions, it does contain enough to allow simple editing +of the line. The Readline vi mode behaves as specified in +the POSIX standard. +

+

In order to switch interactively between emacs and vi +editing modes, use the command M-C-j (bound to emacs-editing-mode +when in vi mode and to vi-editing-mode in emacs mode). +The Readline default is emacs mode. +

+

When you enter a line in vi mode, you are already placed in +‘insertion’ mode, as if you had typed an ‘i’. Pressing ESC +switches you into ‘command’ mode, where you can edit the text of the +line with the standard vi movement keys, move to previous +history lines with ‘k’ and subsequent lines with ‘j’, and +so forth. +

+ +
+
+
+
+ +

Appendix A GNU Free Documentation License

+ +
Version 1.3, 3 November 2008 +
+ +
+
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+http://fsf.org/
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+ +
    +
  1. PREAMBLE + +

    The purpose of this License is to make a manual, textbook, or other +functional and useful document free in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. +

    +

    This License is a kind of “copyleft”, which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. +

    +

    We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. +

    +
  2. APPLICABILITY AND DEFINITIONS + +

    This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The “Document”, below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as “you”. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. +

    +

    A “Modified Version” of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. +

    +

    A “Secondary Section” is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document’s overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. +

    +

    The “Invariant Sections” are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. +

    +

    The “Cover Texts” are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. +

    +

    A “Transparent” copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not “Transparent” is called “Opaque”. +

    +

    Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. +

    +

    The “Title Page” means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, “Title Page” means +the text near the most prominent appearance of the work’s title, +preceding the beginning of the body of the text. +

    +

    The “publisher” means any person or entity that distributes copies +of the Document to the public. +

    +

    A section “Entitled XYZ” means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as “Acknowledgements”, +“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” +of such a section when you modify the Document means that it remains a +section “Entitled XYZ” according to this definition. +

    +

    The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. +

    +
  3. VERBATIM COPYING + +

    You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. +

    +

    You may also lend copies, under the same conditions stated above, and +you may publicly display copies. +

    +
  4. COPYING IN QUANTITY + +

    If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document’s license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. +

    +

    If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. +

    +

    If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. +

    +

    It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. +

    +
  5. MODIFICATIONS + +

    You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: +

    +
      +
    1. Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
    2. List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +
    3. State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
    4. Preserve all the copyright notices of the Document. + +
    5. Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
    6. Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
    7. Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document’s license notice. + +
    8. Include an unaltered copy of this License. + +
    9. Preserve the section Entitled “History”, Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled “History” in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
    10. Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the “History” section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +
    12. Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
    13. Delete any section Entitled “Endorsements”. Such a section +may not be included in the Modified Version. + +
    14. Do not retitle any existing section to be Entitled “Endorsements” or +to conflict in title with any Invariant Section. + +
    15. Preserve any Warranty Disclaimers. +
    + +

    If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version’s license notice. +These titles must be distinct from any other section titles. +

    +

    You may add a section Entitled “Endorsements”, provided it contains +nothing but endorsements of your Modified Version by various +parties—for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. +

    +

    You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. +

    +

    The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. +

    +
  6. COMBINING DOCUMENTS + +

    You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. +

    +

    The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. +

    +

    In the combination, you must combine any sections Entitled “History” +in the various original documents, forming one section Entitled +“History”; likewise combine any sections Entitled “Acknowledgements”, +and any sections Entitled “Dedications”. You must delete all +sections Entitled “Endorsements.” +

    +
  7. COLLECTIONS OF DOCUMENTS + +

    You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. +

    +

    You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. +

    +
  8. AGGREGATION WITH INDEPENDENT WORKS + +

    A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an “aggregate” if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation’s users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. +

    +

    If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document’s Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. +

    +
  9. TRANSLATION + +

    Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. +

    +

    If a section in the Document is Entitled “Acknowledgements”, +“Dedications”, or “History”, the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. +

    +
  10. TERMINATION + +

    You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. +

    +

    However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. +

    +

    Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. +

    +

    Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. +

    +
  11. FUTURE REVISIONS OF THIS LICENSE + +

    The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. +

    +

    Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License “or any later version” applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy’s public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. +

    +
  12. RELICENSING + +

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +“Massive Multiauthor Collaboration” (or “MMC”) contained in the +site means any set of copyrightable works thus published on the MMC +site. +

    +

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. +

    +

    “Incorporate” means to publish or republish a Document, in whole or +in part, as part of another Document. +

    +

    An MMC is “eligible for relicensing” if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. +

    +

    The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. +

    +
+ +

ADDENDUM: How to use this License for your documents

+ +

To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: +

+
+
  Copyright (C)  year  your name.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+
+ +

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the “with…Texts.” line with this: +

+
+
    with the Invariant Sections being list their titles, with
+    the Front-Cover Texts being list, and with the Back-Cover Texts
+    being list.
+
+ +

If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. +

+

If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. +

+ + +
+
+ + + + + diff --git a/doc/rluserman.info b/doc/rluserman.info new file mode 100644 index 0000000..6bf1b4f --- /dev/null +++ b/doc/rluserman.info @@ -0,0 +1,2087 @@ +This is rluserman.info, produced by makeinfo version 6.8 from +rluserman.texi. + +This manual describes the end user interface of the GNU Readline Library +(version 8.2, 19 September 2022), a library which aids in the +consistency of user interface across discrete programs which provide a +command line interface. + + Copyright (C) 1988-2022 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". + +INFO-DIR-SECTION Libraries +START-INFO-DIR-ENTRY +* RLuserman: (rluserman). The GNU readline library User's Manual. +END-INFO-DIR-ENTRY + + +File: rluserman.info, Node: Top, Next: Command Line Editing, Up: (dir) + +GNU Readline Library +******************** + +This document describes the end user interface of the GNU Readline +Library, a utility which aids in the consistency of user interface +across discrete programs which provide a command line interface. The +Readline home page is . + +* Menu: + +* Command Line Editing:: GNU Readline User's Manual. +* GNU Free Documentation License:: License for copying this manual. + + +File: rluserman.info, Node: Command Line Editing, Next: GNU Free Documentation License, Prev: Top, Up: Top + +1 Command Line Editing +********************** + +This chapter describes the basic features of the GNU command line +editing interface. + +* Menu: + +* Introduction and Notation:: Notation used in this text. +* Readline Interaction:: The minimum set of commands for editing a line. +* Readline Init File:: Customizing Readline from a user's view. +* Bindable Readline Commands:: A description of most of the Readline commands + available for binding +* Readline vi Mode:: A short description of how to make Readline + behave like the vi editor. + + +File: rluserman.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing + +1.1 Introduction to Line Editing +================================ + +The following paragraphs describe the notation used to represent +keystrokes. + + The text 'C-k' is read as 'Control-K' and describes the character +produced when the 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 +key is pressed. The Meta key is labeled on many keyboards. On +keyboards with two keys labeled (usually to either side of the +space bar), the on the left side is generally set to work as a +Meta key. The 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, or another key working as a +Meta key, the identical keystroke can be generated by typing +_first_, and then typing . Either process is known as "metafying" +the 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, , +, , , , and all stand for themselves when seen +in this text, or in an init file (*note Readline Init File::). If your +keyboard lacks a key, typing will produce the desired +character. The key may be labeled or on some +keyboards. + + +File: rluserman.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing + +1.2 Readline Interaction +======================== + +Often during an interactive session you type in a long line of text, +only to notice that the first word on the line is misspelled. The +Readline library gives you a set of commands for manipulating the text +as you type it in, allowing you to just fix your typo, and not forcing +you to retype the majority of the line. Using these editing commands, +you move the cursor to the place that needs correction, and delete or +insert the text of the corrections. Then, when you are satisfied with +the line, you simply press . You do not have to be at the end of +the line to press ; 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 + +1.2.1 Readline Bare Essentials +------------------------------ + +In order to enter characters into the line, simply type them. The typed +character appears where the cursor was, and then the cursor moves one +space to the right. If you mistype a character, you can use your erase +character to back up and delete the mistyped character. + + Sometimes you may mistype a character, and not notice the error until +you have typed several other characters. In that case, you can type +'C-b' to move the cursor to the left, and then correct your mistake. +Afterwards, you can move the cursor to the right with 'C-f'. + + When you add text in the middle of a line, you will notice that +characters to the right of the cursor are 'pushed over' to make room for +the text that you have inserted. Likewise, when you delete text behind +the cursor, characters to the right of the cursor are 'pulled back' to +fill in the blank space created by the removal of the text. A list of +the bare essentials for editing the text of an input line follows. + +'C-b' + Move back one character. +'C-f' + Move forward one character. + or + 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 key might be set to +delete the character to the left of the cursor and the 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 + +1.2.2 Readline Movement Commands +-------------------------------- + +The above table describes the most basic keystrokes that you need in +order to do editing of the input line. For your convenience, many other +commands have been added in addition to 'C-b', 'C-f', 'C-d', and . +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 + +1.2.3 Readline Killing Commands +------------------------------- + +"Killing" text means to delete the text from the line, but to save it +away for later use, usually by "yanking" (re-inserting) it back into the +line. ('Cut' and 'paste' are more recent jargon for 'kill' and 'yank'.) + + If the description for a command says that it 'kills' text, then you +can be sure that you can get the text back in a different (or the same) +place later. + + When you use a kill command, the text is saved in a "kill-ring". Any +number of consecutive kills save all of the killed text together, so +that when you yank it back, you get it all. The kill ring is not line +specific; the text that you killed on a previously typed line is +available to be yanked back later, when you are typing another line. + + Here is the list of commands for killing text. + +'C-k' + Kill the text from the current cursor position to the end of the + line. + +'M-d' + Kill from the cursor to the end of the current word, or, if between + words, to the end of the next word. Word boundaries are the same + as those used by 'M-f'. + +'M-' + Kill from the cursor to the start of the current word, or, if + between words, to the start of the previous word. Word boundaries + are the same as those used by 'M-b'. + +'C-w' + Kill from the cursor to the previous whitespace. This is different + than 'M-' 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 + +1.2.4 Readline Arguments +------------------------ + +You can pass numeric arguments to Readline commands. Sometimes the +argument acts as a repeat count, other times it is the sign of the +argument that is significant. If you pass a negative argument to a +command which normally acts in a forward direction, that command will +act in a backward direction. For example, to kill text back to the +start of the line, you might type 'M-- C-k'. + + The general way to pass numeric arguments to a command is to type +meta digits before the command. If the first 'digit' typed is a minus +sign ('-'), then the sign of the argument will be negative. Once you +have typed one meta digit to get the argument started, you can type the +remainder of the digits, and then the command. For example, to give the +'C-d' command an argument of 10, you could type 'M-1 0 C-d', which will +delete the next ten characters on the input line. + + +File: rluserman.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction + +1.2.5 Searching for Commands in the History +------------------------------------------- + +Readline provides commands for searching through the command history for +lines containing a specified string. There are two search modes: +"incremental" and "non-incremental". + + Incremental searches begin before the user has finished typing the +search string. As each character of the search string is typed, +Readline displays the next entry from the history matching the string +typed so far. An incremental search requires only as many characters as +needed to find the desired history entry. To search backward in the +history for a particular string, type 'C-r'. Typing 'C-s' searches +forward through the history. The characters present in the value of the +'isearch-terminators' variable are used to terminate an incremental +search. If that variable has not been assigned a value, the 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 will terminate the +search and accept the line, thereby executing the command from the +history list. A movement command will terminate the search, make the +last line found the current line, and begin editing. + + Readline remembers the last incremental search string. If two 'C-r's +are typed without any intervening characters defining a new search +string, any remembered search string is used. + + Non-incremental searches read the entire search string before +starting to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. + + +File: rluserman.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing + +1.3 Readline Init File +====================== + +Although the Readline library comes with a set of Emacs-like keybindings +installed by default, it is possible to use a different set of +keybindings. Any user can customize programs that use Readline by +putting commands in an "inputrc" file, conventionally in their home +directory. The name of this file is taken from the value of the +environment variable 'INPUTRC'. If that variable is unset, the default +is '~/.inputrc'. If that file does not exist or cannot be read, the +ultimate default is '/etc/inputrc'. + + When a program which uses the Readline library starts up, the init +file is read, and the key bindings are set. + + In addition, the 'C-x C-r' command re-reads this init file, thus +incorporating any changes that you might have made to it. + +* Menu: + +* Readline Init File Syntax:: Syntax for the commands in the inputrc file. + +* Conditional Init Constructs:: Conditional key bindings in the inputrc file. + +* Sample Init File:: An example inputrc file. + + +File: rluserman.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File + +1.3.1 Readline Init File Syntax +------------------------------- + +There are only a few basic constructs allowed in the Readline init file. +Blank lines are ignored. Lines beginning with a '#' are comments. +Lines beginning with a '$' indicate conditional constructs (*note +Conditional Init Constructs::). Other lines denote variable settings +and key bindings. + +Variable Settings + You can modify the run-time behavior of Readline by altering the + values of variables in Readline using the 'set' command within the + init file. The syntax is simple: + + set VARIABLE VALUE + + Here, for example, is how to change from the default Emacs-like key + binding to use 'vi' line editing commands: + + set editing-mode vi + + Variable names and values, where appropriate, are recognized + without regard to case. Unrecognized variable names are ignored. + + Boolean variables (those that can be set to on or off) are set to + on if the value is null or empty, ON (case-insensitive), or 1. Any + other value results in the variable being set to off. + + A great deal of run-time behavior is changeable with the following + variables. + + 'active-region-start-color' + A string variable that controls the text color and background + when displaying the text in the active region (see the + description of 'enable-active-region' below). This string + must not take up any physical character positions on the + display, so it should consist only of terminal escape + sequences. It is output to the terminal before displaying the + text in the active region. This variable is reset to the + default value whenever the terminal type changes. The default + value is the string that puts the terminal in standout mode, + as obtained from the terminal's terminfo description. A + sample value might be '\e[01;33m'. + + 'active-region-end-color' + A string variable that "undoes" the effects of + 'active-region-start-color' and restores "normal" terminal + display appearance after displaying text in the active region. + This string must not take up any physical character positions + on the display, so it should consist only of terminal escape + sequences. It is output to the terminal after displaying the + text in the active region. This variable is reset to the + default value whenever the terminal type changes. The default + value is the string that restores the terminal from standout + mode, as obtained from the terminal's terminfo description. A + sample value might be '\e[0m'. + + 'bell-style' + Controls what happens when Readline wants to ring the terminal + bell. If set to 'none', Readline never rings the bell. If + set to 'visible', Readline uses a visible bell if one is + available. If set to 'audible' (the default), Readline + attempts to ring the terminal's bell. + + 'bind-tty-special-chars' + If set to 'on' (the default), Readline attempts to bind the + control characters treated specially by the kernel's terminal + driver to their Readline equivalents. + + 'blink-matching-paren' + If set to 'on', Readline attempts to briefly move the cursor + to an opening parenthesis when a closing parenthesis is + inserted. The default is 'off'. + + 'colored-completion-prefix' + If set to 'on', when listing completions, Readline displays + the common prefix of the set of possible completions using a + different color. The color definitions are taken from the + value of the 'LS_COLORS' environment variable. If there is a + color definition in 'LS_COLORS' for the custom suffix + 'readline-colored-completion-prefix', Readline uses this color + for the common prefix instead of its default. The default is + 'off'. + + 'colored-stats' + If set to 'on', Readline displays possible completions using + different colors to indicate their file type. The color + definitions are taken from the value of the 'LS_COLORS' + environment variable. The default is 'off'. + + 'comment-begin' + The string to insert at the beginning of the line when the + 'insert-comment' command is executed. The default value is + '"#"'. + + 'completion-display-width' + The number of screen columns used to display possible matches + when performing completion. The value is ignored if it is + less than 0 or greater than the terminal screen width. A + value of 0 will cause matches to be displayed one per line. + The default value is -1. + + 'completion-ignore-case' + If set to 'on', Readline performs filename matching and + completion in a case-insensitive fashion. The default value + is 'off'. + + 'completion-map-case' + If set to 'on', and COMPLETION-IGNORE-CASE is enabled, + Readline treats hyphens ('-') and underscores ('_') as + equivalent when performing case-insensitive filename matching + and completion. The default value is 'off'. + + 'completion-prefix-display-length' + The length in characters of the common prefix of a list of + possible completions that is displayed without modification. + When set to a value greater than zero, common prefixes longer + than this value are replaced with an ellipsis when displaying + possible completions. + + 'completion-query-items' + The number of possible completions that determines when the + user is asked whether the list of possibilities should be + displayed. If the number of possible completions is greater + than or equal to this value, Readline will ask whether or not + the user wishes to view them; otherwise, they are simply + listed. This variable must be set to an integer value greater + than or equal to zero. A zero value means Readline should + never ask; negative values are treated as zero. 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 character, converting them + to a meta-prefixed key sequence. The default value is 'on', + but will be set to 'off' if the locale is one that contains + eight-bit characters. This variable is dependent on the + 'LC_CTYPE' locale category, and may change if the locale is + changed. + + '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'. + + 'echo-control-characters' + When set to 'on', on operating systems that indicate they + support it, Readline echoes a character corresponding to a + signal generated from the keyboard. The default is 'on'. + + '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'. + + 'emacs-mode-string' + If the SHOW-MODE-IN-PROMPT variable is enabled, this string is + displayed immediately before the last line of the primary + prompt when emacs editing mode is active. The value is + expanded like a key binding, so the standard set of meta- and + control prefixes and backslash escape sequences is available. + Use the '\1' and '\2' escapes to begin and end sequences of + non-printing characters, which can be used to embed a terminal + control sequence into the mode string. The default is '@'. + + 'enable-active-region' + The "point" is the current cursor position, and "mark" refers + to a saved cursor position (*note Commands For Moving::). The + text between the point and mark is referred to as the + "region". When this variable is set to 'On', Readline allows + certain commands to designate the region as "active". When + the region is active, Readline highlights the text in the + region using the value of the 'active-region-start-color', + which defaults to the string that enables the terminal's + standout mode. The active region shows the text inserted by + bracketed-paste and any matching text found by incremental and + non-incremental history searches. The default is 'On'. + + 'enable-bracketed-paste' + When set to 'On', Readline configures the terminal to insert + each paste into the editing buffer as a single string of + characters, instead of treating each character as if it had + been read from the keyboard. This is called putting the + terminal into "bracketed paste mode"; it prevents Readline + from executing any editing commands bound to key sequences + appearing in the pasted text. The default is 'On'. + + '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'. + + 'enable-meta-key' + When set to 'on', Readline will try to enable any meta + modifier key the terminal claims to support when it is called. + On many terminals, the meta key is used to send eight-bit + characters. The default is 'on'. + + 'expand-tilde' + If set to 'on', tilde expansion is performed when Readline + attempts word completion. The default is 'off'. + + 'history-preserve-point' + If set to 'on', the history code attempts to place the point + (the current cursor position) at the same location on each + history line retrieved with 'previous-history' or + 'next-history'. The default is 'off'. + + 'history-size' + Set the maximum number of history entries saved in the history + list. If set to zero, any existing history entries are + deleted and no new entries are saved. If set to a value less + than zero, the number of history entries is not limited. By + default, the number of history entries is not limited. If an + attempt is made to set HISTORY-SIZE to a non-numeric value, + the maximum number of history entries will be set to 500. + + '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. This variable is automatically set to 'on' + for terminals of height 1. By default, this variable is set + to 'off'. + + 'input-meta' + If set to 'on', Readline will enable eight-bit input (it will + not clear the eighth bit in the characters it reads), + regardless of what the terminal claims it can support. The + default value is 'off', but Readline will set it to 'on' if + the locale contains eight-bit characters. The name + 'meta-flag' is a synonym for this variable. This variable is + dependent on the 'LC_CTYPE' locale category, and may change if + the locale is changed. + + '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 and 'C-J' will terminate + an incremental search. + + 'keymap' + Sets Readline's idea of the current keymap for key binding + commands. Built-in 'keymap' names are 'emacs', + 'emacs-standard', 'emacs-meta', 'emacs-ctlx', 'vi', 'vi-move', + 'vi-command', and 'vi-insert'. 'vi' is equivalent to + 'vi-command' ('vi-move' is also a synonym); 'emacs' is + equivalent to 'emacs-standard'. Applications may add + additional names. The default value is 'emacs'. The value of + the 'editing-mode' variable also affects the default keymap. + + 'keyseq-timeout' + Specifies the duration Readline will wait for a character when + reading an ambiguous key sequence (one that can form a + complete key sequence using the input read so far, or can take + additional input to complete a longer key sequence). If no + input is received within the timeout, Readline will use the + shorter but complete key sequence. Readline uses this value + to determine whether or not input is available on the current + input source ('rl_instream' by default). The value is + specified in milliseconds, so a value of 1000 means that + Readline will wait one second for additional input. If this + variable is set to a value less than or equal to zero, or to a + non-numeric value, Readline will wait until another key is + pressed to decide which key sequence to complete. The default + value is '500'. + + 'mark-directories' + If set to 'on', completed directory names have a slash + appended. The default is 'on'. + + 'mark-modified-lines' + This variable, when set to 'on', causes Readline to display an + asterisk ('*') at the start of history lines which have been + modified. This variable is 'off' by default. + + 'mark-symlinked-directories' + If set to 'on', completed names which are symbolic links to + directories have a slash appended (subject to the value of + 'mark-directories'). The default is 'off'. + + 'match-hidden-files' + This variable, when set to 'on', causes Readline to match + files whose names begin with a '.' (hidden files) when + performing filename completion. If set to 'off', the leading + '.' must be supplied by the user in the filename to be + completed. This variable is 'on' by default. + + 'menu-complete-display-prefix' + If set to 'on', menu completion displays the common prefix of + the list of possible completions (which may be empty) before + cycling through the list. The default is 'off'. + + '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', but Readline will set it to + 'on' if the locale contains eight-bit characters. This + variable is dependent on the 'LC_CTYPE' locale category, and + may change if the locale is changed. + + 'page-completions' + If set to 'on', Readline uses an internal 'more'-like pager to + display a screenful of possible completions at a time. This + variable is 'on' by default. + + 'print-completions-horizontally' + If set to 'on', Readline will display completions with matches + sorted horizontally in alphabetical order, rather than down + the screen. The default is 'off'. + + 'revert-all-at-newline' + If set to 'on', Readline will undo all changes to history + lines before returning when 'accept-line' is executed. By + default, history lines may be modified and retain individual + undo lists across calls to 'readline()'. The default is + 'off'. + + 'show-all-if-ambiguous' + This alters the default behavior of the completion functions. + If set to 'on', words which have more than one possible + completion cause the matches to be listed immediately instead + of ringing the bell. The default value is 'off'. + + 'show-all-if-unmodified' + This alters the default behavior of the completion functions + in a fashion similar to SHOW-ALL-IF-AMBIGUOUS. If set to + 'on', words which have more than one possible completion + without any possible partial completion (the possible + completions don't share a common prefix) cause the matches to + be listed immediately instead of ringing the bell. The + default value is 'off'. + + 'show-mode-in-prompt' + If set to 'on', add a string to the beginning of the prompt + indicating the editing mode: emacs, vi command, or vi + insertion. The mode strings are user-settable (e.g., + EMACS-MODE-STRING). The default value is 'off'. + + 'skip-completed-text' + If set to 'on', this alters the default completion behavior + when inserting a single match into the line. It's only active + when performing completion in the middle of a word. If + enabled, Readline does not insert characters from the + completion that match characters after point in the word being + completed, so portions of the word following the cursor are + not duplicated. For instance, if this is enabled, attempting + completion when the cursor is after the 'e' in 'Makefile' will + result in 'Makefile' rather than 'Makefilefile', assuming + there is a single possible completion. The default value is + 'off'. + + 'vi-cmd-mode-string' + If the SHOW-MODE-IN-PROMPT variable is enabled, this string is + displayed immediately before the last line of the primary + prompt when vi editing mode is active and in command mode. + The value is expanded like a key binding, so the standard set + of meta- and control prefixes and backslash escape sequences + is available. Use the '\1' and '\2' escapes to begin and end + sequences of non-printing characters, which can be used to + embed a terminal control sequence into the mode string. The + default is '(cmd)'. + + 'vi-ins-mode-string' + If the SHOW-MODE-IN-PROMPT variable is enabled, this string is + displayed immediately before the last line of the primary + prompt when vi editing mode is active and in insertion mode. + The value is expanded like a key binding, so the standard set + of meta- and control prefixes and backslash escape sequences + is available. Use the '\1' and '\2' escapes to begin and end + sequences of non-printing characters, which can be used to + embed a terminal control sequence into the mode string. The + default is '(ins)'. + + 'visible-stats' + If set to 'on', a character denoting a file's type is appended + to the filename when listing possible completions. The + default is 'off'. + +Key Bindings + The syntax for controlling key bindings in the init file is simple. + First you need to find the name of the command that you want to + change. The following sections contain tables of the command name, + the default keybinding, if any, and a short description of what the + command does. + + Once you know the name of the command, simply place on a line in + the init file the name of the key you wish to bind the command to, + a colon, and then the name of the command. There can be no space + between the key name and the colon - that will be interpreted as + part of the key name. The name of the key can be expressed in + different ways, depending on what you find most comfortable. + + In addition to command names, Readline allows keys to be bound to a + string that is inserted when the key is pressed (a MACRO). + + KEYNAME: FUNCTION-NAME or MACRO + KEYNAME is the name of a key spelled out in English. For + example: + Control-u: universal-argument + Meta-Rubout: backward-kill-word + Control-o: "> output" + + In the example above, 'C-u' is bound to the function + 'universal-argument', 'M-DEL' is bound to the function + 'backward-kill-word', and 'C-o' is bound to run the macro + expressed on the right hand side (that is, to insert the text + '> output' into the line). + + A number of symbolic character names are recognized while + processing this key binding syntax: DEL, ESC, ESCAPE, LFD, + NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB. + + "KEYSEQ": FUNCTION-NAME or MACRO + KEYSEQ differs from KEYNAME above in that strings denoting an + entire key sequence can be specified, by placing the key + sequence in double quotes. Some GNU Emacs style key escapes + can be used, as in the following example, but the special + character names are not recognized. + + "\C-u": universal-argument + "\C-x\C-r": re-read-init-file + "\e[11~": "Function Key 1" + + In the above example, 'C-u' is again bound to the function + 'universal-argument' (just as it was in the first example), + ''C-x' 'C-r'' is bound to the function 're-read-init-file', + and ' <[> <1> <1> <~>' is bound to insert the text + 'Function Key 1'. + + The following GNU Emacs style escape sequences are available when + specifying key sequences: + + '\C-' + control prefix + '\M-' + meta prefix + '\e' + an escape character + '\\' + backslash + '\"' + <">, a double quotation mark + '\'' + <'>, a single quote or apostrophe + + In addition to the GNU Emacs style escape sequences, a second set + of backslash escapes is available: + + '\a' + alert (bell) + '\b' + backspace + '\d' + delete + '\f' + form feed + '\n' + newline + '\r' + carriage return + '\t' + horizontal tab + '\v' + vertical tab + '\NNN' + the eight-bit character whose value is the octal value NNN + (one to three digits) + '\xHH' + the eight-bit character whose value is the hexadecimal value + HH (one or two hex digits) + + When entering the text of a macro, single or double quotes must be + used to indicate a macro definition. Unquoted text is assumed to + be a function name. In the macro body, the backslash escapes + described above are expanded. Backslash will quote any other + character in the macro text, including '"' and '''. For example, + the following binding will make ''C-x' \' insert a single '\' into + the line: + "\C-x\\": "\\" + + +File: rluserman.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File + +1.3.2 Conditional Init Constructs +--------------------------------- + +Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key bindings and +variable settings to be performed as the result of tests. There are +four parser directives used. + +'$if' + The '$if' construct allows bindings to be made based on the editing + mode, the terminal being used, or the application using Readline. + The text of the test, after any comparison operator, extends to the + end of the line; unless otherwise noted, 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. + + 'version' + The 'version' test may be used to perform comparisons against + specific Readline versions. The 'version' expands to the + current Readline version. The set of comparison operators + includes '=' (and '=='), '!=', '<=', '>=', '<', and '>'. The + version number supplied on the right side of the operator + consists of a major version number, an optional decimal point, + and an optional minor version (e.g., '7.1'). If the minor + version is omitted, it is assumed to be '0'. The operator may + be separated from the string 'version' and from the version + number argument by whitespace. The following example sets a + variable if the Readline version being used is 7.0 or newer: + $if version >= 7.0 + set show-mode-in-prompt on + $endif + + 'application' + The APPLICATION construct is used to include + application-specific settings. Each program using the + Readline library sets the APPLICATION NAME, and you can test + for a particular value. This could be used to bind key + sequences to functions useful for a specific program. For + instance, the following command adds a key sequence that + quotes the current or previous word in Bash: + $if Bash + # Quote the current or previous word + "\C-xq": "\eb\"\ef\"" + $endif + + 'variable' + The VARIABLE construct provides simple equality tests for + Readline variables and values. The permitted comparison + operators are '=', '==', and '!='. The variable name must be + separated from the comparison operator by whitespace; the + operator may be separated from the value on the right hand + side by whitespace. Both string and boolean variables may be + tested. Boolean variables must be tested against the values + ON and OFF. The following example is equivalent to the + 'mode=emacs' test described above: + $if editing-mode == emacs + set show-mode-in-prompt on + $endif + +'$endif' + This command, as seen in the previous example, terminates an '$if' + command. + +'$else' + Commands in this branch of the '$if' directive are executed if the + test fails. + +'$include' + This directive takes a single filename as an argument and reads + commands and bindings from that file. For example, the following + directive reads from '/etc/inputrc': + $include /etc/inputrc + + +File: rluserman.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File + +1.3.3 Sample Init File +---------------------- + +Here is an example of an INPUTRC file. This illustrates key binding, +variable assignment, and conditional syntax. + + # This file controls the behaviour of line input editing for + # programs that use the GNU Readline library. Existing + # programs include FTP, Bash, and GDB. + # + # You can re-read the inputrc file with C-x C-r. + # Lines beginning with '#' are comments. + # + # First, include any system-wide 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 150 or more possible completions for a word, + # ask whether or not the user 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 + +1.4 Bindable Readline Commands +============================== + +* Menu: + +* Commands For Moving:: Moving about the line. +* Commands For History:: Getting at previous lines. +* Commands For Text:: Commands for changing text. +* Commands For Killing:: Commands for killing and yanking. +* Numeric Arguments:: Specifying numeric arguments, repeat counts. +* Commands For Completion:: Getting Readline to do the typing for you. +* Keyboard Macros:: Saving and re-executing typed characters +* Miscellaneous Commands:: Other miscellaneous commands. + +This section describes Readline commands that may be bound to key +sequences. Command names without an accompanying key sequence are +unbound by default. + + In the following descriptions, "point" refers to the current cursor +position, and "mark" refers to a cursor position saved by the 'set-mark' +command. The text between the point and mark is referred to as the +"region". + + +File: rluserman.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands + +1.4.1 Commands For Moving +------------------------- + +'beginning-of-line (C-a)' + Move to the start of the current line. + +'end-of-line (C-e)' + Move to the end of the line. + +'forward-char (C-f)' + Move forward a character. + +'backward-char (C-b)' + Move back a character. + +'forward-word (M-f)' + Move forward to the end of the next word. Words are composed of + letters and digits. + +'backward-word (M-b)' + Move back to the start of the current or previous word. Words are + composed of letters and digits. + +'previous-screen-line ()' + Attempt to move point to the same physical screen column on the + previous physical screen line. This will not have the desired + effect if the current Readline line does not take up more than one + physical line or if point is not greater than the length of the + prompt plus the screen width. + +'next-screen-line ()' + Attempt to move point to the same physical screen column on the + next physical screen line. This will not have the desired effect + if the current Readline line does not take up more than one + physical line or if the length of the current Readline line is not + greater than the length of the prompt plus the screen width. + +'clear-display (M-C-l)' + Clear the screen and, if possible, the terminal's scrollback + buffer, then redraw the current line, leaving the current line at + the top of the screen. + +'clear-screen (C-l)' + Clear the screen, then 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 + +1.4.2 Commands For Manipulating The History +------------------------------------------- + +'accept-line (Newline or Return)' + Accept the line regardless of where the cursor is. If this line is + non-empty, it may be added to the history list for future recall + with 'add_history()'. If this line is a modified history line, the + history line is restored to its original state. + +'previous-history (C-p)' + Move 'back' through the history list, fetching the previous + command. + +'next-history (C-n)' + Move 'forward' through the history list, fetching the next command. + +'beginning-of-history (M-<)' + Move to the first line in the history. + +'end-of-history (M->)' + Move to the end of the input history, i.e., the line currently + being entered. + +'reverse-search-history (C-r)' + Search backward starting at the current line and moving 'up' + through the history as necessary. This is an incremental search. + This command sets the region to the matched text and activates the + mark. + +'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. + This command sets the region to the matched text and activates the + mark. + +'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. The search string may match + anywhere in a history line. + +'non-incremental-forward-search-history (M-n)' + Search forward starting at the current line and moving 'down' + through the history as necessary using a non-incremental search for + a string supplied by the user. The search string may match + anywhere in a history line. + +'history-search-forward ()' + Search forward through the history for the string of characters + between the start of the current line and the point. The search + string must match at the beginning of a history line. 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. The search + string must match at the beginning of a history line. This is a + non-incremental search. By default, this command is unbound. + +'history-substring-search-forward ()' + Search forward through the history for the string of characters + between the start of the current line and the point. The search + string may match anywhere in a history line. This is a + non-incremental search. By default, this command is unbound. + +'history-substring-search-backward ()' + Search backward through the history for the string of characters + between the start of the current line and the point. The search + string may match anywhere in a history line. This is a + non-incremental search. By default, this command is unbound. + +'yank-nth-arg (M-C-y)' + Insert the first argument to the previous command (usually the + second word on the previous line) at point. With an argument N, + insert the Nth word from the previous command (the words in the + previous command begin with word 0). A negative argument inserts + the Nth word from the end of the previous command. Once the + argument N is computed, the argument is extracted as if the '!N' + history expansion had been specified. + +'yank-last-arg (M-. or M-_)' + Insert last argument to the previous command (the last word of the + previous history entry). With a numeric argument, behave exactly + like 'yank-nth-arg'. Successive calls to 'yank-last-arg' move back + through the history list, inserting the last word (or the word + specified by the argument to the first call) of each line in turn. + Any numeric argument supplied to these successive calls determines + the direction to move through the history. A negative argument + switches the direction through the history (back or forward). The + history expansion facilities are used to extract the last argument, + as if the '!$' history expansion had been specified. + +'operate-and-get-next (C-o)' + Accept the current line for return to the calling application as if + a newline had been entered, and fetch the next line relative to the + current line from the history for editing. A numeric argument, if + supplied, specifies the history entry to use instead of the current + line. + +'fetch-history ()' + With a numeric argument, fetch that entry from the history list and + make it the current line. Without an argument, move back to the + first entry in the history list. + + +File: rluserman.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands + +1.4.3 Commands For Changing Text +-------------------------------- + +'end-of-file (usually C-d)' + The character indicating end-of-file as set, for example, by + 'stty'. If this character is read when there are no characters on + the line, and point is at the beginning of the line, Readline + interprets it as the end of input and returns EOF. + +'delete-char (C-d)' + Delete the character at point. If this function is bound to the + same character as the tty EOF character, as 'C-d' commonly is, see + above for the effects. + +'backward-delete-char (Rubout)' + Delete the character behind the cursor. A numeric argument means + to kill the characters instead of deleting them. + +'forward-backward-delete-char ()' + Delete the character under the cursor, unless the cursor is at the + end of the line, in which case the character behind the cursor is + deleted. By default, this is not bound to a key. + +'quoted-insert (C-q or C-v)' + Add the next character typed to the line verbatim. This is how to + insert key sequences like 'C-q', for example. + +'tab-insert (M-)' + Insert a tab character. + +'self-insert (a, b, A, 1, !, ...)' + Insert yourself. + +'bracketed-paste-begin ()' + This function is intended to be bound to the "bracketed paste" + escape sequence sent by some terminals, and such a binding is + assigned by default. It allows Readline to insert the pasted text + as a single unit without treating each character as if it had been + read from the keyboard. The characters are inserted as if each one + was bound to 'self-insert' instead of executing any editing + commands. + + Bracketed paste sets the region (the characters between point and + the mark) to the inserted text. It uses the concept of an _active + mark_: when the mark is active, Readline redisplay uses the + terminal's standout mode to denote the region. + +'transpose-chars (C-t)' + Drag the character before the cursor forward over the character at + the cursor, moving the cursor forward as well. If the insertion + point is at the end of the line, then this transposes the last two + characters of the line. Negative arguments have no effect. + +'transpose-words (M-t)' + Drag the word before point past the word after point, moving point + past that word as well. If the insertion point is at the end of + the line, this transposes the last two words on the line. + +'upcase-word (M-u)' + Uppercase the current (or following) word. With a negative + argument, uppercase the previous word, but do not move the cursor. + +'downcase-word (M-l)' + Lowercase the current (or following) word. With a negative + argument, lowercase the previous word, but do not move the cursor. + +'capitalize-word (M-c)' + Capitalize the current (or following) word. With a negative + argument, capitalize the previous word, but do not move the cursor. + +'overwrite-mode ()' + Toggle overwrite mode. With an explicit positive numeric argument, + switches to overwrite mode. With an explicit non-positive numeric + argument, switches to insert mode. This command affects only + 'emacs' mode; 'vi' mode does overwrite differently. Each call to + 'readline()' starts in insert mode. + + In overwrite mode, characters bound to 'self-insert' replace the + text at point rather than pushing the text to the right. + Characters bound to 'backward-delete-char' replace the character + before point with a space. + + By default, this command is unbound. + + +File: rluserman.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands + +1.4.4 Killing And Yanking +------------------------- + +'kill-line (C-k)' + Kill the text from point to the end of the line. With a negative + numeric argument, kill backward from the cursor to the beginning of + the current line. + +'backward-kill-line (C-x Rubout)' + Kill backward from the cursor to the beginning of the current line. + With a negative numeric argument, kill forward from the cursor to + the end of the current line. + +'unix-line-discard (C-u)' + Kill backward from the cursor to the beginning of the current line. + +'kill-whole-line ()' + Kill all characters on the current line, no matter where point is. + By default, this is unbound. + +'kill-word (M-d)' + Kill from point to the end of the current word, or if between + words, to the end of the next word. Word boundaries are the same + as 'forward-word'. + +'backward-kill-word (M-)' + Kill the word behind point. Word boundaries are the same as + 'backward-word'. + +'shell-transpose-words (M-C-t)' + Drag the word before point past the word after point, moving point + past that word as well. If the insertion point is at the end of + the line, this transposes the last two words on the line. Word + boundaries are the same as 'shell-forward-word' and + 'shell-backward-word'. + +'unix-word-rubout (C-w)' + Kill the word behind point, using white space as a word boundary. + The killed text is saved on the kill-ring. + +'unix-filename-rubout ()' + Kill the word behind point, using white space and the slash + character as the word boundaries. The killed text is saved on the + kill-ring. + +'delete-horizontal-space ()' + Delete all spaces and tabs around point. By default, this is + unbound. + +'kill-region ()' + Kill the text in the current region. By default, this command is + unbound. + +'copy-region-as-kill ()' + Copy the text in the region to the kill buffer, so it can be yanked + right away. By default, this command is unbound. + +'copy-backward-word ()' + Copy the word before point to the kill buffer. The word boundaries + are the same as 'backward-word'. By default, this command is + unbound. + +'copy-forward-word ()' + Copy the word following point to the kill buffer. The word + boundaries are the same as 'forward-word'. By default, this + command is unbound. + +'yank (C-y)' + Yank the top of the kill ring into the buffer at point. + +'yank-pop (M-y)' + Rotate the kill-ring, and yank the new top. You can only do this + if the prior command is 'yank' or 'yank-pop'. + + +File: rluserman.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands + +1.4.5 Specifying Numeric Arguments +---------------------------------- + +'digit-argument (M-0, M-1, ... M--)' + Add this digit to the argument already accumulating, or start a new + argument. 'M--' starts a negative argument. + +'universal-argument ()' + This is another way to specify an argument. If this command is + followed by one or more digits, optionally with a leading minus + sign, those digits define the argument. If the command is followed + by digits, executing 'universal-argument' again ends the numeric + argument, but is otherwise ignored. As a special case, if this + command is immediately followed by a character that is neither a + digit nor 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 + +1.4.6 Letting Readline Type For You +----------------------------------- + +'complete ()' + Attempt to perform completion on the text before point. The actual + completion performed is application-specific. The default is + filename completion. + +'possible-completions (M-?)' + List the possible completions of the text before point. When + displaying completions, Readline sets the number of columns used + for display to the value of 'completion-display-width', the value + of the environment variable 'COLUMNS', or the screen width, in that + order. + +'insert-completions (M-*)' + Insert all completions of the text before point that would have + been generated by 'possible-completions'. + +'menu-complete ()' + Similar to 'complete', but replaces the word to be completed with a + single match from the list of possible completions. Repeated + execution of 'menu-complete' steps through the list of possible + completions, inserting each match in turn. At the end of the list + of completions, the bell is rung (subject to the setting of + 'bell-style') and the original text is restored. An argument of N + moves N positions forward in the list of matches; a negative + argument may be used to move backward through the list. This + command is intended to be bound to , but is unbound by + default. + +'menu-complete-backward ()' + Identical to 'menu-complete', but moves backward through the list + of possible completions, as if 'menu-complete' had been given a + negative argument. + +'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 + +1.4.7 Keyboard Macros +--------------------- + +'start-kbd-macro (C-x ()' + Begin saving the characters typed into the current keyboard macro. + +'end-kbd-macro (C-x ))' + Stop saving the characters typed into the current keyboard macro + and save the definition. + +'call-last-kbd-macro (C-x e)' + Re-execute the last keyboard macro defined, by making the + characters in the macro appear as if typed at the keyboard. + +'print-last-kbd-macro ()' + Print the last keyboard macro defined in a format suitable for the + INPUTRC file. + + +File: rluserman.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands + +1.4.8 Some Miscellaneous Commands +--------------------------------- + +'re-read-init-file (C-x C-r)' + Read in the contents of the INPUTRC file, and incorporate any + bindings or variable assignments found there. + +'abort (C-g)' + Abort the current editing command and ring the terminal's bell + (subject to the setting of 'bell-style'). + +'do-lowercase-version (M-A, M-B, M-X, ...)' + If the metafied character X is upper case, run the command that is + bound to the corresponding metafied lower case character. The + behavior is undefined if X is already lower case. + +'prefix-meta ()' + Metafy the next character typed. This is for keyboards without a + meta key. Typing ' f' is equivalent to typing 'M-f'. + +'undo (C-_ or C-x C-u)' + Incremental undo, separately remembered for each line. + +'revert-line (M-r)' + Undo all changes made to this line. This is like executing the + 'undo' command enough times to get back to the beginning. + +'tilde-expand (M-~)' + Perform tilde expansion on the current word. + +'set-mark (C-@)' + Set the mark to the point. If a numeric argument is supplied, the + mark is set to that position. + +'exchange-point-and-mark (C-x C-x)' + Swap the point with the mark. The current cursor position is set + to the saved position, and the old cursor position is saved as the + mark. + +'character-search (C-])' + A character is read and point is moved to the next occurrence of + that character. A negative argument 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 argument searches for subsequent + occurrences. + +'skip-csi-sequence ()' + Read enough characters to consume a multi-key sequence such as + those defined for keys like Home and End. Such sequences begin + with a Control Sequence Indicator (CSI), usually ESC-[. If this + sequence is bound to "\e[", keys producing such sequences will have + no effect unless explicitly bound to a Readline command, instead of + inserting stray characters into the editing buffer. This is + unbound by default, but usually bound to ESC-[. + +'insert-comment (M-#)' + Without a numeric argument, the value of the 'comment-begin' + variable is inserted at the beginning of the current line. If a + numeric argument is supplied, this command acts as a toggle: if the + characters at the beginning of the line do not match the value of + 'comment-begin', the value is inserted, otherwise the characters in + 'comment-begin' are deleted from the beginning of the line. In + either case, the line is accepted as if a newline had been typed. + +'dump-functions ()' + Print all of the functions and their key bindings to the Readline + output stream. If a numeric argument is supplied, the output is + formatted in such a way that it can be made part of an INPUTRC + file. This command is unbound by default. + +'dump-variables ()' + Print all of the settable variables and their values to the + Readline output stream. If a numeric argument is supplied, the + output is formatted in such a way that it can be made part of an + INPUTRC file. This command is unbound by default. + +'dump-macros ()' + Print all of the Readline key sequences bound to macros and the + strings they output. If a numeric argument is supplied, the output + is formatted in such a way that it can be made part of an INPUTRC + file. This command is unbound by default. + +'emacs-editing-mode (C-e)' + When in 'vi' command mode, this causes a switch to 'emacs' editing + mode. + +'vi-editing-mode (M-C-j)' + When in 'emacs' editing mode, this causes a switch to 'vi' editing + mode. + + +File: rluserman.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing + +1.5 Readline vi Mode +==================== + +While the Readline library does not have a full set of 'vi' editing +functions, it does contain enough to allow simple editing of the line. +The Readline 'vi' mode behaves as specified in the POSIX standard. + + In order to switch interactively between 'emacs' and 'vi' editing +modes, use the command 'M-C-j' (bound to emacs-editing-mode when in 'vi' +mode and to vi-editing-mode in 'emacs' mode). The Readline default is +'emacs' mode. + + When you enter a line in 'vi' mode, you are already placed in +'insertion' mode, as if you had typed an 'i'. Pressing 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. + + +File: rluserman.info, Node: GNU Free Documentation License, Prev: Command Line Editing, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + . + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + + +Tag Table: +Node: Top909 +Node: Command Line Editing1431 +Node: Introduction and Notation2085 +Node: Readline Interaction3710 +Node: Readline Bare Essentials4903 +Node: Readline Movement Commands6694 +Node: Readline Killing Commands7656 +Node: Readline Arguments9579 +Node: Searching10625 +Node: Readline Init File12779 +Node: Readline Init File Syntax13936 +Node: Conditional Init Constructs37240 +Node: Sample Init File41438 +Node: Bindable Readline Commands44564 +Node: Commands For Moving45620 +Node: Commands For History47380 +Node: Commands For Text52345 +Node: Commands For Killing56049 +Node: Numeric Arguments58764 +Node: Commands For Completion59905 +Node: Keyboard Macros61875 +Node: Miscellaneous Commands62565 +Node: Readline vi Mode66494 +Node: GNU Free Documentation License67408 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/doc/rluserman.pdf b/doc/rluserman.pdf new file mode 100644 index 0000000..3d2ae7e Binary files /dev/null and b/doc/rluserman.pdf differ diff --git a/doc/rluserman.ps b/doc/rluserman.ps new file mode 100644 index 0000000..db4f27b --- /dev/null +++ b/doc/rluserman.ps @@ -0,0 +1,7574 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 2022.1 (TeX Live 2022) Copyright 2022 Radical Eye Software +%%Title: rluserman.dvi +%%CreationDate: Tue Sep 20 14:17:06 2022 +%%Pages: 36 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMMI12 CMMI10 CMCSC10 +%%+ CMSLTT10 CMTI10 CMSL10 CMTT9 +%%DocumentPaperSizes: Letter +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -D 600 -t letter -o rluserman.ps rluserman.dvi +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2022.09.20:1017 +%%BeginProcSet: tex.pro 0 0 +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/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]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 +def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 +rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 +N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop +false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A +length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} +forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ +BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat +{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch +round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 +rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B +/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} +B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p +-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ +0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginFont: CMSLTT10 +%!PS-AdobeFont-1.0: CMSLTT10 003.002 +%%Title: CMSLTT10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSLTT10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup +/UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSLTT10 def +/FontBBox {-20 -233 617 696 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSLTT10.) readonly def +/FullName (CMSLTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 39 /quoteright put +dup 45 /hyphen put +dup 48 /zero put +dup 49 /one put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 72 /H put +dup 74 /J put +dup 76 /L put +dup 77 /M put +dup 92 /backslash put +dup 95 /underscore put +dup 97 /a put +dup 98 /b put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3 +2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777 +6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18 +979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E +ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF +B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59 +A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA +3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F +D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC +6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F +3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C +4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90 +DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2 +753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131 +54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D +107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3 +7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231 +328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9 +85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C +2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7 +308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450 +CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195 +739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93 +FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6 +F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312 +3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A +A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F +55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC +A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB +69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50 +82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0 +8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8 +0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6 +0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8 +1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1 +D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F +B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737 +170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863 +767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D +EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F +AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3 +826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235 +8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048 +345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE +67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD +802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E +20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127 +5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07 +0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36 +22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC +4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF +CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B +4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880 +0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5 +220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403 +7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005 +27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE +B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300 +7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07 +A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D +45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10 +F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7 +C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65 +AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012 +DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781 +FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA +997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4 +3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A +2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605 +31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22 +A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891 +43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D +4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5 +94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E +425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616 +FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5 +51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9 +859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852 +E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F +2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910 +82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA +22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D +200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5 +892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32 +0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140 +437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3 +BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9 +E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402 +DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1 +CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551 +80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F +FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA +9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41 +031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90 +9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3 +9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891 +4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB +57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B +2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39 +0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9 +03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067 +22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79 +06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC +39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD +E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163 +A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6 +9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6 +B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F +79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553 +2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5 +8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA +1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA +0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2 +BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3 +312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3 +B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F +9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16 +A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6 +91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F +7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D +78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC +7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09 +766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11 +016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D +C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3 +8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278 +E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC +6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8 +B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959 +44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB +C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE +5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB +42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A +F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57 +CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009 +9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2 +82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72 +0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5 +F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9 +EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA +E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD +D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD +F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F +14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8 +BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2 +9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5 +6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A +6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116 +4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE +C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B +A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C +9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780 +42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE +7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024 +1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D +4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540 +CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4 +D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81 +CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1 +0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9 +92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0 +57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4 +5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4 +57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158 +8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0 +C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3 +7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7 +B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674 +EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521 +D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9 +DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074 +F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D +D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0 +56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8 +46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40 +52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA +19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D +465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02 +0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE +078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B +DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339 +F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6525 +EE62456392E5DCAD0A0157A4A033E440AA014D5682606312F72248E13C43EC3F +BBC9B4A2CF19A4AC6ED7F561EB13C3AB22FB3F3EF644B5B47DACE807262DE5C9 +50578464845B950140ADD91D72D28470A5A5FB134EC52F4DBBB9C50A7523592B +C5BAA056E46F8C004062298BEA010C1CF9F49DEAB58C4D2012E04E630F54C985 +328DB2B6FEAC584308D71A9F5FD945A37EA13F3DEB1748320870057A362E70CD +50C269D32993CE9CD1E8CB35BC6F69E7574F37032219C6E1C960F36932A8A2DB +BAD87DCC271657EDF942834AD01C0C35437042331634D36C594CCBD796BB1562 +C5AEFD595E35264ABB2ABFEC7A2E066A7A454659804F6CD9DC64DE1112D95B55 +72AE34B6153425A5D15D9F944A3DB6D580C2A01E308E2CDB032F99617A73866D +F2F2FB6E8617873AC82D4E2224049BC2FEBFE49527DAD70C079B92F08DC30095 +AE63E3E2FA213D52A347347371724EF08B39D7383D27131F75C2211F82C35CDF +B78708DE910A5ABCA3075D985AB2E2EAEC2BB6159094F0C0C775C25AFF4F507B +20070C4FB570D5CBCF40C7DE889378A9EE7E38175ABC3D5B047D1DD925990A04 +76EE4083F3CAEB8F1FF3D8FB0210C93738D68EE884FF86416A2EEF2356DB80C8 +39749F31D1D3751E91D84246B56D759969A6D52832891375DC26E92B7DC756A1 +A02F951C898CF665AB0C2C6D5B455FCA6D20E7F998D2523112A08E8EFE1B5DBE +940EEB362AEE4EF83237348F7F0C08B490D125BD90107A035A8F5330F0F296F3 +DF4579D7B4A947CA1EC8975B1F6B7E3B077A75F2F42DE456E0D540CDFDECC95D +F5B3FBB43590ED54FD98CBFD3A20C42C5B6B5ED2A5F0D4F06414757F992487C9 +83CCE2B4BA91825D14090D1EFC53596F92757BE8DCCB7EFA24C3A3D52DB61312 +C04533EE4424F37EE45DC6BDB79519A62454194332562388F3BF0246B40E9108 +7B64FC57054131DA8A4699CF65BFBB862D05519755E207BD0C5E4FF56AC2BAEA +5D4FC6443069F6314E124BC02D210B8726D3ADF2EDB35E7CB1F92BB412C2AF7D +547A1E309A63114B38B352702F7E48B931550F79C2487152A5A5CBD19C429BF1 +747D88BF1EC932CBC93F006EC34F9197CB9FD486F42A0D5D72AFBF21B9BD131A +C89A979FA65013B3CDDA5D164DE3BB762BBB7A4D0DC3ABF3CF906549E2F76C17 +DF8BDB44689AA9140ABCF001781B8906C2B020EB95FE36B8978FA04BEC5E4D82 +B4A537520BDA62736EA2CD9B1EE4A126D7A76BE51C96AC556AE5BFF978C1598B +6CA42A76139448EA4C8AC849AA3AD204D158854FAC6D7D43BE038F022460A50C +1DC2B6932CC3DBCBC1C27390E29A474712004A5EA3E0A3E62786C2487EFA767F +BCDEEAA4875ECA8A9A7C6F2FD1EB9DB79B7489FA8249D33E38599B948CBB7328 +430476A7489C004F1411BA1D5FCD64D478424920EF72530F3C4CCA9EE495ECCD +125E4E2BB37BD4D4175950422517021F8EC140BC3B11BAA9E513F3DAB63CD245 +27A0A6F69A964E9BFAF575B5E36556A15B2F2FF787DFCC1EE704994A52F2E726 +958538808EE9BCC31BD5E126F848FFE5CDA11FD3F0377D9B814F515750374452 +D7A4BEE6B14BF4C1A75B2BA8083ED62E61155F1B396D960066D0A35D7CF19A5E +C7856AEA2C505E68C8A0736CC1675F740A662AA8BFFFFE507465E7ECF934DB6F +75004934154AA82EA699EABE6318E7E5B51DE3387AEBF11E41A413D986947FD8 +23ACB99110C93391DA8FD87341F337F1FBDAFD306B4B08FC69EFF21A6F581420 +893E94073A20778ACCDB074613F7FD68999BCA1F03A0E298CCE83D3D8C25E1DD +8C25F57C440C5580C87C67C8F391C900F6615ECBA0AA505333A0E00F229F03B8 +69EF147556CCBD10694CB23EEA74CCEE50CA5E8F3DCC8225B950B51C7F0AA44B +C1200E688A8A7CCB8CD763390992ECCE85F4855DA86ECFD21F57F12CEC09A5A0 +0A50B388C378EEB1C4BBC2BC19ADE95C3CE8A6CD901EEAA8DC6F62BD33A18368 +1B0C445FF57CAA3F690D872D42FE746D3AC94DC889F4AA191E824D66E8ADC3ED +D7F7507F1DFD560D3D339C528714AEC12609448660243A1C24C8A31FEAA55E96 +5512E63BFF9CB87AA8805D066E71C70DC175FA3449879A44A1A6343561CBBF33 +B6465433C3C99BD06F2FB6A0CB4AE950A3F2F428AA2E5E344439E77B623E959C +27CBD22A9B092B2604EE92524DF014DAD590A4F474484C2BA41343306A620019 +15B96AF752C312187FF3C1555B5142354F2E947391A96E64DFEEA65D99FCD2B6 +3BC07AB8D7709033C83DE8C9E18BF1490BCCF65D3E1CCD62FC09F7DCBD0A31EF +70F21BC631CF5F4C112B64B4CA88662103C4343B55FDA36B0F78B6BE583E3134 +464FA2B9C8A2C5BA01338C0A0AEA7DC2CCD0D0E7A02C835C1072830582825BCC +E7F31BD6C7A20413F5D21C054CD6389DE00C846AE1B558EAFF7E85D07C73C4D9 +CD9A1F33E0328C3B9340DC87FE981D655905D4E2341966C80787F35EAB88792A +B2F35D91BDAE613DECD5DA192ED10FF454B0A754A14A565DCF8AC760007A333E +413B53F179AFB886747C2460AADF6FD1DC09012A2ADFFA6FE5228177535E91DE +71F9C9D82F84CA13A2F55E9EA931B1E89213EE9817DBB433A7EF0316E0624C1D +45965146A28962980436F050A1E7EB35D18BB8BF8B82F97D64C827F68374CFC0 +E4DB0FFF944DDC0279F2E02108815F40E04EFC82368D19B89F357138F65EF9CA +878AC45EF423580843F481F1394D5DEE995E0DDB18E2B5E2D04A463672BFFE79 +BB6D9957D3C2BA22DB79CD75DF28B99E6473FC222C6722B9C877D097BFB29C6D +E5444CFD34880261E7008A372F128BE5CEE9D057486C1AD98E7AE24292D12231 +CCFE1B54DB8623BF68DBECAEC105E446891BF4473765DCCA7EFDA9FE6DF8E6D4 +90C70A79B1AF7AFE9AC5CBA07D0B839AAC2EA62842FEC9117959B10530C8A76E +85F59E6BF476A0660025900EFD8D714A018AB06240808CFFE5A3766818603531 +AF3FA35AD28CA2C9BA31A2F42FB80BC1ECE71EFE2CD184B4FDC5F76AC2F549FF +33AC81C11411C47D4857E5E6DB9204AEA0F7545ADAEA22BE42CC3BA7EA3F8B90 +C5FEC359641487D93C52D78CE25535A2A686DD4764C072FA8A56B982A3A7787A +F124475DD5C2754430C7EC3527D81C272FB7AFEDC6F79E1988AF9401F2B989A8 +CFE1BD96B21D817BBC93BF77B99C8E008E7CC2E34F0AAF20AE88FFC0BC6C3721 +485DD1F25103245E854AB2B60226693E0AFA3EAE85CA52BD938BF31ABFEBEC6F +4079449F99B5EF0A46E77B6254D4FAAE33FF8B2AA3469F0F0DD625BC4FFD004E +E6C301A8052043E22ED0FA663364CC9200ACE4CDADCFBD28B721FB43EA7A3B6B +F6112C35C224543482A7564D62A4A8F15FE329BBF3934DF9345320561E88CBDA +1C0BF61D400C1539818D2BE38165B6439EA9B45CD0A686C7CF1310604309DE5B +22987BC91A8E913F6EBAF74C65E8A546D876E46A50BB9A3420D5BE001E0CB34A +A143776196BF8167006A1052A54001134D539870CECFFD45B6E37D5EF5A9878D +2A2BB28710DD767C746767498AB23FBDD80706727CF0F556DF7A47A90DE30E5C +A81522D5EC8C478BB58ACD1D1F0139D4C3561DB574AA8B1FBF0AB0A001FF78E3 +2A646659407760996E97CE00295CDA398DC0E8374B6A13C3EB2BE4226F01E76B +A932DDAFD90D0FB739B9EDFB9A2472D6424A45D1A698D70766469EBFD9957CF1 +511F6BC41FB43B9517AADD5DF7997A4A8A8F3A5103BF6730B81845F20D160DC0 +E5AD923D9E24AA7DC293E45FBF7422B952A91A97139B15235D29CC52C5084F01 +DE89D2F11E7283A60E4688B54191DDC1159998D10215FE53FD89C87CE9D19041 +1F1E73F063436E786959943B496172A1C497DC002E00B29A4F752CA28BAC5434 +A98F9438064838B0D6252A05052EC8871CEF9FEF05A07B1E401E49324D463E41 +6B7DEBD3B405C9DC5953B93E48162D93438237F11ABE83189F9C1FE70E1A56A4 +CF539F7E9BA6B2B35BEB1586F59897F6E64340B88CA079DFDD1E987198604D2C +3EB5C8178AAEB19B8D2840F0EF36CCEC7D25080CD1E0BD2B3317603E86FFDC4B +A453AE086CE8AFB093D57733AA40977E9C8D33E3C87DE2D4C0522C40AF2C01C5 +2A7B86C2571F9B67AD85B35EC83224029832D2ADCE65E37748CE08A600641E03 +6BFCF2F024ECDB4AC2C4AFC4987D01C8F8E74715567F7116597A4318331A35E0 +7BB15E134CD721CBF49210AC06D161E7FE9146D43CB1181F464C7D3BB0BB40EA +D19E1C33D6D9924AB13EE6C31428D6CDD9AEEBAE6510CDA14F23159CCD725A3E +1F97ED8DCB17A10783B8CDC9315FC86703FAB6A70DF55E0AB8B4C24862CDCF11 +5F10FAA5E4E54660EA5EA05EAE168E36CA5255DAA0ADF9461176EDC9E3989A84 +0D8D7EAA08F4C766E1A078C3B7D091B9E22A9247A655CE4190A0217ECAF88495 +5DE38DD317E459AC61336D6E403CF8DD2ADD2946F933E1A72C18DFA96EF7C0E4 +0A2D84D3414F3DB23EE3BB5049B174431F4EEA10415D25E41C2094CC2D37C669 +2C46EA4568BB0BC49D1806B98607B8C12AB897E6AF402C6126D4484EB7D9CF81 +B603EECFD92EE41FEBA5F38A93DD24A239BA253BE3776F2368E1664142FF2A53 +5B40B694B20818A2A43226871AF1F7A5A68113CC55AABEAFEEE21E0F4E7641FE +BB5403E96064650AE2703E43DF01A1594C8FE8646A44323D78E7A5A7CE2C2FAE +F98F7D9A2CF888DD195FAEBFD1BBB05CE078C6003F9438205F8A3C2977C1827B +906386BD4B483966FD903432A3A9A54AB0C4E7826CBB97C6808B5B529D5E24CE +8C76A35EB073FD65944F54D1733FF75FD7F78F524F81CE0D92328FC171AC3DBF +DB81784F11106137B72B473AB91F40F73B0B410547F5CF6613EEFDBF0F05092C +3688C3C208E1C9FBF51B505FA0B5F906C5B0A05277772FF9EC806702F0E346BE +83A535578789733FA68FAD54992C16F3F5F1B7560A729226FDADE4FB96AC09A6 +4C5D79CB60D85AACBCC89C04068803B47CF0FAB92F4267438A2E7CF7CD5C1796 +B07071D9F5A6DB95514B1B60EFE74DD9A028CBCBE850052EC2EFF81C411348E3 +F1ABDF1A4CBBFD7EBECC48F89B18E159DC1CFA0606C3BECE071E4C1759BE2716 +0705460FA9E022BDA1CFB2324C8B51B4E297838F07A5FE8E05FD99600F9E79D5 +490C251772EA34DA6649D421A872CF78A9B55BC0FA47E056A6CA9491ED65E181 +58E2A5EDC038C9BD89B3E975837FDBE2A9AD81F700BD263C25C85873E08DBCE9 +7CC2FBD904038CE72A110493B7ACCA882FD48F54B4E0109B095838F30D80917E +5C81948F74E7F0D41652480CAB3B24E90570BF861EE2E3A5E1735636C7849C1D +60FDFAB5386526F7312481A5146C18321F425EC74ED0D778926854C5CA875A57 +9205076C19AB866F5FD0439154484DA165A7CB69746199399E66E662EC2AAF66 +501B6706BA1ACA001546B753B0785AC885A5F13BFB4F76F05AEADA1D290708A8 +22A24FFEEAAAF3C70F89CB52EB655774832296C1FB440B4DC4957C7C32588435 +4FA6775C4BB9070641EB6CB74857A346B38E0F441D61D27489CB0230A23AB63B +052C8453C969BA44B2B6E700D6286084AFD49A79DA416803200F715CFD9B42A8 +D53BC397262BB8F94C7D0A2D83E1249563098645D0E82959B76E1B05BEB19430 +4080218E58354FAE323F4CB4A3E20B21FF9FB791391956336DF8A6FB49A2DD6F +A1F06C8C02464E67CDCB9013A4F8229E5A4F136A11AA204001D16C213691EBA2 +2789C03C9122FF21B891569D4D26C2487401AF4C9B310CADE991ADA6D091248F +30D40520D46944AFEEE4B71D005191AD057AAF2BDCC166F084F29EBF3868C433 +5552509FC469A57DE66010A0538D2CEB7692D1A54B5139D2FC7FCE96C4E1A82F +578703BE28B82622297BB08F76DB9D8E2A7C4B38C7A819372F72900506CBAD7A +4B0014B7A9DA2E9AE84B24A83E0BD86D3BD8E0F37F9F0E56D6102C0CAA768E4E +9BFCDB116780773E04554E67AFA899C9B8AE526257FBD25125EB7644E1AB35FA +E9D6D716877D2A5E17130740CEFF27133D6A38BD2B2BB7BD17E04C21802EF184 +0AD5C85EDFF4234DE6B89B40F7489B4CD79F54B9B8683E611E372768C55FD93E +3BFDDBA88B1B60240AC09A05960F9134700A97DE7E6031F5644F83B5A10264D9 +6118C440225E4864A2AFC406BE4A8AF3F6AF8F3B48AF8EEAB503BF7A66C840F9 +825D9D44DEDCD92A11EA70FE597AD39C0CA0F1C6AFD5750D6BCA09D230024DAF +09F807B23F356891C031E0DAB363DADC371166D728755CA4C375A846C46E7B37 +695A8C66F99132593D066D0757C3E92F64AFF193D211B41405A3E528172C2592 +30A0E1E147E95C002F2BE67E1FAC9C062FBF5182A0726E21CB87BC80E15FA68D +9E8FEB1888C4717BAA97A135EC4B5234135A64DE68833D1FB55EA7A327C5A9A9 +78312C6B32D66B57A4834D6004D83FDDAB7905D94E0AD3DFAB8A4D5D081F2FD1 +4CEDB8C3D8A344C3596A6E033DB4CC4A2BCA9A86D8858830DD5006D7C7D91F53 +560F76B6B4BAAF3DCEC3704E922E3F32C3A450BCCC92E359265201F07B99BD2C +24377943614ED7A97E19D988476569CD51B0E85672F4AE6D6D46382A73DA624C +5188F727DACE6E5BC2F33411206A566B6F830EBE79CC97F295A269141FA8E565 +496EBED5EBDA3E6C7DD9ACDC9AA9864C7F26227F68DAD420BF8AFA428D66F3ED +3919E517437B7BE7C9550B250E90F7E004B3C3D30D9872B84376C84B913D0032 +9B2280354630E263E101EB02C92FD77A76BAA8CB1C5B5C555C81F6ED6A31B3EC +356BDF27A16C319DE965D8BE1D654A6E1980C8FC535B72BD951FBED2C6A9FC82 +FA152728191760F9C54E52D900675AE8A88F7867E0A5E5465FC2ABB868B3D227 +8A0DABCA6264CE647623418DC7850FCA18C34AE8532AF543E46B585E20BD1E9A +E210B1DB301C81537F068B42BDB1B93FB4618B618B34E7D42251DFDF3491472B +62EE41B9F4C2F1EE43C29AD841A1264285FA4DDFDC07323A24F00EC12627CDCE +2DB8592A29424150DC72611D88D29267B1F98F386053BD9188CC91FD52876731 +1DE8DF9085F0F49CA5B14089B55E2E9386D59DFA0116C800A5204F6BC0032F6B +BF15CC4A142729DC002844F5A418C164C1AF0F69353121E4E680199C752AFFF7 +C961E4AD7F5E48212297A346A6FD1E7CA0B7A51670631878D69A60639FB9A150 +30446595791BB1F97919D034BFC08998AE74431E65800A11648D8E5ED18C95C6 +F3F033B3F3E4F7077216D316CA981B5B4EF0C33A7DDB14BF11F496D754D93C6A +BACDE5D2B6EC1126A0531B61B38E73F377CFED681C9DD5A804BC1B7FD78F6ABD +1EDAD16A0D3E4BCE8A12291230D94AC0E0CB7D258E46B5D1CEC91B0CE18B1412 +56AF3A04F80C1655C6DB8A9105D611819D4BB6B920F975D0A19104D8239448E6 +B8F4804F6088435C6C2750932C56753D14C5921DC9D871AE804AAE6D2AE9A3E7 +192DAA0D6F9E1E7C22BD2A0E80216723E09213905F4F291D2540F24798CCE9A6 +B6E9E7866CF589DC2CAE23A7945B52E862975F0578F7D8866DA6DF2ABAB1AB11 +12FB5B9AE7C3DF18F726BC7B51C57BF184D42944FCCB796ABE1869AC8F5BDA42 +0EBCA3366E46D6A9030B2EFA1767BD295731CD1DB7FFA74288CD586CE553CA71 +C69BF555CE828D291172D22DF6B1FF97833BCF7BF569CD79C67A65B8D32AE176 +0F8EF4CDFC09F35100D23ABFD911931C51F71EB0D37157CB9C9984A6F107C365 +48AFAD53E3B33EDF970F19D59CD6D5C1D7962CEA24F4AE9C45425589124A7578 +D40D09FB8BE3B386682B9919756D4EF4AFC2450C6A298450DE1A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTT9 +%!PS-AdobeFont-1.0: CMTT9 003.002 +%%Title: CMTT9 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTT9. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup +/UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTT9 def +/FontBBox {-6 -233 542 698 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT9.) readonly def +/FullName (CMTT9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 49 /one put +dup 51 /three put +dup 59 /semicolon put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 70 /F put +dup 71 /G put +dup 73 /I put +dup 76 /L put +dup 78 /N put +dup 80 /P put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0 +42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259 +4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457 +689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521 +0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA +610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8 +3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735 +C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933 +995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE +EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723 +2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0 +4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC +B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014 +D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE +510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5 +BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF +93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC +F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385 +45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757 +4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47 +088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8 +9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A +09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988 +E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C +0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A +FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C +94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741 +03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF +409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71 +45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95 +39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971 +58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85 +84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A +0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F +F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD +B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD +D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B +3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B +7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D +8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737 +712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E +C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3 +E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA +A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC +2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467 +757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C +54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981 +DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9 +08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD +6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2 +A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5 +336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D +E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB +3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A +E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627 +1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903 +FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72 +A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6 +465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0 +3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32 +CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF +573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA +9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D +15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D +D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5 +15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1 +64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789 +D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C +D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8 +576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540 +ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135 +EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC +9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099 +3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A +1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD +FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598 +C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA +4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0 +CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7 +3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D +D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9 +BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6 +1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D +4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442 +C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D +80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C +AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6 +59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647 +3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6 +14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59 +B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34 +F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8 +54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588 +34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191 +825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439 +BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54 +4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F +66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E +2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF +F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A +1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416 +37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6 +741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1 +39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC +887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49 +B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD +15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526 +5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1 +80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839 +A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404 +BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048 +2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B +B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598 +F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B +9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483 +CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91 +DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62 +6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B +7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7 +D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B +9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9 +EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12 +0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2 +1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10 +85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0 +EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F +D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518 +E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0 +88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842 +E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8 +01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68 +54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A +97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78 +B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2 +D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9 +18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE +A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13 +1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62 +31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5 +408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF +1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E +29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33 +BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B +AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8 +0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D +99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE +480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC +D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481 +FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB +587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51 +A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C +C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C +AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D +AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4 +48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367 +385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56 +8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38 +4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C +839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C +320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63 +7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E +DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D +DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F +461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A +BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449 +1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A +3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500 +0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77 +EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA +AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8 +F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4 +097C4995B60BF4D8B3AFD0A002B3A6E4FA114131410D5658999B86DFDD3005F3 +AED1FA8F077AD1F27EA249221585703F20FB70E37A26C6C3F2E101693C94612B +65BF89F37AA3C10A40EE8E49915F1A1B95D2193D8003DECEF9D76FDAA33B1AA9 +CEDCB21C2A3B05747FB3ABDBD904B66EEC60CED2867442F5FE445587EB8C6D14 +87A6B1B4871A8371A7ECA6A159EAB295B167CC35ADEB8512FD0C237421773BE8 +A081FB687F9C5D676F2944DE6E6B639C37E8E49BD4A6F0903E0C31EAFC4C7ED2 +C3C67E71D8BE2B8D5784E8A6F19A9A8929DF9833440E160945274682F435DFAC +575048CC768BB8F13AA21C6B125E6073611BE138AE06D13E62E7EDE3D0239474 +E040B3E446165FFE60E20B75D2A5F9EE021B22256621C290A8F3342F0347B8EC +CFA6AD68D47C05268EE3AC8683F4840D736EAB585C6284018DC94FC103B4A882 +ADAEFB625EA966F3877B3FFEA518B809A4BD184FE4923BFE783B4131410D018B +E0FF5CB22D92CB1D1C8854DAE543594DBCACC60041E0B906FE5E692CFA6D2B4F +31CF357A50CB1CBDC0BAE6C841A8C0A605330138715CAFE6EC005E8174AB7D9C +9A9AE616B75DC1CC62B7F9EE69DB9ED2351442BD48E8D0A467E28525BEB6961B +CF586AE20AAAA47D9B93AE7B0A4B992B61360AE1A51EA3FC550B5EA3720DCD75 +DD8D07C26180748FE67B2CB3BEB2EFB690657B726CB850C964A773F0EDE2C0D9 +9D7DBED1E5E1E18F68B114C42EB6D734DABD111596AB68D8DEC5246926DB5E4E +D7D701358D7972B2995C7900DFAD6F78AA604C326024C0E35EA5F2E99B2540CF +D72644DBB5EFA49C1D91FCD8AA69EF3AC33385AF45F42D1B8DBCF688A431DFC3 +EF8EF75EED3CA8EC03195F410A062E0400499BCF9017D11C9A4E00AECF98D318 +994CBB28D7FBD01C3AE3EEDBEAAAAF122BCA7A10544804177CC0760AD483D5F1 +4DA0ABD57795A29AE0BAFF8ACE042ED8D5C95DBD358C2529B33856B0E442DF62 +F86CAAB5A854D6B1E30E7E671B9B57B0DD28793445FBC64EF5469CD7A3322311 +E24AF1836C6981566C2B8C83D91079DFA5D02A974D3B83DFE932C0D0C8EEBB40 +CFBA6E52A7A2A313CFA0DB34093C1B6E6D740548B9FA9E8A1A4D0956A3D44931 +882578D2BCBC7FA215D51AFD9209524EB158E4E3FD4DCE581E3871AE2D4FAEF1 +6F25B0BA20F1FBD0943FEA005DFEBBDB1CED7F22C8C8A7FBCEA1642AFDE9AB00 +28624D29374A5CA5BD0060BD399B8750B55455FC22A0D8C5EA953A3CC77DD3A3 +472B6E9EEF8C58E28E19DFDFD99ED3FFDBBF3F164196BDAF0BD36479D927F876 +E2C9F0B20CFC925FFF969EEE5C116ED17F17E2682C997C29325D94E6B28799BC +877868ED48D7B1D23107A5BFB734DE47CB46EB46B636317431E1BAA8F6DC1817 +28CCF87463C739E8E68C40288B69A9E790EB8229DE60BD665964AA130E564EDD +CAFDD7DE4DFA4B553B695CB12CECEE7617CCEA9C7F5BD466DD88C177D116B243 +B4FB4DD3D2A809A379413566E118EFF3254260E73A55C03FC56A9ACCEC19493A +6E8815D0B40B2A48E7DBC6DCC5E181F86BF252A4F312FB1EE7833D001520255B +64B2889C78B19822D3A20363DEE900F0BA53D9CE738F25709C81F90891D4C279 +C5394DD55982721167BFA1C69C55852F92CD6BDDEFD9DCA73DC39791A85908B7 +CC7E5136823E6F4608529995F72C0A7D50874B93B0FC6D6A773A571E5AA0FF10 +C92F4F5E2931177CFC8B8E39AEBE9A5ECF7D6D3DA706E5924B84B8FA2FB56A55 +1130E7001543079C533248B118CD4543EC1BDEDB2BDEF437CCCB539676CDFF28 +9C05CAF4B8A1ED5720768705EE47AF1162E5B979153CCC82A8A9AD1393505BDA +26FB54D3FDE40B8D2AB3F2DE79A0B483F7AFFB6022B81328727F66B4801BAAC5 +2EC53EAEBC6D8552AC3EF2E16F2977B8F80E8F2F682674C09CBC26C80D849237 +9D01AEAA507F5481FDFF95DA933BB57CFB64C016DDE71BE1557C659D09A9710F +A073A68EA7B6BE1F70F3C8E7308B276065284DF6584107A76823B9B0778528C8 +ECD793F36CA5C1C405DF3A9F254C4E959337490840EC48DC14D2AD399111FEF4 +D2A870BE8203798A17D97E39BC7D3A0C9F21D609D6B5FCA9001428DC67C9066A +BED5FB94E6F9EFD725B23AA3CCC97EAF1033C9B48E8682BEF2CEAC57F21C7658 +81A3B8028E6005AC2C13E0C807D92FD343F074F5C543F4B53D2B14FD50B45A30 +86C9775D4AAF93C2E2FE76467BBC2E3A6A95AFBFAAA36D8A9AEFF25C3BDD51DD +D4B4E2B7C6FEA1F4C1A367D12531326160D859E83F458CD782294CDF38E3794E +510F1C1704848465FC209C7E26472EA60F8001E945620857F4885CE61F78F66A +4190871A4136695B576E39D87E5302EB61600EC42B2218CEF1F649F29383FD6E +341F3A27793909A05FCC5A87AD7742BB41ED886460F0832E6BB8D443318AFED0 +528ADA31AE91D2D0889A755FBEB9C33AFACB902E3919605A9A8F9FC44C3F528E +8BFD4F509761F1F513FE45863A1EBDD514E210C108DD567C06D446728217176A +800B542834A5ED0874D4D5556898DFBA679C8AAB914F840C0C9ADEE375269981 +92DDF4B3F3E6226A6657B69604C6536785169F7301CF3C4BBF602C847E01D7B3 +C3824CA683D80C2B06BC68942C8CA4DB60D80043F07DC63E6B31B6A87B3674F0 +FC529D63C6CA00F3B4F2386DA7AE63BD2AA93523E3D70313687D297FCCE6270E +3B5513CACCF8AC2045944C559F001791F06A2AEB21869BBEFFD79EA7BA743A70 +7917186B0E2E20CEDB0A583BADBACC2F4B3DB64A8A3F927D2000B81046D577CE +43BB0DC4AD99E609EFD5F55DE8B5A41FD92F34FC96816E948168EE17CAC0D120 +13CC349F8B1225F396CFC62E3502A43F7ED355E901CA9E60687A8D5B597EB356 +7E1FE367860AFD2EE7B722F22473C968C6E91E7E8A4DE41DA2DD35D51E7DEA3E +D9117DE9E874092248493F0FEA331AE639578A9322B1D3E6A9E866BAE054F555 +3DA676E2B24D1D4C8832355C6AB10F776F24412B106B03085AAEF2F5FDCBFC7D +DBC4CC9F95E945A4E690AA2E8E16ADDD52CE957E883F09D141C560FF4A53ABBB +45B07823B592960D914C54E09E44904BB28DFF1B805A1F72BDFC5D4A8BB5BBCD +EC19366A8E3E08C100E8ADC25118F79BCC38E0D56E2870BA307EDDAC7EE3590C +39C825E8958787A9F4370176A09984491EA71285ECE7AA6D60DB5ECED84E6A9B +242B0472EE67542C4CBC98AB661DABC0BEE7B548EF06C347F287598B249615E9 +86081DE85D56453F3FAC216CD3F3E436735A593F4C8F3E28D5914DDF9DB7EADA +516FF8FB621DD043CD00624FCCAC51EE263B86F46A9162B18FA26E1DCAFFE7DC +974554DF975D02C2948EF4814A5345DCA12047176CBB7B68244528B6A3EF1CC7 +ECE0B8D472DCF741C82801D2BE5877EC14652819A739C6C8E7653B2671E83276 +75FB5C4D67331989BF8F0E699C0B8FCE9EED69F7ECF5B2127C4EBAA283D7B011 +7F30CF0CFED36D7A81856B746E7B08108C9C9AB484E2760D9678B82C956EEE36 +463826DF521155993F33DD1AC5F76B1CBB689999631298D2217B022744312A90 +2541727F580A4902637EE49DBC39ABD68BBB15BDEA8F8713F0B309B9EBB363AE +A20BB2AAC22039C90BDC4FF6459814D11ED09CDC7992237B69315F56F9021FE2 +3BD0EE582D1FB0623A17775292868230D4D36CA7741D10B6C4A7890276C825D8 +7F4F04EA3144B8004821F5078C83ADBD3BC7588D856421AD4561AF9DBC18ADF7 +8F9CA070E79C15790E718ADCE4796C2CF3C777B2692A28F0F208FC2DB5F3F2BA +1C3F731F596FA303E9DB14CB2D5281AF7A574831257A4B4D3E78D964BFDDB79D +58497074BE55D6397C986981686771459B619C0FE8E2AE1066DFFDDE92F95251 +EB30125E767F8C4B673B8D733BD22ACFDFA7B2AEEB52D2F6C4C3579FAB300B20 +55FB500454327D13AF2DFCAC2A170678730D302168B433E462227D5200CC3473 +8165558FBC94E9041B2D5F44B4373A60737C63F2D1E126272B8CFE386BF8CF12 +511686330C6B61E5AED76AC3A475B8046736F5DF0D92C8F48A0A73FBB788463C +A50B2266E2AF8E6A88E0385A485752229990FFCC06F517BE2A507A6BD7FA30A4 +2CDD60E5680B321662125EAA1A5C7C62A251C762EE0A028A8E8CA439F788D2A6 +54E47C631B9C1E86E47AC755BE98E7E3BF1B200E10758AE9A8D98935E2941A4F +FFDFB8F5CF4472A296D6843299EA45776AB68295630A18AE7D28729C3DF2B6AA +DCFA02D731A1BF2BB4715D0A9F86C45E6260E4D6213EB4A95628ED04D57935FF +C24806343324305E4D81AED1E5AEEBB42CF2540FF8C96769F04FEE0864A7F085 +DB143D8224A796C6D983B342A95125662E65F969D1546BC8D907B002E46CE298 +900978B43AC371B432EF75E20302B1482B0BE4A1D5F933957F694ECFA8F5E776 +278E430635B727DBF26863E1DD9D36013F2A53F79884B99D4F81AC2CDD3D25B5 +92E870D36B2C8DA33341D19F1357D583C093A65C8B49561EFC71C37E25A74D7B +C0112D1B4AE64F0B0B73405B416683AE878443FA527EEA2EF14A0234D36FF51B +ACC4BE38DF8A92B6272B23E344FF4AF04CD3869988EDFDB3058C3E90E7A9659F +311DE9F880061347C3FF6D326F18C9B67121013499C63E343CC0CB02EF6AE9FF +FF9F2E46D176B884917823AA077C399E7D7C7780777F02315FC5C0CEFEC3E0C0 +DB1B562F6C1F61939D57267DBB35F449A69BDC6D93793CB7CE9ADB178BA79518 +A43D081F81DDE88BD16F2958EB56FA45516131655B273C8CE060BBA62CC59D6B +93DD62347C2C68670073843422C24E25E891A4D5322CA595B9D9E45A4D958384 +48636974E6AEFA2A58D8F70953D7805D10AA76A13C75AC5535467DE9F943C582 +98545E8653E95751A2E605192A3EA7576DDC2B3EEE28037914AA83ABE4E8296E +F0B84055E5413D56EE98A7337D4DD923D49C6BA4FFA8B6DBAC52E1C2B40F68CF +9AB0FED29250B1B41E9F67656E098020658418BE1B7BBB8029973BEDF017544F +713CAAA3211CE1E348BC5A56C12C516DF69EDAC03D886F0ABB2212913048FB99 +FB9B1E6802D75A38003C7785EF1A1377972B7DAC156A1B41DE4D6E811290727A +9E2960C690A4BB5FFB8F0E264908175DA0751FFBB4D51E96DD1190ECDF2BC005 +F6F5B75CDAB236DED30E4F71F42F15C413D07B53672BB60795604BF2CAC6EEF3 +A5DD8F45023F33A77ECCFEC5402D5BE46E4F8F0CE4EC0F32F86B283A43C25235 +EE90E1C05B47BE5F33F1FFF0B69456110B9A8BBC03D3FDC8454D661E711B7B92 +338C0CBDDF9E9832E687AE4456DCDF304A482A72B86EF41F8447D401315B27D6 +3995B7F4280F2ACC8F7031BB26D3240A1407DC0CCFDF0651AAC6F9721B8A9398 +21BA080FA31CCD478972838819A4A1588D230C76C14B86EE189A124C315AA914 +25649216EC8C3F1EC35457264B5C394573C71A3203663ECC797AF3AA36B4C24D +D6BA6B0EB5F531B8A25AD01BD94EC56BA1C926D753C7B391DBC3DBEE2C2E8C09 +15348A7E8ABB1B14AFD7A5AA07C65204ADA6A6CF391E38485BCDF8C905CFDD1F +181313BE7025266AE9422E6BDAB3B93936B7C93EB07DBE70F2DB2B7F7958D7E7 +283E2A530B5BD7A41CDFF4A8C057D1DBFADBA85E9CE45A8947618AAE1CB3042F +9957928296A4BA11CC2EDFB8485CE6D255B00B2F15BCE80D4E88188959722957 +5EEFD638B94E1BC01662E00DE2882C87AB937D47C81242F1C64AB7DB6C334F5F +F5B73BB8A489629A36D58DBB7999ED2E0C6438272E4DB2CECCC1E64A49472FD0 +AE3AE0AAD5DE8E961D14D070964E2B11E18D9EE65D657E1959738BE1A0890202 +2F447A746243F878CD6FDCFC1C1F688AE4C532F2384BA60EE7243C8FAFEB483B +F7042EA915A31940BE017AFC5842C951204574C0760A2010A197A7A8D1235CEA +C7AEE034424412EA4A84B909A275C5BEA94F0E4D63F7E10FDAE75F8CDF7F835E +F0D99AA64B6A9AAFB358ED698B10E275E1C734BC0B2804A19BD70782CA469865 +281B93F0C09BF0462B817443F3425DF2F006DD7BB238CC4A94619D41F71DE01E +AC9B92D6D6CA965A9224A1114C9BA2BECA3F8C26AA02DCA5A0C636DF64310E60 +60BA72FE671E07136DD843743ECA7F915211B6F2D6411FDECE80DB5775DBA596 +BE97576B965191E407B394AF393D858847A0854EF280953D70A727707F9A46C9 +1B8A51FC1A19589750FC47058AEFF8AD1EB827CA0F3C78C859290D851D57848F +E23A1703B33E474B48CAA4DCA698CC878136903D82624ED218A737F6C7D4591F +C04044287D4977D8C9C50FF760AF82E80F3E6E3CAD0F034C00EEE8791F7C8E17 +000FB21D8F0222103D8F7BE5FD1996F8AAE791679A62F992246AC211D139ACEB +1DEAE8EA556EB93BC2123C0B9819671EB214546344B935C99B9F3AD1B61914F5 +AD96D7D63772F933D785CA563AEF0CB3F71289E5AF02B18ACB028496BF8C82A5 +18DBA1A715DBDD10C9A0FCC32C5456BEDB824C59B1F9DC1528B82C235F45DB96 +0271BA11D75B66DF50FF54B234B4FD9768FA146E489E257D9F5C62578B3A0D61 +A468AFA9EA6F16C25D5FA4DC5D5F2A4AAC8669CA059BD9363EF6467E1EC13AF5 +747BB3D6B6EC468CBFD294409145E61F5AE298785D9F7DFF54498251C5E3B87D +387ED09003333963CBEB24659ACFD273273D5655A9A01307CCA16E1FBE241192 +F6E31AC8D490E31C9D0CC49AD6067C60D1CC7A2F0FEF5B2B7AAFFBECDFBB5B27 +08E35A37C41A85F330ECB2C88B94CA5A9E4E047B7C700C32EDFA055335C04F40 +E345BDFD69377877897B25021DE05CFA7ACE7F89389922CA0386DE41E5F97580 +9FF6AD204597C7FA731DD1AC4FCAB912EEC7029FD2C829987AFE21D24F742D77 +F6F689EB2576E386B632F6C3155068C53C2940F731EB37C7905CFB16594428BE +7B327CC0796E3B3FD6F7719B836A314DD685428419DC74E534E480D17A495921 +5C0DEF9A7AB28CBC1C7EC5642C693E4285EBCCA41E713E1B9FF3F597948E405F +F7FA11F6A8E43FD5ECEC0CE1B07959A325B49C00483656713A0DF26165CE0BD9 +144079AAC23D7B2E24F73839C01B971542915D70737BB184846EB670EA3BD6AA +F63B5DE5A709199EAE53CA83D8A248A80CA9FA65F03D0AF0D17CD290A62B8429 +6FBB59FBD51F3280BDCE40E021D9F0552F8601F4837325B87EB8BFFE373251E3 +D76880A6CB90A6920276343452E0854A7ECC84D743C59E8C4EF59FDEAC252242 +90B9C6B666E94CEF8B1A5A05D7940D877EDB1D52B0588C77BFB3149951CC7B41 +F2E77A627C62D6099BBFB571D90D98ADC819DA5691E297F776241EB5CBAD1BE7 +6A2F5A44F5475A6AFCB4683A3FDA9442B5B9C3B4F47D40100B8ECC366BD49DB1 +63AC7485A5B74EA699318C045528C1378CD84D77E0880850F723D341BB904FC0 +C4764E52C0A92058B8AA8ED472473692870B09AF6E22DC29991DEB71002EC47A +5D8E90392533F3EB4BAEC3FE5F26CFDDFD28CAADE3519AC92B92BC9CB8639D6A +E8296BA76587587344DFB67AE6C55C81710E9DF937FD98EE8D136A1A2A269917 +D191B4EDE291A7B3E38AD610CD2C79737F7992F8C932AC0426987D029C7E628B +99B5A35ED77C5943CBEA4591A8A3521BF101BE5195E7D04001E8FB2C9BEDFE8A +16E60F3F30042A6E33DE1508B471776D74A5C66CD7672B0DE4CC002A63A78001 +5BDFF52FAD0AB9815F70713442CCBFFAC8255EE0BF295F15860CB0AF53BA966B +BE8856AD62DFF9CEF8679E66A156B8262D394AC2FF8732C235F4909A25E0E6D6 +F44FD9C8B99E2D1A7EB964BC39E95A0D9A1B03530EF9BE6991CA16FDDC5F04EB +BE6A74F1EDDF7E6FCA0C28E813555BE7F133A7A0E7D33FB311A2A211A22CF727 +1ECF662DE52E971F6A420460194CBA17C19F8992C7C1A52EA49FA708FD097B3D +BB797E6B86359164BAEE0CA06BA124FEEBA40C4ACDB58587CF914CEEB7CBBD2C +747BF8E016AE6DE5BEEB9C9DAA15CDC37F27E5A1EDA91099ACFDC5D7A07F491A +7179D4A2D5B5F045F824F126BB52B8BA1CD8DF1E31C45DA9126CE1BE450B6B3F +7465E896A0EF8E6BE25B6135F5C9EE3D0E8BB30B2B7C594B8306CA078D9512E9 +6A35B94D24669491080AE1B9A1568ACD117B4D4A6AB6C0325EAB351655A8AEEE +FC9D1C21AC27D92F53A9E41A0CCF29D98E032098F4EA9C3F6653F84C48AF4AB8 +F7BE53D9B609668997EB4E3B38ACC423ED28D8832D7DE94F63B369C62795FBC0 +3138CC22C0250F5CE92B0F97BC78DAB5F00EFBB57491ED59DDC547FCBDCEB9DF +B3D8C0826780A9E0C5DFD394357E6BA6311C4B7E569E9353D872AE90EA4AE7BA +33F62ABF92642F00495CB99D685ED803687B61462B342BDBE629F372EEE7CC48 +68012C362E27001FACA2D0CF46FFC80A2E3956F9501D2637AA1DE848A21F5D56 +0A7A6965B7CA30CC20FFF711457F9B332103EB1770E3D45B853D8205577E16D4 +8E15BAE0901F6EE488206A9827173C21B663CAF46118EEC9C2D86CF9314CC3D7 +E9AE5273CC2716FFF1A486299C00AFE7E28697F82102A4FC554867C401F9E96D +669D48EFAE660E6C060E2917CA8F34D52DFD08428109E69BE69C49016263517C +3015CABC10001BF2515E59CB5A0D1430ED0BEFE8E5DF037C816C7BE5E0144B95 +89FBA15801A48A7867D9607D694779BB772D10B6FC498929A4A689D218350740 +D68A8B8B619F8E427D21F7D0F55FEB9065F3C62A24F076884ADDAE44D7EBCFEF +703C9E342555C8F985C73D05D5733F206A7568A9F3F58A8754C00223A1C5F3F0 +72F387704E979796C5B525E07B52B3DA1BA60BBE7869AB5296C70DE428227E2B +8BA35911916054F35B5194CF2F67D2FA90BAD0E08BEA7ACDCF8852F22D77E461 +020B6568CCA168EE756DA60BA381881F7BDE913CA63766E9380D4D52371CA9BD +4D88F97EEC9C9FEA8310BE410D0F01459BE8AC4FF81AF70E094EC9EAB7AFCF7A +D70D69CC45C1857C6B2872D1B141D68341F36AD9126346230421291F24540713 +177E40B77E99A825AEE693906EFF6BD3B37AEA4425F8525353F5B2BE6AAE27FD +800E0A44A75F5EFD9EBCA37878C3AA86BADD21070B825EF79FE864C8FAC2F4B4 +CC3255F76A697DF96B49B7477F4ACE3E01C3B308B5047BEC9475FE9D51866376 +00F8D88203A31054CA687E9395AB5E2A39F5DA26BC62F95B3E90CF97214E1DD4 +3E6442F1E59E154C5F6F65C7F8221FE80EF5C389AB47F70F6B929FB4C8D8F51B +8A64A4E6831B67F27E96AE2B4E030BF39ED862F097DA695EF32D9D4C6B224A20 +049A643796FACCDC81504563547E574958F55D4980602FF40D3A1E945ABF3B97 +03A3E87F2826092B0632077DA7B44319E18341C0A3D1008B7C877A87252C90BF +D18F22185A572F1A72D141F11A4975B4DC2134275B93AB85ECD20205B690A763 +D689601CE4F859791C32BD4F42400CDF8A711F9CA54C921021FFABAA4BACF191 +0D03B17046E2D6189FFA68152657AE9B54EAF9567A655CDB97DF85BFF36F3316 +501203209E372AC415DFFDECD6ABDAE58C4C80A2FEDE0E29D666FF1C3D345E24 +B8F0E42DB633E7254DD7EF171911B360B4B8BED9424922C4DC228A11B2E998B1 +533B734E5090972DE90739E8BD1429EBAF4A40A8197B46623B193ACD00A1406D +E3C887E010C3E71ED3DED4F1E44D5AA2220956849AEADB10AAF9E8B6B05FDC80 +8E8247306178B255B90BCE6B21BC8C2951C8AB203B97AB3080387DA3EE38825E +561D3E738C63300CF1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.0: CMR10 003.002 +%%Title: CMR10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMR10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup +/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMR10 def +/FontBBox {-40 -250 1009 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 13 /fl put +dup 14 /ffi put +dup 34 /quotedblright put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 59 /semicolon put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 91 /bracketleft put +dup 92 /quotedblleft put +dup 93 /bracketright put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /endash put +dup 124 /emdash put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 +569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 +24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A +2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 +8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E +3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 +D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 +D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B +03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 +767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A +8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B +DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E +94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 +22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 +72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C +8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 +344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A +64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B +07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC +1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 +78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 +CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 +7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 +BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 +4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A +5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D +EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE +EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 +4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE +0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 +C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 +314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E +DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 +EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 +DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E +DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 +7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 +1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 +69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE +EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 +7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 +CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D +38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 +22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C +0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 +BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D +4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F +3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD +B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE +15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 +849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 +FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 +4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 +1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 +84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF +7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 +CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA +4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B +3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 +F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D +F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 +DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 +D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 +56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 +8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 +59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED +49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 +87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B +8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 +C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 +D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 +D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 +F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 +0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B +5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 +229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC +17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 +01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 +F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 +3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 +689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 +4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F +A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 +DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D +364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F +7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F +26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 +43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD +8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 +C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 +94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 +C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 +B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 +4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 +7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 +204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE +B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 +7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 +279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB +E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 +CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A +65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 +BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 +6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 +B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 +63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 +4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A +A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 +67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C +DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A +5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 +C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C +9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D +B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 +963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 +D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB +B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B +72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE +B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 +8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB +3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 +668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 +ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 +69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 +C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 +3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 +407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 +11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF +2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 +4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 +2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF +9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 +CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 +DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 +0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 +5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 +9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A +EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 +09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A +2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 +AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 +324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 +486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A +EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 +52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 +9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 +4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D +B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 +BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 +6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 +B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 +16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED +E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 +546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED +6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 +559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B +C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A +ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 +04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B +7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A +8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B +A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 +94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB +C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC +41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 +7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 +18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 +9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD +E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947 +5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F +4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F +E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF +9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9 +89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87 +7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3 +AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3 +3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E +61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B +F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F +D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6 +652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA +07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11 +6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB +EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2 +BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77 +2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDB693AFE84 +246AB18279A2B24E5B50A2FF6337B7B1039FFDD4B00ED3667B5F2F7BC2786D2F +525A0E82234B30711AA835EAEAC2E404915FC7EC0081B194765032708B5E11CE +EF6868298CD26E5B9EF345BFA3EC2911E2B96A0B40AEAB95BDCCEE38F5EC170D +3BFB792D2DDA7E57BD2FB7669484EF9322A1BEE009594901095DE2BA9A15A0EE +4DD77404CEF16EA6C31FC04A8FBDEF27B9FC1AD3264388B0B12D8E476305B912 +30B51624D4605C45B514473F327DC3EE8BA69032A95301CF714F225A92C253D0 +D943C80B9CD0524C5B87A8D052D2E47A9725EF869D3B89097CC13CA9BC695FF8 +A9468004450A76A13B7EE78A03CC18917EC44036C2DD237344E594569B8F2DDB +21F7619180B8C760741961CCBE54FD6DD07C4CF73B346099234A1EFFEFC88574 +6324E4232BA18A38EC9F0B780C298877EF0AF42C1EBC2EB52DB64A1E1E352503 +36AA29953A073B864FCB31BA938A4163D000A159ED4D345331FA1EB4009CFF67 +1D107BABA6AAA48075C6C50BC7683929EC146594E55B01D4F5B582328284068B +2AB05CE92EEE1DF4557DFC8FEF287CB7F961F4F1828EA48B0ACF5C63E1EEC8FB +6A0EFF132268B7DDF7B465D4A21B05993F4A4CFD168A700D04A7303BC2C00391 +392C3FF97E770E6FAFFFE501242B20B4F7B6C17331C64BDBA3E59695E176CC79 +E7632AC6D2E920AA048BD1EBCF9909D8C314D2EF3CFC5CF88D8570BAA814D467 +96D86CF4415C5B739FA6FE7B4C228F06268D28EE33381982E7B005C26D2604B3 +AA363CA4732B9BB0E4D4EE50556D777258A7BC232087C9F00B0D5EF70270B40D +3071E14E4E5AB5AF1C686C5A7C268D36A0787DC9300D4CFA004F89A73FFEF780 +E6BBC957E31B764159C3ADF752E6E1A6C3B5B855F8A483497A347B601E3C8DE0 +362D76B715916113CBD2D3765197074104C7E17B87670CDD5C227A1467BD678A +BE442F196034B02132850CCB77143C2873447FDB8767C462C63916D9D4A13198 +B7910E1B274B27644DFB2E8372C8CD55E6E2AA5CA952A079E1E6389927495921 +CA39D69ECB4DF382FD2DC213EE382BA1A48CA886CB6AEF2B0C50CAB47B1FC40B +2C95E13190C92480439E3C56188D162C294F24987AAF4E15E8FF7ABBFF2A12FD +AEB884FCFFD671EEB94CC075B815C6A45549EC23DB85923F4C37221641B75CE0 +C5C8FA8403C2C9FFCB66CC74C5160D6C7042DDFF33A954DD01C8E21B21F8F364 +F6FC735507D0DB5F68F2D8B520AAA7E0F1D503211339F9466006E9A148F39874 +A1488F1F0458409D442D2BF5935A655AD4656A8411543F58C63DFF9C4FE56256 +7F9F876B56BEB208F9DCA363D2E0F7DF3CCAFD5F9674675BF622CBFC2D1CEFA2 +7A5323971101D3641E99D84197B00D67436843EB9CF74C273062159C361A07C6 +E3F1E0E4666ABFD5C9AA8F914F05D02EE1906FCB66E421C73243257170617FEC +2F02D5A7F3347CC0D290E52FA815C4D5D2A16A4D4A5E0B50165B0C5C77B675F1 +0EF343D70813346EC4D7384A9D9A091984AF29C810F8C3D4247D37F91C5DA967 +747890DFFB25E67F6FB766168487AE8BD8E49C55BC1B68B831E3F510BA1DA3A3 +9F810B865FA98AF89696CF7489BACBC1033A1C929023588E9E03FAD6D901DC52 +A2F5EB74DB679A16DE42F7B47BCBE16617EDC7328A2CEB2C23733D98ED753C66 +502DD2FC75CE2905A429B5B56C62C1C0FCE17144D96E0C615E7FEA48EFA05D9D +344ED266BD96C3296D6005D289228C62D572167E369AC65724E0E62AEAF608C3 +423FD37E586D41B2AF9B10E0A36312AC1A6F61418BEBF528932FE61881636837 +47CFEDDFEB25F7FC156AC7D6E78D608A91270FF6D1D510E8CD61C289F3E7960C +B6093B333A0CA3CB8BE51107C5C1C085B3CF6D6F61379420AC1E5D9A3FABF084 +80D6C719D93BF74A99D681726C81F9F83949E06A560F3B3905C0766134533256 +6CEECBBE3EDC220193964706085526386391260838C2E885C88F882E29F31F69 +149CB1B4B788BE82AEBD32B5A8F07D1F537D85077B4BD1FF945EED4BB41B79FC +CA0B25D1D761129A6043D701AB1F6655C06DF7B0891C3C5224977B9464A6A794 +5FAC6547F7548402420976CA3A644E5A7CD7F64974B71872B02756FF6A135EE7 +BA60B9974A0A2CFA4E46D91B929A3A0DECDF44C39CC06BC2105538856718CF59 +59B1D9BD88735ED4D83C17A67031178B43CFEB4C301E551D708F5F08E80E5A1E +5579CDA06C9902E412052CE7714A8BE29DF9911F556899F819A7FC2565522182 +20918E8C476DFC00F79BCC4248BCAC6615891C3115B30A39B365044CDA0AB26F +C8966DB46FB9FB7B7BB37C48B7CC4852C8C05A57D92ED8E6AAE6EE5A60BC81B8 +C0B22E5E74610495094F12BA6D60DA3190C4CAC7F46D740005264BDBCDE61FB2 +50B8DF1CBF41195E616F4595F7860F1538363D529E3E3FD2D408B56CE034521F +3D9AD6C30174D0AC1A9F9151C8C8DB6E7624290CEB82632679BD0A01EC30B3CF +FCE72F32F4443E137EA554CDEF84B62CFE21A5E8BFB2EE52C87CBD603C8E0FC7 +35A9ADA5E49FC4C7E3F1538C84761186C045B9F11074F8061F0F4BE061D22C85 +2BDC140F6CCD858B1A4E9AE9444B4EE3DAEFF4E3760A8B851ED3B9780F990595 +36210570D82E9DE83AFB3A20D0D955F69FD838B6F9F785231A84D8BF9F434665 +CB62D518CD5F4623711E022DF76D2CF20202FBA15A1D1070FEA87D6BE954DEE0 +370280ED09237334FCA7AFB1A0CBC9A153A25A929BEF57B202A5889958A9AEDA +535781A11DA8E2BB5C885BCB83053BEDE8436846C7B54B41703839F861F95D5E +3C34C4DC8FAADB39D20DC53F642A28B92D0BF1B02876E348B088AC9B2C55DB06 +808BA40658ABE50D6956C9B1201C8D3D97CF9ACBE1FCDB7E7C02D1BB8D87AE61 +2902D77900C11D1DA6CE808C425A7EC0B31BBDC690E98A09AB656294A1B17E00 +2D12DDCAA5E0F1B44EC9D7CDFB5E916045F5CE852D3FF3E8D421A11356EB4392 +F7DA22AFA6C18C7F507F5D8892E8F1DF11E5CC965A61D732F12EFA8339951645 +CC3AF8C3EC88C5B372729EBBD3530439E0E8AE43B43CF57A5258AE8AB259EB71 +9E1F057688B110D4177CF54B1D56D2EAB6B1DB603D6536EA9B9EA11DD57E7F3E +DB574B05043CEDD701DF8C0982EE726187EAF637ADC279BF7C83A244D3EA9800 +F9797A4D3E4D5F6669B49D2B37CC9BB1C9244B54DD62A5C4BE533DF46F618D3B +9FE2203DC6C75B25AD6B49B2A760D3604F156ACD80CF5458FEEA64E243B2E527 +E750720E97CCFFE2322734D5DD0FB1A8FD8FA77AD87AA1C8EA1B023F70BCCF92 +624F9A6B0B27B5C8A5AD21D8C08F62BA1738359A4D78439A7A580D605929D6D7 +60790297E11930F43BA89832A2D351CAD0F77AF8BB70A2DD5DEDD4B34FCBC714 +C2BEA2C26F768EE44D27F39021F5AC95FEF199F6ACC4A2F3109E081A3AC7F42D +1767C2A82683BED075A3293189784AC8D12F17FC3C15B83915E0425926D6069C +16D58DCF97B1D8E1021F51C47BDB1286B5F9CB60A2B2B7D3F219F20C8651DCCF +80B30FC5B20DD6D887BD571450A3A005F5980E90A649DEDD316A452589B2BBA4 +BE8625C231E5D4886124B24580C7795F7B3D063667F400C18150A80DEA255943 +B9BC4E1F0A0E5F5BFEF9F7322C836AE892F91A4B3291F216F99654C54BDEB5DD +87563AEAEED8D8E65D1B60795F1011C3CC63B8FAA15B381E04E1FBC2A5BA5EC8 +B76DCA2AE3686F7D71CF0662338C5E468C0E8155715EE8DD963FA7C257214DB0 +6E523E1370D0F14165FDEF1C9D2F9DDDB4C61DC764B946DC40BB897E8A0BD7A9 +A7D9B684B5899E1A8F4CF9FF67EE19B4FCB61AA4463C5F06309C7B10A131AC21 +63E04A69A223818185F44D48ED721CCCD98737DF4BD3CF6924C6EF30372E9E38 +22B3230829B054EC1B8B42D29059AB5E706E5EBD6CAFA57502005BB170E5B471 +8BC330C11C068849A61C37E5AEDFF994D9A53E73E12D3F7BF63CD6C435055F5C +875056658B8141B78E3E5050E3F8209CEDC015445893B5B798DED6777B98017B +4B9766F79E20DE51B4081215A072BF3BFDA0AA741D3EAB7F35138C2B32982453 +5681A66A99A21F0663C8B559FA49AD7B854BD648335DC7B8F72EA85CEC66231B +AE8F8FA55020FEB0FDA90055CE8255D02C0E2FCC829AEC8EFBAA08071CDD03E3 +9FE8C4F28DB460E0AE8514E319ADE43559B190D9104C78DEB8DCD9E1B2118746 +3DF257B5DA0A52F0F6F0F70352C2B1F851F14F3251A2CEF2B15590E4E80363ED +652CEA14D0CD2FAF8CD0CD6A7888159FEFC0A3D8978F49D85DC8BFBF33FEE7B3 +C0B040618510F483EF114F46A509E86D08D9470B9A6293083E6FBD511C388D8E +5A16B5777FC9FF933366757609163E9567B121906BAAB48B1D3CEF9D0B1028C2 +18E9B6536DDA27ACD9816D2D1D5571038F936FE496081B801485F9CCAFC7EE0A +34D2BF741863A5F639D9D4E123EE90AEB355314E4E38F3F4C243CAD3112A0504 +48BBD089B189203DF7ED4933819A0C1D57ED8AE20B2B15F19F8A0CFD927CAC50 +116B04C25A4E5B20C4C5864A8DCF8CC9BDF5CEA59D1EC52EF62CB642A8FCF1C9 +3E036AA4DD6F4ADBA4F8CD013C622F831397B8640936910C6D1F82ACC6451C68 +760E14BF5B7845762DFE0037BABBE5046C5F3CE3874702EE51D1A463F3B86C69 +7C758A4B1960E1A796F07859A9B1860AE5BC7D5703E63A37B9334D67613241C2 +5B606439A6AB29FA7386317DB876D26FAC05188B4C59672F2CD9A750A0E70CD5 +AD69A8609AB0C78F625E7749C770391D5426D9C3CD1CD7D37445D9718C07A37B +5BECECE3E6F3147731D5C12C4946F88A7C82500F8C495FFA7E2FFF6A9C2F0BFA +8EF861E6C369C8DF969B5FB0F02CAC74E8E080B16BEF1CF0D1A81E90FA1612F1 +FCF086961FDD981A8698FBDCE44A80E4290B7B553D9F46BDF6E346627437903D +499C80A29BE6E7A2C03D943D23C41F1B85C92FE922EE3A3E0601565564C55116 +17F01B2DC9FACA12AC59950EA410D5533B0C31D89FA68D07E9FF1139554C7920 +FF84CB51E13B7FA3EE6A32DDD9FCC192B576A871CBC9E04C5C66ABED560AFF24 +6D6271979BC7D04F7287E32F52B1D2DF60B7D7A53A7D776FC36D70E9C6F54E97 +44F15C5ABF2547DB40EC913EF0B9597A721563C3664E74E7283E9030CAE36B7A +B14E781BC772691347ED48EBAFDF23EDC452EE8A118A840A185B7C1DFB7F3AF1 +A2D64EFBA1C9F662A35F3B46CC8E2D7E7A7F63F9BFEBB6E4A6DB8FF0BDC83E9A +A70438435C3B8A780F7F92578501656FF963ED66A73921E014A46385450D26F5 +B73EDA0630201BEE50325B0F76B55E77BC55F4401251D083225EA5777F42A7C7 +748FAE7C22E6A17E04BA9F6D451B35A63DA6F3D80B0365E159B3E993E0DAA242 +2212784C9651F9A0766F473DF743748FAF491CB69728C2473ECC5524E0F2997C +2650BC1F945EDA4CE833980E706C4D413F7929804A0B1D182E26052876D6B836 +01284296115233D90D2D0FE83317D4AA206A67207BD899DAC1D726C937A34193 +F0B6EEDECB391C6434144275295014BA4283D4346BCC495AE3EC6EE9C4FA7711 +BB6004D39D7BE17FAF0241F2798C36C451BCC4227899837FC244BEC3432ADE1D +9E4F47F45E9B1D2C832FEF6896C92A207AAED7AA924520D096F983D66DCAF476 +83A2F6F1844E7EC5195EDD3E5FBD0FBAABACE5D13BF754BB2B0CC8FC633D83BA +3BB65BD9837B109AC1B5B255298E6B65AE4CEC0FFE24DDC3D1883FB0D6F8FE65 +94D0A898278E0313303CF7DE2E37BE0152A1D4CDBA04ED61D54555B1B107D9CC +C08C89BD2A19050191867EFAB8FD582226B03D7ACFA97C6D404BF99F39EAB7AA +9AA9397B57CD7CAC1B338C21579A593D7DE1241E6F77366CAB10C3FAA772C663 +BD1051F9D791A84C35196E74D28D342553D344199CBEF83D3A6ABF05A4779B16 +EAC70F7CEE167132D04BE5F56F8F20927DC3C7A20239AC6AAC2B57BBC83174D6 +25F59228ED58B5D492B16ACF3EECA04054F59247A8E318B6F5A09F0A8B3820B7 +2CE711056E3A3ED9300B6F2DFE2C665D7C3351D40A779FEDA09B406E804BFFDB +9831478F237DAF6352CADC53D6AE85A14E5FC7C0C1BA4009FF962FAA52499506 +C6F3C18BD4C13C1272D844EE151CB5A0DB0188AB7FA2DD47A6A2CE8554A7CB82 +C0CC30593F062451363778FD5A8D39C60835825D63CF3BEF323C8CBEF3055F61 +294FE558C7542977A3C520DE15A984C6D82041E06C356FD7BE75D601CB95816F +F05AA3F53144B7D768F6732339FB8E6A068F8E021C1BDDB26572385FD1B3794A +0E1C780576819CA271C78010D8416F6B19912227CE781CDF6AFEC335138203D0 +ADEA0617451CE0BEB024CDE135922C72FE0932F10589F0FF9F1DA721D32B1583 +8D032EB9049E4AC34B3AF16C4DC1A85CDD8B047035ED7D50CF8D9D02621BF6C8 +2CCAA23DE753C7B0B8818B68D625F44A54689C0B1CA36FA7C68A567FDAB813A1 +8B34DFF1300D5E42067F51ADDF7DC9BEC7D4376D304A417741E17AE427639676 +407472CBFAABB5AB329AA7CCF130B3EC6DD588A1F44409FD239238B1A8884382 +F04198DD7C5DC5E2288FE0B206C9D9516D468AA6E2B1183E2E906F9DE47C9209 +578321590CF839C9FFD5FBC3393FFC75322B4E703EFE69534745D579B74AAE3A +2336823D2DD5F477F39AA9386736476F5C0B1CB19457D44AD6417BA503475D23 +51A99BDC97751E7172363DB670AA50D21920E98BC1DE7349EF8B8C1E72CACB47 +557B3E2BC30454F75CCC41B84A67648E894AA0A43C5A2BFB5BEE8D0BB07910B3 +47EDA7B547EF357C2553933E0BDC0F05D596E4C55B33AD63E924164DEC1934E4 +58F937DADD65AC866E4EA2BF02D36C54AE3E3727A8FF9F3658337D2BFAED5908 +5BE3C1F4503843FFA47C83B3D9CBF1DF2AED7A6B97A7E68CB6B9E5420E70C5C4 +36843B29D902584DF95CCD8C34647E87E2335371DCD89E495A92033BA482A62A +0D2D3A7BB06506E42A4926CA0AFF80EC8DA63D7B73E8A04B25312F03251B512D +76BBFD76C1F5207FD6A8E69ED9BF063C7DDD0FD4C6974BBC531429EBB55BB715 +0D08FCB2F80275425FE42E87AEDCE78D2BDC07CED8BC49D260D1671BA0ABDDB8 +98E0F7BA7EDA086F4E3585157A71CCEEA35750B9DC3195E3396F1161EE1E1D25 +E6FE6E0B022A9625B5866B8EF59DFE5391AA7F033886402C654F4834F4E43138 +EBAAA758DFC8C27356F012F4D0F398EB8D013678059D8419C2D947F3FB2BDA1F +70A5FCB549BFFAC288ACA7051BDAEA41A4AE0341035B4365A63C553DB80CE429 +02670706A74AD397B49AF535067EB07CC3CB86704ED45301DDFD5238E7DF5ADA +8DF465E45F7514D7A0BAA202305CEC73032FC09294480796251045AFBCD6B081 +8EE4481D29E817C7DC32539B364076672596DC24CA8AC45D60A8536865FB475A +3DB48E98C675A8BFA39792AFD17B5251D56F0D5C27E229DFA75FA3560E7ECFBB +8164E4FF15421846BA40EE13146A316D530287CC8652B58804B95C53F6FA9DF6 +F84DE1E222C5D69E45E12C06C97E672D456E21B95584F8371FE34ECB0E6174BB +468EA60BB0C06B3DF48D996D9083F70181799CECC224FE60736CFCC6F246E5E2 +EF465A6B1B411ACB7474A59BECA5935DFD15F5C18160D4AD4DE9767D6213C35E +08AB18F834CAB32013AEB8C634DD6382D4C7E49F10BC5113214A18A5EB31A0D6 +923630A849327C1CAFEA3B8F5EBA83668E03EBE084ABC1A4C1DEFB333ACE0696 +EB20FAB6FE6E61D38457C8E10D8FB7595C627E8FBE2D5563C4D50A6E1F3DCFF1 +F5A2DF1A62301665C0E44C2257B4516B515FC995A52D4DBD54B3D4EFBFC63A8D +F07C27065CFE19527AE04A9CA14935B7399E30EF88D2B63891A58044D7CE07F2 +916EB8E9C65388A73956B3D82B4B41AC378B4B75AC304A32339CA7701636B6A3 +84254743EA5F8525897D4FB054698031D1FFF4C971A10440212DE812752425D1 +E71B02AAD20E994357EC8436BF1B74F016DD41D6B1F6C1578E4B261ADE5A7B31 +2ECA2C16294C9309F200AE0AB5BDAF2BBCB3E97B0FC5556BD8208E50CDEB88BD +F137D2F72258B6E41092F1256CA4AD867338DE757E29298F404FF94F247A805B +40524952A6D8581F065B11B6324F9F2821A3AAC2E7A583771EEE640F2FD0975D +299EACAB2A99942480DCCC95BC7CEA846EB1B2423FCE304596A2581583450455 +CD1D56843DF8FFBA723FBE4A4AD8E539828BF48BFB4D0C4EAA68EADB81A2C58B +EBF89CF83017DE3382BEF407B493FA5EEF810C740C3C8B646292AECE9A5180CE +07ADE6E6B2935B90BC521D3ECBE25B43F14DABCF49F378C26CDD2B27C690EAE1 +E888EDC3C963F55F1AD13C8FBED4BE0BEFEF31C0636913B47205DB1D0DDDBEEF +4441A3DE9825160AD57948567EDE8660567998D41A0AE2D9A9B5BD4207F2A0F3 +EE82DDE22D16C32A583613E0EC2BA331EA91042B8FA2865A8A7DE1BDAD0B6D33 +3DB1409222AAD20577ABAA7A2DD6B302803FC7B4244ACFF725E37CB5926563D2 +82AEF220424600581E25001DE71E1385C9D690747BCE051539AB8B03B2EA77BC +39B27AA8F63CA37E3886C50E125D3886C5132869596039589AD6A8421C8B7AF8 +B0EE2872AF974A4B779F09DC1DF2BBF673A7FB32BD1BF3D8D99A94E1BCDFEF81 +37B2D7BBB80ABEC1EAD544448E6A49DF730A1B7F63267C9DDFE81131867F0C0A +8D2B37E8B0AF2A6265C57CF9BCF98A01998081E7BBB94DD53FCAE52F3F5010C7 +AFB011FC6FA98FFDF173FA0F935D33EC3DE55890BFAD217870974C00CBBB6C67 +1CC558F6FB2C30B28B9987721722A27EBFA924A382569E3D7C47A3220F21EAB9 +1011D71B104BAD1A47CDD9CD64487A8E9721CABFDB83FDEC748EBF0D08E77CFF +1A54D0B3ABF4024DAA403436C9F6CABF3B6CA7089776ACB183AC01C8E7F287FF +9DA7959C4B7D73F00976AC5C3E4B810DBCCE732E4C9ED9EF8006AFC7314F0055 +FA3FAEC780434F273ADD7D07C2006E4B755B24A26341AA5AC2DCE258F8B03409 +188109067E22F078E093A76FA372C87CAD401794D94317B2665DCC7E21FDF901 +E1511307385B6EE148FE1666BB616351F48A8082ABF94040CDB058DD584364F8 +CBE3E94DBB8A2450D18D435FF5C8CF2DBA1EB562E957A83F184C9F3CC43C1860 +E6FBEE91C4D240C61D7A7D554A17B90D0A9CE1E7AAF7840846B3F1A1BB9926A7 +CF8E9DA56DB81D35CB3687E9818CE74C0336DF7B2CEFD8BC432268AC93EB34E2 +3D361A8387BC92B459F645BC069A49628D7382E22EB249BC7CAAE98AC55FBD24 +F570D8D654B54710B809234AA2E662D2ACC44E1FE1AA63A497FDD94A46B9D1BC +E37B29430A5E0C2E592F13BE227CD9A6556E9A0E1C3EAD9DCD742D1F9CF62014 +5EA4510003418D1881C4EF1589A8B9EFB52DDBB67BCFC4E55B134A3C2E31AC1C +4658B592EF69C2E23E335499A35B91A58DF9A947712DD55BDCDB7E0AADD53E29 +2777329340EC29A51E9020B8EBABB7B066113ED3A4791D3FBCABADC40CC45FB6 +8744DC0116379D2649B216366C6FC83999E1FC558EEE5E17E13A12B252E5F7A9 +E760CD51C96C1B4815BFE37D4D39621BCD10DA9428CF186E61E9921585C1944F +DDC084DC9216FAB69CF54E456D47F65B3FB02F34B0CC998E12E41110A4791465 +19780824EE2AC1B799655553375ECB24149100E539C23829944BCC82211A85E8 +6A2D3559BBC0EDFEC2DA02AE3BB86A9E30AD5BF95E5CD956297C1F6AE85D0768 +1F9D96DD8EAAAD78CFBB543E913951A78D3262CF08BE0DDE7D870FDA94C51A1B +1F8544122EDB7653E66D772E3EBCBCE4419F17500D8469EF4FBF93144B20DCD7 +39B815E0B09D0BC3283E8B7A907F203EA3B22924419C1C3A8DEEAD335FD538F6 +0D5ED1581BB64FAD4979D67D51F18B047E096747FC50C6A2B48377E458038374 +7FF93A3A46E09ADA5A844EAAA3EEFA1625510D3AB7A74764FFB229725FDA314A +72CCE353A9693869F26CB904505B089DE6D41825336318DA00DAFD986779D4DE +E8DC47E496A9936DD3CF46719D5E832E3B7C85B44D16D4BB588CADCCB90CBBF3 +3589F08AF2AF77D7ECC3AB68D6409221B2ED853012C693C522407B4E97DD4F89 +9EAA4CDA6C85F8B65F5E165399F6CA79550965F3AAF7D875CA947FD6BC42A4DA +1AF797BDBAEE65A1C3BAF00E8E48FE567E757715166DD2757F7DE6C45FE4B3FC +A0C76D12FCB66B4CE9CCB47060AA5CB3FD427BCA5B549A4AF34CA654D9421C26 +9EA4106806950525CA856624E9EFF9DC5B598AE4AFE928447D0704D4EE99DF07 +69AC51F4D3163B7424059ABA4381DBBBD5C8C7DEEF723F163AE69C48962C34D5 +7514F73FAF946C121EA5848C29E127DD0FDACDCB6B1AF4414EA369093282383D +0213B391666CF596FAB2AA27270FC273E32B90D3209091D8360A0D50F8F28D23 +F7B8B097E2FCF2DCE92A7D5AB68EE680B691C2DC7BB846FD5132EB5789A30B8E +9B849C18E8560E9F49764CB89FE01E2E9968C769BAF6B44E08E45E563EB14BC0 +70601E5133AAC33723E934677518C54A235EE9E4A832B363DE44FD82D37BEEF1 +E9C842EF2570C97C3C5D6C0DE94DED4DC5B6681E4A04BAA725F0D9061B16C431 +8ED6859AA5E5BF254BD3C29F100293FEF2D0D6EDAF428490E13B06527B5FCC90 +54768BCE8007EAA2EB1AE14F3F577CC243BA416AB6E43E92EC4FC99775BC1D92 +CECEA05EB8ADDA826E364921ABE388295AAEC6678C08D26415B2725025C70089 +9F12735F37C45F00218EA2E398A8CB173086C43B2A7EE4C95852110F8DCD12DD +64AEA60156E560E8D8D84285B523515EC15888E9912C6C1AB91290E1D57D7595 +1DF73319FCA62BE7C04F4E9968F7E453C384899736D48EE6FF64DF1260057C37 +3082E207F796CE6AB2271E3F31AD2FF83B99FC3DF2826C07F4E4CD05077DCD69 +A3B9EC76BC02C12A468AC4C0D7D83FD4BB4BC8ACF9C312CE3144E76D2F3C6246 +A210DCC9834608CD0A52CC551FBC059B88BC2CEE954AC6B5811281737EC83C8D +72B39D016B0ECCED40BDC58706910851447C80E3FFFA9D57898204F9815DB6DB +1EB38FC10637CC50768703AF9FAE89A94B424A3C647A7870B26970954CEAAD68 +E069ECBADBFC0519C33AEECE55AA93C75B6CF907DF65B98C7A9B043E4BB5840A +88DBB212EA2E86888D36B76D270926739B48D6435C1547D703FEA7B989CA60A4 +87CDF9DF654919F730787D58680BAD0E5B506FDC2BF0C89569CFAF6BE11F80B2 +07D69B417562178E087AE3AE9380CAF8CEEE40FD3989BB50E8521963B0617401 +2996B2C32A3F03B7F312A211B605932233E7C230FA084BB912BFB20E85D721C9 +532D22AB85802085C715206297C09713C3142039602BA9D607F7A52FEA25B0D9 +FDB7E9FB15499E3DE1E47CCF2500BA8B8798497469DF248B8244493738C81815 +1008200E9457B4CCA5740897B17F8832515EBAA84A237E17542B359F173E7868 +64E99FD8159C9051E876C235E434BD5920F55084DD7F31C6FD2B6CB58E5FF307 +0AF6020EA9012AEA47F9BCF018C30885988ADD1A630C2F1CBBCFD5A2C95028AA +6FC89D43E089957267B6F94C7F4E05FCFBAC85E879D27F7BA921FEDB4B551F9F +3B5D3197C0FCFE264D45F6C1181BA26796006B94BEFDC342C7CCDDBFAF332F8A +D96D8D6C52ACBB10C871DAA7162501071CBC04CE01D8FDBAB48393E59ACCF1C3 +9EE4972D7DABC3E639B1C2722F346553DA9E9F163DCE4CC7CB2D1B966F561A07 +8862C3230BDB104C55DE3436ACA77800229637A6DFE1F041DB4B45B2D1A5481A +6641D77981CDA367CD23E64AD5355B484930C7B09B47ED6C79851844099A68C7 +1F4E6ABBDDD7490259E856C267804A4EAF61246AB4C1233F025EE81793312479 +CECC3813C2D887855573122E59FAD0B85DBD9AF66203F4618F22D6D56E1F7323 +2BE1ABF7702D8BACA8AAB9FDEAB48E3ED56BC0D3E4696505E16473CAD93D0559 +54E8991E7F146F4D4C9E3DFD35012F5830B57FA04BA42BEC724E5708FFB6D521 +B209D2F6CDA86560921C705D6A99F822DD3B182B0BAC8AB381653298B82C86E5 +098FBC2E1E30DDA83919362D1BCF4D91702B16E849E032B44EC2482369B4C342 +211E7382390388FDDAC362431B45DCB55FEAA7C48C30996C47B0E21BB32FAA7B +14D6F0DB95C450B59975CE25D65E727148BC7400E00C249A415AA52DA829F547 +8D7AF32D029BFB27EA195EA3E8A038493FE5BDDFD89597C420CA1ADDD2D5AE9D +D3BF13CE3B530D78BB7413F47056F663395BEAFAF4002BAA6E9FFD3F1F0C7C72 +03592F5627EA49F1C0E8C95813E1C30BC256C99A2F34A027D4552B650B0376EB +9BC2482C80F19BD6F9315C71A185EB246091F6D7D019637100B555077B1549FF +27446A2CA0C8C815B6CCEE95CF19B78908DEDB25C1F9A5E6C36FFE65E0A8F694 +8A3E847529C50351F6CF88F1F3B901A78378BAE535678A6C60D7DF4A00505B14 +FAFB1A1AE87CE09E1E90769C046C11309AA7BD8476AFAAC0EA48E6D32842E0FA +10CEE024B1B178D8B9A15E29F825E42564A8F8F1E1F1EC760FC03F1D5773DB78 +E177A95C3D2E3FFEBA469404A866E662D217FEF7A99D6BEDF9F144A2A8B97542 +9423BDE10EED471B99F70661A7AC7A260C6C32EB4D00F21F7A3A5257EC597EE4 +885981989562FB08DBFCE4ADCBE6D9A1C92F6E9FF65A23BDF943835BBB7C29C4 +0D7C987B626819583D4D52DA32BF7DF15C21BE5BB64B575C7F4B149AC539ACBD +A49DF3F0480DCD61E3C14BBC956DE5D968E74DF4141BEB0106E6C5F7828E4F77 +4EC7F0775CF320C26323EBD09354B3E2A52973E75E54CB42F6B0F5C10AE8A8E6 +EB93124C15AD140C971D2E2D9C2B5275F93BA3B01556B72B7630CBE7AAF3D997 +E82D11875B82071FE770B13C232388C07F2E6F7E9C6930F4D7379BF74FC3436C +D301123050BECE20F2BF95FAD2E57FC50203EE6EC6D9420BF8C218D3D2F8B236 +6572EB16DE1CB2AF00CF19C56BFD8D333FE1DA4494933BAD214701819B0C2ACE +FD02F0682306A6B0039002B0B7095D992A30CB675CDA3D4B196C447F102DB4B2 +FCE3AAF81D94B2FA40B31EAC2BEC613654B1D885EA590F675E6106BFD0575B1B +4AA50D0583A2BA2F79AFC2EF5640A9EDF12F6BFE45ADBBBA43B773B36DE8DD60 +C4BB8FB6F09A334FD947877A785AFCC4F9D366326F5B609ABF1E0CB8942560D7 +68D0FA410EB83A9BE859840A9E024FDF850DCBF5FA8D649B40505AE64B1BEEA3 +6776EC44EA3298203B09990EAAA5FA937CB648A0377173CAAED6432A38B48DC7 +906B730B6BFEB2B9B166526D1E8D4110C6A2A4CE1ADD2D0C9C179621F7867669 +31D3A28EA97D1281E80B4B6A4F223D1FF77F8960CDB83E5768F3A8FE52120CA6 +15164AA799E18FCBFD91697783BA537FA897D58726F5F3BAC1F0B20B57583374 +35837E9EE8DD0DE39B6CFB69EE47ADEE4624EDF65E43781EDD056024FE108280 +29E5A39815F494C65020B91F68D1187F815ED8A312150B414D9DA84F542E0F15 +32351B82F2322C9200F987E477807E9E4051D4057240E99D42E6852164704F26 +81A939AF1E3BD237C4FA341C702F7AB978F63CBA8DF745DC2C57AD5511D89AE5 +B4A80BFC57B1A5CA1A110D3BD5859EF41959EB364DF07CE50F709B30EA099EB9 +01C010ED4F4DA9AB062BB8E10F515559D2FEEE69C579859E43962AF7640A705B +2C3086E862AB4297EF9625C58AF049BDC0840F9562D8D8BC686CDECA7D4259C7 +4C86D8C92909BAB7FA09AA2E83B4089B246F8B4AB7A086C5B9943773C496C62E +9E6344BBD213B44C821CDDA42B1BE933F74BC8FDFD0A85070F50D4881C7E875E +DD689E97ABBF6AEEA6E8C8BA377BF3E4A8EEBBB1D47FBDAEC3B88462A62CF500 +727EF93FD166092861FB67303490DCC4504B759BE754808BEDD580E6DC38223B +E02EE2D9BB8F32E2D3386376F8E49A853F7C81650DBD33E23437EC98F4A6F7EC +12705E52817A7B647F4CDE1B173EC370C78589E329D93C35895CA8B3EA2B945D +E30630DBCB2B8ACC49846C7835869202FB5231ED9167F307CBA31D2DC0B423D8 +65DE2E24CABD53913C01C388F64BB66976FE3B0B421AAE861E0C0D495D5E0B26 +1D207792F1072BABB49156544C024118BF0D239BCB1AEF8AB7F38EEB34C88CEC +C7401AA6177E9B7849AAA081334E04A2205077A90C0377A363F22091678371F2 +36A088CF84558630C3F370FE00FE97209AF40D77C6F70B1B4028F1680FF6268D +EC09B05DB3F8DEE17678CFC46AE78E02DD01454A9A8ABBAE157086DDC92AD22B +DBE7861A2909232DE46FFDB6FC84989B2B137C564FE84961BCD663B592FF2A85 +A65D7B595113AA7DA8463F852A28233A754591A5F2D7F70649A12EB8CFA35361 +1410C7E2F08EB5353A91CBF2109D6E279758B8E458DC7737369AA35B330A9229 +B73DFB9E1745410440E440DEC966C0B21349149E08D57740773B1F17161217AE +B0605236A44353081EA2248CBE9E8F4A0CE1499354F6475C10346F337227B8C0 +2474942B49CF891C5D0953B1015203B1BFE0A7528C900968D16A876AFD9BF28F +43EAD0516A38FE48F7091219A717617CEF422F7E2054F3E40D7D6239F6744E44 +86F62AD7ABB61DB0E75B245B44E7A6FF9D72DAB469A07D8046DAA059CA891766 +1420C7A397CEFC7CBFC41A09C54FEC6E77312347C14CB8D87B313A0E7F2CABEF +CEAC4B9E15C279A18BABC098027A02EEA025F481769AAC7A89F9F419A9EE5908 +351B0D25A2F9FB805227F0ABC3D4A87C63C59E80B1BF915FBB1E1E164568CCEB +1EB5B1A19180F370EBF2DD11827844584475357DE9E31A138874E567B8E1DA93 +FC5D6084A3737CA8EE391773F3F91C243AF33013891B4E7DCBA7BBE1E06C5031 +C3C0FD60806B7052C5F7B069BFCF4F879914D9C2827EB53C505D5C738E1564D1 +1FE8A3EFE5B3EDE0B766E816FF02473739FC5BED647CEB758C6D7457ACD5E352 +1C3F13E6F1DBA43FACA8FB3D257B24902EBC64B10C7701AD3850BD845140C3D1 +A6CB630AFD8E81ED647D65D7F51803369D37DA44F36D8AC77976AF53B9C4E56C +84D5969C27EE9DA518FBBD8430D5769AD02F28B6036D5D8AB73C784734C22D5C +7200D0A706326DB04C52907DC99648D46F2741B3A9BADAF9040F2CA68642156D +E597FD6BDBB5658C87501440DA17A44557EDDEF1C576F8FE343A6E2DE27CDB35 +8E62AA7C8367E3E44DA6E435DA063BAC3DE82D73AA2A147CC5A844187D29B83C +D12D91B9018718B53C9CB11CABDC9F7A8848C19E73E1DA7067632DFED7994B8D +3A5E1260D0315558BA94389D996A960836FD9C7570F02C453129DA181B2BB9B6 +56BDBA69A47729BB3EE50403667025273C0FA725D6742B32DF5E58BAF48BA6BD +DB77F2571F3643E792CC757B8F1AABD13B60965B5F1AEFC5108B68126149F4F5 +F54E72341790C7D75372F0550FF3C9FA8844DE0C6E71C261F94C2A763C6853CB +6179437BFB20949F530804A81C8C71B2E04531E2F3E0C158040763FF38F69682 +F8FE6FC7F914C9BD77FD51B7F533FADAC22C819B6F7E3094BA3B4F96A74E43BF +240DB5BC95B8577597AB79D6ECCAB0D65EE279F5CB8527B05BB521EF2F7F23C8 +42349BEDFD0E303A7969A9383A6290B9ACFF7C7D402EA8A7C9517F01C28D31A7 +5B705C785F6418B802A18AB458C03291A0751FB55AB25515926778649BF7DC53 +8E94F949469AB3EEC16FCA42F98220A5EAEE73D6E82C71779E8892B2BE652796 +E12C2B6E3D535037013D60F8211EBA7119383CEE9B06981BFB98666749064BEF +338B4AD1C6300DA217F38EBF093C867A7B019F1C8F4C64226FAEFC38027AC7F3 +A528689C44EC4CC0D0612AEF76650826D2B16F53675A57273A78A911647D112A +193F579ADA161BB62859141F9893013F55D636A595E532BCA11F26E5846724EE +E6F3026983BA6E24C1E462CB599D2C6F3E7C0803244D9A773D1DE70325786EF5 +C42D2E9F3DDA5F7108E3C28357AD1F088404AFF56EF5BC9ABC92A32BD46FAD66 +4BF53BD32E3A6781F4DA33E25E0075638D941389DCF2D5F3FA3C9AD7DC26BC19 +28D04510B6DC27C7C6EF0EF6189968C8759920E15F65108B389BAA1D2047B977 +E1818381DF9FC5FC217DBBDCA80BAB7B98E7A00A97AA3BD47EF50ED526FC8583 +1FF5B2B4B470642E3F575F4C0B1FC5EBBDA263F89E6D644E2F56DBC6FB50D23A +A04A2ED571997F30657BEDF19D268F69D7A624FB11BBE30E94448708D077A238 +CD4543C8E805BC0DE96A0F4E14E721CA75A34DF4F911034DCAF94C190380D55E +77BBA860C105DCBA06BB201281A02830F8FE7951855ECD7E13A2514B2EC6A93D +A40D690A17709E21DA5305E3DFFB395708581573005A777EAFA0403B2F6ABC0B +EAD09C5C3E2B111D8E3687DDA302B8AC5B11341E916A63832439057BC72B2E67 +7BAA5ECF2A8FB4D60751A1F209BA3F80E2BDDD496106EE382F0B704B94A7EB2D +1659474F5B80774BB710BA2A744794A74061970230B044218212BF7C908A9F5C +8575922D7E0D13FE10CC1E548C182F402346C6E256C3C77E871703214488172A +76E46E6B5BF7B7704AA57E3C8CE8EABC9F8BF0A53538F3A09F27ABC005117354 +39F733BCE06C01F617CA9552C01B0ECC3AD05D9C04E67CB7C194007C4C64A460 +726BA5371B9B33A713C6B3D69A6DDA20E104580E1CCF7B0958E5086B31C28AF0 +D645B982521DDF76581C7DE21C7FA385F5A5AE637169427D13300AA66B53DBCC +4CC79A0320A2C5379B7A9A54AC967163DBFB993753FA7AF4E4F7AB3710BDBF8C +3F10A9BCC0BB17ADB5C5727895910CD7CA7F4923F00B07FD16318E0A53633A3B +0501EA6D8851CB557D80120DF270B85DC721881CD897BEB71CD7EEC64CA12990 +E8E580E138EF6F9EE2F8EBD3DDC3C5F63AAF381ECC7350379646788EDDE61725 +C72975D2DBD54F7E7B5B1DCF78969BBCFDF726C8F7CB93F39CA28715C943C782 +5CD1C1DDB42404E24E079ECB45A8C3625039AAE73D365CDE69473537D4E575A1 +1D017E12D1FB54B41D956915EB6315A82EF3CA876200D5CF0973CE5F56649FEB +F62747208C08C8C61A0AE81FC3A538B16DDB109177C7A686A256CF37D55DBDA7 +8F807AD40060A99A44BEDF27C3B7178199E750C91119A7AF35496F6F1ACBD666 +B5E1C8F49FF59AC5C5648011E2D0F7F85596705D4DF9CA26541624DD059E8E70 +4E74F1743A6C6DFE15BF1FAC3CD9A004F3AD0828489706818A60C1661B9E09D3 +3F18885643D21E8EFFA14F48E22ED8124BFBB4398024C177B02C760A59F7C0CE +E1B619449022B819131DDCD178F826A0C2E9389C2B8B44B229F954FEB4D5FC0E +CA84B53501FC1767BEED2381CF24BD89BAC6BFE1868C78416159F6F933E7C828 +DB743BC92B2EC3DC2DBB0E14F569EF1BCFF9182C04627D1E2BD48EF654850CD8 +7151797484EAFF38C38F8577737F5EE125EF08565E4F6E6603CB9CAFA165A355 +4B06608C939495934D515A13D319F3F8C4C1425363C897D025D28BF1A4BFA09E +0F97561179C2C0F030F0B6A3C8591537506D9FDF232AC0BC848E517E61F2AB95 +88D386584AB5F92CE4C68D1F419A32576D47EA6CEF4B37946B1E3DAB1E67FED4 +A5B70D62A9F69C227C21C8AB490DB86DFB4CA788B6CBFF8F02B920F739B141DE +1A095167465D82714F492EA9D2B4F7BF14719BAB487EF25F8BD1B377FEC95E66 +F3D7020294E06E743A606D61B27DE20252F211737C4026FF7B9B4945DBFC9809 +8E1594CE15A1D7E5270B7448CDEC0E7D728AF99771E64A43B27A041FCE6B963D +42B6E1975F5F8F8C26602DC75D04ACF27CB1DA2B0841529E26CE6A1D0E5E9B31 +0C191C39FDB29C4505CAAC095E91619AD29468DE658EFE5D5198FE5EEFB0A2E1 +4D6A7F1BBBBE87D543592D0E658FAD7B5A002D6464C9A413D8952C533DAE8507 +B88888C8BFC31C3F8838653527A3AF640BB9CF67FBB5844FA83E7D9D51D801F5 +62C12CA2D6070801067033521249A56C5B0B77B19811FAD4951E34A6CE5CA1A8 +443E4C5B72CAD2FFE1650FFF90A91EE8D7DD95D77F681C1858857EC9C449AA1B +C0D7145473917BC9E1D8D6A691C91E1A9DBABCAB74BB080F506E992C1A974E26 +00C556FE22EA28DF85CE94B3898AD28F137ED56D605CE095BAD1AC60BC6B73CF +85EA4ED98FC0ED5971DC5A75F289698FB94A4FEA6479479FB2A9BFED1859F69D +1EDF8BEFD567FA71B725B11D55B06CF0E95F817DD67612B41AD48934A4D5ED7B +D888DD698395041DB1C9290F599BF0ACD24AD9EEE1ABCFEFABFFEEA96A02D292 +C78CBAF56DC3AE9E909A2856E2614E2EB9D4F46289AF8248CACE1CFF69C66F94 +F5B939A523DD14332C225110DA3446A4818FDD67B5D16FDACA990DDE72B9F10B +F3924237D2B6069030B76DECAFFA70FE97F5C5C684A750AC53EE37B1E27C5910 +48BDAC0DE147D16BEA29E4A67AB88588CD8F3B50C4EA3A18D81778949CB17F14 +E4B19BBB9FE53ED4105C05FC9180CFF9F59F956CA0A6D11230499F04724051CA +B98968E61ED0DF26ACB0D0EB7EC9BA825547B42F4A439AF0F1B4D4F9F4518ED9 +4A80B709484E08438B6D103CA4F0C7C8CE75889EC2C501A375FD8D91722D5FF8 +195D24FB5D569630D94FDEFA35A8D881FF0271B3D451A884D106735D4A2361A6 +D71626BBDF60991E20045C1B980FDCA1F436C1EC063C9B454E55062FE19F88B3 +C84211C2D38911CCC65C1B10931EBC9D633FF04826D1875DE425E69D60905013 +3280E96B205088FA4C3AA2665B595DC5BE5AFF1C29FE961869F3A03AC93569CF +A1EF8D26E4FCB55CC541FAD73B55A60A9AFDB07C4F26B7AAD34193D5D3E55B6E +53B7E8C23EF6AF8D363C59A59C1C5DF268B43E3BDE031C960662E3B308BDE103 +5717C31227ED287DE82B9C1923F0FB2885C2AA2839273128EA545CB9704CC989 +C4B324BB68E070E9F0810137F4B1FDAD4B7E959872BDB8929AE4855EB15D88BF +F1A10FDD74B735B9EE49465875B67070F6D6CA219A64FA86934A4CB5EDF7073B +B814B8C9892EF9A90129E3C0D84BC60C0DAED6A7CA8EF9164BAA7B3B11736AF8 +C58302F9578CAF243178E37C0CC8C3C9544AFA68952BF4B02890A0D000645694 +7AEBF900234A5374E199A5D90F10E57A1C123DEA596AC51BFD29DF7433141F90 +E0656BECAFED14399A3CB3A7CC99D5B2A8F88FAF17C9EEE84C08D0EADBC15B41 +7B21B8BF97FE52CEB94EBA37CEEB39EF757F7FC8A76B150796A27C646D5C85DD +69AFE8AAF7465D0BE73B348CCD8E6493AACB6CEA5C15A9636C2DF301E5C7F72C +B8C6BA861E90D2015817619C9A013CA9E7D22D26C6E8393187F8179E1693EDEA +F2531A7555FF7BA758D3792108786E9745DC6B235D02AEC8A65A45CD310169BB +F8AE3BA1C8A88A4C2A8C2C730F428FDDE333C75558417E41F95D6DC547E0AE93 +134F547C8F7BCA1D2FF766A9E2A2C799C529348871F5A56D5B8ADEA3B2A11DF0 +545A0A5930AC1EB9B33D296DB9F1E8B815B741D855622350EC35DA65E002610F +4EBA010D0E018E168377533CC24CF7F4B79C90FD7C4AFAD40756621200E45012 +6C65F1359854128910451346DB93A34374EBE00140D3BB639CC14901E7C448EA +B7C6F6D76DD96CDB8910BC20869B7E235BEA990DC962554C1D92EC9625813BAC +252E58DF9D422C9C3645A999A3F25B5ECBE2B43926E2E9951E47DDC1E302FAC5 +921AF039D110CAB81962ED99254457E99A142A2F3230492827806417B1480691 +BE5511A7C1FAEC3B11745B30A10B8DDBFCBAC3B3B8122115F3E869C36AF8584C +ACCD78A3B88E09C7AC348187D3D9B650827FACB330B2492DA961EAF8CBBE87C6 +8ADD19B167EBE1A73EEFD7CC9239DBE4E8438A4A16A28F97A1C6CEB14F543C23 +238478AC9630CDC4CD3A01C8DF7E06C8B8F033A32D2B4BF1C23CAA5366367DDC +D3CA457D69489D0C84E56D50796B28F8BD089108F4D8C7FF554CC68309055B12 +9F910D46D48AFF711073F5453D8DE7A781FD9DF4CF4B28799093DD8FC2055BCE +E8129ED81391F18F26EED523B9BCC59E941DDED79B23E74FC37BFAE9724A9E24 +5304601310BE6FF3B480C7BA9E0B72E4C6FC8BE2A0A9407109E1770ABC56FBC0 +A8A44AC1496D3F41A74B8AB00435E679E7B107C133F3669697E8341B70DEDED3 +48D6BCDD9BF9D336F25E5739A9CB1420D6F1813D1282C0E0EFBFD8DDE2C66089 +8B82A466300D6356A3257222AD8B28F8185085218997DFE0FE1A1CE1AF554B98 +A1699E9068CB49374FDEFFA433B638B71284FAA1211B65898C3C056802FD3AD2 +3AA4F680922D437146E4F7DEC9CB8ABF1A8EBFCCFB7DC9B3BCE38C8C4F2A578F +51B3AA15BD2BA58496CF4BF26DB0DE0CE1214674239166AAA4A25606920B81D2 +A0AD21E24B3AC6A74368F9E7F116BBA02DD2AECEC99F41BC3D955D43C2E22F2C +7C81B1EB554351D47461805FEEF5CB89426AD58246617F6E5135F7F735822D2A +8A41C2A685086F145175154762EB694EF1A877670A51C4A86139E64063A80933 +61B9C6111F450BE26BB644316FE30986368945EFA43F6BD4BE3840F578C6B7E5 +64E8BB87AF2A7E2F4A8B1AA257C2DEB9C8BDA8A5274E5076756B3E942A44F1BA +D26498BF571F450D904733A0F796238403E5A781E640330D70AD296F6D74B679 +B0B1168B656E9B28E4BC7026FD15197875D89A72696FD7B20A3EE4ECA24B78B6 +6391F8DE690ED48966603F2186424B17A28CD3B64BE1E3768D8AE01954A4DC91 +CDD6F3A30D3C4EB5F9C2CE00A5A64086FFE87EBD9B4ED432FE59DDBA942F72B0 +F6B3C8CA4CCFA5DD2BB195FBE297F6E65CF6C06E9D4475EA2C41D61D39F0B25B +889E1EF856FF0817142ABA12DE2C80A2FBE0C0D98A60952D93E3AB87C644D4AA +B7CD2011876AD53DE27BB957F69F4C4E48B292D916CEE8BDCF3AA2FF9C72E580 +EB5482E26EB7719FC7BEBAEA7102D55048289FBEF5C5829D96A437F4F7CA57CF +9FDE380071F7859DC68EFD00288063EBAC1112227AF649694E3D2D63B6AFDD3C +7702EEE2F4ED8D760D2023EE1193D3266AD408AB8A3FFBBF6FB9FB1E8E849F75 +D79AA064A146C42EBEC6B1F5B77A02D9C92DFE729DB8F03C6E67E9587346ADCE +213F08F02AE6C6D2340E8F041B212A760F0EB6D4C4F7AD11C0C7D003C384E9EC +8009BBF3B5351BAC77CBB2DEC5547D9C9F2ECFEBCAB4D48B5985E891E51C7BFA +0A02C7B166565EE79D8D5BDCA41C79C69399102BAB4561B1171CA99A57550363 +3231BB3E3F48BEAE734E65310AFB89A170D7D2C23690D07050E6246647B2A3C5 +BF170818138683EA1B4DEA8C2F018D0FD5778BEA72C72E6CDA1458BC8D1E553D +E61050AA240D0677D9DA9D9C22810CBC6C0E441C02B27BEF9BB48027E07FC495 +9E83F67BE50872095AD837B6BF75C0B5669091CD4923EE8929877CD0BBC624F9 +17B90C8D5FCE286F68DE2FC1508373EE9F9FA6F5A3978C75F52DDC397E368A0B +57F5B40322053BBAFE6C7F8F293E0E3BACFE054A8AA7DCC3FF253F58C75B9D12 +4669407237089506FE8CC6A24A1025C8B4673B48FF3174C042C4D66BE2AC584F +6A346027B020024CB9816965E99F62488D47EF144740C30CDDD2562F6BAC56EE +04AE0AA4421F68C2525130D92002CE82F361624166C24F7C2B11C69310B93719 +0947BA4E74BA25398727049E1E8C94669B709718B2BA25D889BA48D66B0A9EF9 +173C6CF93116BC0DCE2DD62D2A936341BA360D901BF23D9A6579977464D12A3E +14A083FB37A4049BDC5F4D9E8D49D05FC4213B01CFB0231D2B03F552F366846B +7AB75D68EB74D57CA505C571AE2086BBB8072B00881A57AEBE38304FD73F20D1 +B3A3F4DBA7CD736A475A04B7785C64F8802DD8483C75E50F385FE63D063E7ADB +0FC45DC313B0585C605D1529D226FE08FF7ACA26E0CB2C1B23444E976107731F +1795EE18D69C11B9969542AA52BF0D3C4D00862494DF946B74718DB8FC586DAF +64BAE620E3C1512720B0ACB343DA448A0419975CD986B40D91192158129232C5 +85E18BBA914D219AE5979CF98BC9A4006687095BB53215DEE575D4FF7FDFE94A +25A05F1CCE048E2F7A801C7AFACD586C218C1A04B43F167EEA5D6A4EC9DB4FB8 +C2E56225709D9AF95C88DFFF3B7EB9C337069278D51F0824C96DF582C630BEE2 +C4DFA3E9C9CE76D1B52A23CBAAC840EEC8B3786D45834D55942B46B6B4C612AF +BFB077F21E0F7F0EC6436BDF1704EAC52789C75F7900EB441EF83E37C780A699 +2E3B2F5222D7FC4440FFBD93A01205FC7E64CBE9849BD01FD4448B343FEA4101 +9FFF4E1527F81F4DF3FEE2F42953C4BD655A50BDC6EFC02E25A5D8695544E166 +7ECC195622F1911EE8D637DCEFD8686B01A130671BA5597768246CEEDB1DC252 +214E01AB3AF7AB7E3D766C1FF37CFEFC2FBD4448DE566042D46B3F2A0CD85D27 +52F4CBBF632139E86B8A2669321B4488AEE0E3EE016440B026BA4F3CDB798BF5 +1E026DE9653F2851D1B095C7272112CC642066872578C2063921B1F1DC1DC37E +6FCA614E9EDC7EFBCADDF112E3127B753D0DBA1F920964D69C779343ABB1B56C +EEF95475F7CCE12C08A5AC0502C65284DD6F34C8FC31E6D696D9B1075B6CA4E6 +8857AE5D9267CF640DBEB733B3FA1DF1EE67D578445DA58492A8BC190AE91CAE +DFE1F1C833312BD85578E1D63F8E593432BE3D4A9307127750DD9F9509660664 +92F85F9C97860433F1190C2448AAEE97CEFD9E048681D41D17F5CD3B8C6C3AC9 +E7D46179623C806085BB5D23E6ED26B2D900515216EFC224A9F25660536467B8 +B47665F6514284E567397A7AC78784A8CF47B61DDC9A66B74C04FADC5074B8C0 +476EAE541AB9F94E990FFC31CD94CAA9E93966096383C1951B00C4E79B51A728 +7526A4FD3A5F6E9D673555CD7142C94EDE73E8A3295341698D777405898E3B4A +E149CB4E9EF567CC18C35C3BA9354CDE55382A6569A8D0B2B7453E5008347B32 +8B5745431E577B3525D343EEE8C0CE5CBE1CC6D3FD13AE8C5C9F672B10451183 +3BDB33698C0D220902195138EF44A545EA6092A79C9F4AF24D73B735E3733FE6 +67E47D76CE584299B16295BE997949021F949E035F49593BC128DFA89182F89B +2FC9EDE36D2010B1BA62A6D900B00C4524AC6981F0DDEE41043ED7500F574409 +C275BD142BE36AD2F5B08121EB0EFD58E8EDF388CEE211D4FC3C2D04D09E8757 +17CF2869D202B2302BF7F5741F4DF47C1D76962A3DE9E718ACF684751BD968F4 +6B3488D623E734451674276CE47A465AE3F50B50A938C17DAEDBD7E40737FC3D +35A709ED283B930E0381A174F3804E78BDF8B8761BC37179A96FA636127145B8 +639577E80613C9A547AA8C3441C85E8408C0C4C1A5143A3179F9366DECA49F47 +324BCB48FFBF44DC15A98DF0A4F9331BCD908E5D516881A82ADA22B906A85015 +6643813BFBBFBD2790451F64AF61E0252CA23D2C44BB92D546B50DF7C2F5F3B9 +560117B9EC0D5DEC65A4404FD7CAB019E50B6C468DA7B5D2239F298DB98C83EC +8611CDF1D5207EE2F8F817958D2ECDC5557BA2D8023B69FE98BF4ADEBA5610DD +F12B997F1D998441952BD2EB089AF2C6CC99FAD2E7E9AF14648BF99A09355470 +F32C0A511E8A02FE7E24F7E535020C6FA0FC4D9015532467666B0192BAE64768 +756C8AC401A71864A830359DEAC2919113979FE4DA48292EFC5DDD97A53377ED +CB29E122DACB9C126F687AD2684F4EF885727C84F09CA8C579D48ADEF1F47859 +DA6848081327E0316788D90F3F59452FC9EBDA175845FF0FD6178A0582E20436 +4BCE9A140877B4DE31EC9006341568BDCCC9DF9DDA0B086DCF1D5A8BCE4060B4 +1F13F5A274242B4A0990BE59BC8DD36A2AC264258E19CFDC1AA63432D07E9DFD +C35528A40580887195D79101345AEBBD0041A765274D09780B2BE95BD42CD1E6 +A5B490374097FA0E5B6F196A3C47C18E8499717C07A36BF3DEC7064845253515 +E0299143BEED08AE775CADA4F8ACEB96D70F08779BEBF179B2BFB0DCB0F1C126 +35B6BAB5C1F755CC9C40D5506135F11A22F802A9F3C79342B6FB9522729E681C +C4A93373F8E6DB2CABFA5B7CAB4C243C975EFF5C5D634D4D311EEFADBF115E41 +1C3EA696F82803A071B80E18BE67F7828DB353FDE5B51073E86E68486CDCE01F +5D79F3E3DB087505FCEF1F9B01908F1D9FE1EBEB25B6DDB40C119D5B28DECDDF +0F579BBDE6CA59B903368E3460730A756FBEBA62903512DEFDA5CE765C479DC4 +5658ED736D9EEE0CCA46CD2676C475FD3F8E2BFEEF43E7B959F19468FDEDAB2E +BDFF5ACA6119413724BA04E9B006C4AC43CF2A16FFDD90A1E46F52C661328295 +B245F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMBX12 +%!PS-AdobeFont-1.0: CMBX12 003.002 +%%Title: CMBX12 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMBX12. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup +/UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMBX12 def +/FontBBox {-53 -251 1139 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMBX12.) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 44 /comma put +dup 46 /period put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 58 /colon put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 87 /W put +dup 89 /Y put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE +0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D +2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608 +1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C +42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557 +FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE +78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18 +22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE +A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811 +4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065 +4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7 +95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D +9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC +5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF +9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3 +CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511 +BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65 +9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68 +EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A +D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE +2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE +947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B +0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6 +4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C +BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2 +F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4 +6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514 +D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415 +F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8 +481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24 +FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D +419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6 +7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B +70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988 +2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE +0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC +9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A +C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D +1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2 +A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969 +21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530 +7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198 +17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60 +30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F +3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257 +96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3 +B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950 +1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B +57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE +B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC +8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91 +8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59 +B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E +BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC +21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91 +D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4 +FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F +A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4 +A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082 +A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA +DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38 +7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F +07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9 +BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E +8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89 +E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C +B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5 +45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67 +2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5 +5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF +A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28 +5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975 +E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01 +5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94 +6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30 +8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB +BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6 +9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB +B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B +B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E +8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD +595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E +FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15 +13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A +FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3 +DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB +313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248 +C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89 +F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD +DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844 +8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753 +E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197 +A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3 +C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20 +417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43 +19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4 +9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85 +12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83 +3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1 +A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68 +90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94 +3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5 +B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B +82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550 +1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94 +AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D +9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985 +2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5 +99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A +31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414 +3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86 +F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5 +70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E +5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891 +84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978 +BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047 +8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7 +5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7 +9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B +F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E +94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE +0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC +E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4 +7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581 +596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442 +F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E +7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1 +1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785 +AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE +4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F +744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D +67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA +054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA +6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B +8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE +CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39 +EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4 +C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76 +57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5 +5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F +C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1 +CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2 +848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C +B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB +77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28 +87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58 +3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8 +409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7 +A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B +72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D +99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD +8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB +E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C +82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3 +C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0 +EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634 +23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A +59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F +C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0 +1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C +403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90 +1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893 +75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E +0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35 +82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25 +C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8 +A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC +9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06 +0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C +5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060 +62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D +6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E +1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5 +648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1 +FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6 +754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A +E124929876488AFA97FAD1A68A0C3496BCA768F4AF8016D7A65BBA3AAFD7F5FE +E75FE714FFF3D54D09C9747ACA01CEFD260985C6E87477C9C7843343C7E9E3F4 +0537D461EF019E046DB8B5BA258462B2FAEA1826B3410BA3333480CFE0DECE61 +CE2731FDDF7FCF2AEF7CC2B1EE7095F480B3B27932ADC486BD9CC130D94BBD05 +43872FEBA04FB8866ABCB4D379696E73B84BBE98FBC4A16CFF22F8A7AF754624 +2912C228030FF7EF23D51DD61BEB5171AD31E2B630475E16B6E0F3C78D44AC30 +712D165DB658FDA800798803C3CD32B841E159AF0F748400314FAF5038EAD574 +57D57A34CABDBE4B8D145E439A11585A0CEDB161559AEE6459EB57592ECBF980 +681ACF9AD4AA4BF09071C600432BC884639C5F2C3AC4B53CA6285AD78B3070A8 +4912ADB3C55A03A6E1A795BE1026EBB6C6E90DB03B110D3F098CB97BFFD836AB +EFFE06DABB1B3AF419BB3E10009AD2DA9CB7B01EDC45BD60B4BFF2C7E54036E8 +5B6BEF57D32A76AADAB3B1683A49F317F6ADC62E5AC8BA5514F1B560FE8C3394 +7B6536F37C106A2F7A346EFD1B0279949DDAB840CB184F55E74A1517222483F2 +F8DD0E850E93B6F294F711DBB234D59406AC5BA131B55185128B95723E5F064A +8C00EF33860A0467B3ECF05E9CCAE87111A62D6FAE5A661014C7D1E7292AF006 +F77D59DD6993FA330DFF85CBDAC37A18D22AF83571E74E93E55AF28C9438D71A +CF5AADB51C830DFB43104B9094BCF1241DCF70C3481D70B0A96718ABA59A9912 +3D012E528626FDE23D941ABACDD35F58F19DA750BA17D5785FA604F4D91FFE46 +B0AB1158E2E16D72C6C1D563E647AAFF306E3156A8DE6384030E1F83FA970026 +795E8C9905CCF7E0C355BF05638D13FA6B0DF34FC42F166AC2B66607E3DD6A0B +0F19D8DBE03FEB652D9962B9CAA991223F58B3B945FD7E893EC56412F1D6DCE0 +2BC705DC83EA7109A632270F024264A2DA7311C4E185AFADC8D2C6B58C0BD2C3 +4B38AFDB4EFE7E6E03F76E53C4B9751C138349D42FF32951B446AAAF50C4A9BA +90650B757DAC00A06C047685725F0D1D8E0A7534B26261AB4E79B5B88182AE6D +E6FBB991E6BA763687CC9FCBDD922BEC387620F818A7389157AB8D41792E7CE7 +649B1FDF4B05EAAAE1B7301710559EE1E232AF70DD2E137157657237DC466C09 +183D1EFD1439003BF9D14D4CBAD51274816E094ECDD8D4477FE9D58122AA92A3 +1BA2D3F48A9951FDCACEC51FF9835B21C8BC0E1ADDDCEBBD3FF56BE075236F90 +31A61C56B7AFDDB9AA121A24F1D48FCE58E1C584F05B5556592B80824BD2F9E5 +88ED93DB19CFE5082E12B3158444A5F955A2392D840B3E52C74651ABDF75263E +68C8B20F6108EE6EEBDC836838FF413958C294E140FB3679963224E6288EF036 +654CDE66C9FF8BB505AF95F29A5EE796B58B7205698375727743A69920D43D65 +C1F9F203722B0C6F400BA4F72AF4973CD6772BE36E304EF8983793547EBCB7E7 +5B93EB6160FF8860E4B0DC3BEB649C7D8E8BBFFE919E67661C00A7AAD0E92D38 +5BAB4A07BDF83A31AA8CAA6B995B8B7D0CF168E7488D4CD98A7AC3F0A03E2BD1 +0F6D9E915C1511976BBAE3C6000D428A52114A7DEBE35275E642B01C92BF9F8D +E48CAAF7DF91E17359FCB334E5189359A26848FB3D21368120A93965C5E695BA +49D584FFE6A7463499E10AA7D453B7B39A4E69395C9142150AFC85B6EA0D59D1 +D2749DF1E7B14F7C1977C9117A1D7295F527D4FCAC5610CFCA887632DDD84014 +7104D659F4EB53A4C92D553EFED124192BAC43D6BDEF60F3CE6A8F7E1946A2D0 +125435F0889CD55C6B77B5BCB9A76D142E802B56CDF2235A070B88AF1CB857AF +8B11DDE2A9086BF1D250C2E355A4C72A20956992B43013F0E5258165467AFDE4 +9CDF57B377F18E497004A59EAC9D60F72C8138AF828A73AB373D97AC2654E2D2 +58150C99F15AC779ED77FC223B3E7945A29C8F12653ACA9A717CA5FB39209005 +2894F70E3D5F027319264BD398F94E4445E4A4D54E3CA1EEC859118192E0118E +78F9ED10596D2F87816D710DF57315BE9FB0BDFE63E74E4023A8320DE5CDCEE3 +44534F95653A5109043AB0AE1E838A85538DF788BCE8C3603DA2A51909B61DF6 +046778206655ABD87C14583EABA345328C776F58DBE125AD481D4E922593B8D1 +15972DB2E1C6BED5870572216EDF4C19D7C12ED2C37E49E6E6CF552B0E9D9EDD +4F659CB21F3EBD36F28275D69105BF903309C8A7B20258A9642B0541E033646A +61601867A46F2A577265222BE3978E6F84C29576F2DDFAE642CB5F42DF45FB24 +FA36EC2575A286E4CDFA7F27D535E408716EA40BDCFD7096A5358E9A98F123D7 +92E8314B8D51D763A84993E7D45BEA3195EC3DAB2998DE69CBE2C92A15680F91 +76A05F32B384AFF81750D6A1662179FEE5C1CA80AC689148F3D99E0726D68566 +2256010D2B2274742DEDEF94B338525FEF89E5722CAD34EC2C2BA8AD1E7A1CC4 +E5B71EAA6D0069DE687C6306C3419A4F9BD7E5C9D9BB215E410FFBBD6436B57F +C4B18AFB2A3412EE490726FB568CDE52E15CF7F12B360DFD08F6F43F295C4E9A +6FA45D706C707B37FF0CE27BCCFABFF5417DE624A266BADCA629870EEFB43B41 +C5859A5219C9520087C213583AA21695E020B4A4743C06F3A1557AC56CDD305D +D68D482A6D43F8E9E6135EA1C1F2AEABF167FF4869B46F57207502A39DFD1DC1 +25270E5A3BC02A042E2F98539F53A563364793966D809E17DFA9C91089D7B8F7 +B0169FF8AD8D88BB5903406070AAC303369FC4B7CCDC42105A69674BADCD17FF +F90270B5CA84DE742E5593596E1ADA971066DE7A9A6AAF884C9312BA73313289 +28F80F803BE810B0C62278C925B41E22441F3018DBEFB30E9AF1C11712CCCB23 +E392DF6721C557E3523478F913EE3CB5CD1A0F6FD60E32D5F00E281B87E1846B +C629E4896288B86097A2F02DEA398F16E09681886C1453CB71FB4EED50EA998E +36F164980A2663428298DEEC9851F7174394DB1D21EFE96A3960A7BEC512162C +72D1E85E823B0FE1600C36971B94A505A085E3FF9BE58FB6205ACB7353C03FE3 +71F64580C76AE11F25425D9C0682F42E9316F5BFCEC0F5D8D9D830FB41AEDA9B +C02D1A77C1CE5FC6442311150BC3E4ADBFD779DC186592D4A548634F07A16C26 +B79B9D641EF2AA8FE056AF840F16FD232AE1A530B8D23B99D0984D7E98C90B55 +CF4D97F40CC83455CF898CD9A6F8051C30B151219B60F9468790F0A7F4CD053E +542E1EFF158D94F4ADBF05DAAE0581F56E0F5C8952470EA0D1245680A5AE661F +D2C83B8D7339D55401690648D47AE9828D233DB32F6C9D9493255E9BAB57C9D5 +3D08E5975F1A844CDCAAC830DD6D2B99C6BE2D2690726A913FFC41DB353B905B +5B6AB3ED132B53F19F52A6F82ABA5077E0E5E7CFB1087A01B311E943CAC3F44D +72F28E989AD53808A158A37E73B8E5AB83A920AB36C07BC8EA85A9C78B12E68F +359661C847BCAB2A6D223CCC012528D868DFCA908C09C0FC39785CCC20D87781 +F165109222779410AF291A3655E2E8199314278E52CF03F93F02502D878583CB +F75E27B85DFC0B00A2D475201786A32059E04B7F0FAD834A622932600BBB4747 +8A62B566D161E96ABD0195F7164CD84632372541A039E98F75B5B3947281F5B1 +FDD2A16FC8A06A9D16A3886216E1B7DA3EB4E07D25BA5841A21E926072050BF0 +FBD35652E7F3E33B911280C1D2BB6F62CDB5F5CC92540E34949B0BE3E8591084 +6946C8345A0A04BB51574D376C0BC65C7A10F2B1109DB99E62B75B591830BED5 +295C0204A5199E70974A10E61F5DFD751092EC081D9986A1D39D9035237AA552 +CFF4CEAC9CCCC5E5BD17E52E1E80CD0EEFF7F54A9F428D2D6EF035C8434FB215 +1F64D22D77A744D02291B06BFAA9EF6602E0E0DCDE7CC0F45A778D9793FC5281 +8D4269E2F9B61EDC1A3B8D8A75E65D4DA5B3EAE95153EF55504373C24C43D768 +A6D1E210D22FAA4D08F99474BDE3C4E0CBEFA6AB7F6E0153AFE7B2D3A6FC2B4A +9C4955C15873D2460C94519A5605040F866AB6DCE24200ACCC6A7F685BB96737 +5F82C2B20D6D33E8C482241B82BF228568C542758207B3F26BED5AFE57A0BBC6 +589A676A958E8B444EB839F1508FD1B8D995969BFA5D4DDF345D536F24DA0052 +6C626FD8800C04C8E41A523B9DC0C4EE10D456995C2304C36CD4E867DFE91510 +36D534CF0C8E60CA8DC1815C6256484010BED831F0CB0CDD8FA8303A504B7BE7 +75C5DCA66AB89167236F6983219DE903DE58DB7EE2F04A501E573AACBA610D77 +F4445E54AD79B901DA24C399DDCCB7AC66249E53DB1C3E8AB1B7CD20F0183412 +D10E911CB758B93D6BABECCB29621EC1F1487183603C68AF7130E06413CDF3D8 +9E7EE2263B5D753ECB3795E8E6ACE1BD5EAD4E646F1D76A482BE76D09DE51427 +EB3CAF3876095E404BBDAC2095D8BEABE73C3E97725C34EE9D4449A1F998C318 +A85F8D78F772E4F67B2F84368E1E77BD9B9610BAC6FAD54E047FB71F824568A5 +7AFD5293F486E26BCDB1D39972A30C87D4385088F7D5982D9845F8520CA165F7 +E78E259C139520722D213C9BC811979E84AC1C2054C46D560135F19B87D7539B +E851A4F76AEC7773F782CCDB2B6DABDEB5711E4CD431A86F5CEFEA6A4C60CC03 +1A1034EE91202F9941FB29D9486042B3BF9A70F9FE0B6D85C50D9B96BE3EAE92 +03331644C25882D3CD9E082D3A2A52798F51DD903CC927AA44C766B782D5A9B1 +54EC47ACEC605C2365E206980EB767E1ACE381154509BADCDA7C1EB736DD01CA +DCB8D7F7F235A8C7D2E34A5C989C2098AC19067AB250D7C16ABBBD2FC8E4D79F +F07B9CD3667D19FBFF96BB389F3F753645BA0DEC0A123621D506BC31E9095722 +10EDEE90C92670CDA95C17E4D7CAB6337C8FC0F20152DAB6D3BDEB16D336F478 +FE9A56C823B84FB62AB0AE6C4DADF7A0E7371AB52354A1DF0E9119746808255A +95013629C536E1DAB1D4288171244D5F5135003EA03D23E222E805EC2E00271F +9894A9E82B1F9EB36061D92836F31DE252E30954AEE7CAF8DBDD66114FA2B2F9 +9CAC74B353B7656E05835172735979E7DB48681B641A7485F18E460398028B02 +AC62210C0F36A7FECC771106BCED57DF6334EE566E0FE2BAA03E6557AC99D81A +CA025C8D1D2719861FB05F3901C313AE4189A403BDC9A7D648CAC3561612E0F7 +3F668F58CCCEA9A1C6F4229D575B397FF16FE843C9875D7007408CEE84F6EB63 +5DB941E9AB63B18DA328A44D401AE71A13CA2164C4A5BA7BF78B0EF2AC20EA97 +780F5BE7AEDBB15A4D135BE7B322254E32EAEE7DE78EDC69872E6AA4D15BABF9 +EA2D5723EE875ED677D294CE2A476731E010D3C204CA8063D56F1EA7FAFDA2A6 +A906C3F80DB19183D048D140AE163BD785E3DD7545432F25FC63D2368E506EE5 +6326065BA138CEFD02AF2055D38E5918CAA4BF97C94418EC6F3E14F70140CFEB +432923B2EE162EA0C3DE430E908DF4545B058ADE35FAFD0C82AD8018ABA534A6 +946ADAB80E5D410F034EB0E22938953E2A1855387CE4FE9A5AA9CE5A74864B19 +E0E9100B09A76442AA75BB5CB4F622AA74319EDB66E30F16CD3FD203362935AA +180EE9918F4CAFB782E0741EE6196B640E3F0F2AD00B9E9EE198C85AFDA53319 +180EEA95DE8A78F9781B9787529A75E890E9014A2AAF772520CDEBD3DB92A429 +E125581B1CFE03FB7570FEB4F821AE0889D05B9E011643EF88E888801FF81457 +ABFE4B89A160C84C69B129A8434EA9F396DE4011A4E89DF1D27967646FAD2339 +78A9F37E1F730EE96EE3A1D98851C45C5F16122639B326DA74B63F637084678B +30DAD882C0F0D25AB93A7A4DE413A41381A35E2927D4444257AEF9ADB5260A35 +8E74E6A8CC720DED20CA0C1539FB47F96156450C57E7C0FE5DEAF92F47F2E0F5 +BA9FCDBA25BF9B8326004755A4F4008EE63FD7789666788AB1F3613AE5ADEC78 +0A5ABC85E7DEB5508BFFBA9279C50EF9D5E9907E38EB0225C7562B8D857548A3 +EBCFE3A8F0EF5C3DB8955FB995BA5A482F9FCE4987FABD8D375AC72E4FF7C774 +F48C17F9B55BF5AF12906AA0FAD20934C7F080C49BCBB3F321A222ADEF47D283 +859755588716B89EAD7AB3AD5CF9E0DCB524EEA4A6353BDCF51A5AA45F7F830C +606181EA7158FE373CADAEA1EE6B0528D95DA03C7A03A1BB2CCE4136198972BD +445CE59483ACD728B42C40DB7A072F6C82C7F4FF01F8C9FC525E4A2DCC965FEE +20880CC3A8543F15082C382C30F4FE654A6092B10DFD020B790B2D74BAC86D04 +D16E66EED137407055A86070985E41312C5DE0E899EEFDC13C070CFAA40AA4FD +3CF1B702A713E877B3AB844E8F639ACFBCF275003F6A3A1B5AF4FBBB0AB04AA0 +52CF9E7B50CAAF2A7D76AB50236694CE617A75AAA31C0DB404298234666CF92C +9D80B402E7711C7F5489BA6E08CDF0E47866D8EE5F74755BF55B10150D59CA85 +3395C4AD476C07C9E3F2F09698FEA720AA3C1B63611CCB1B56193594A24D5F41 +E6ACEF5989585051EA8650A20D727C179C17C40C6CDC9A7B796596EBA4BDF916 +7A3110FF3D5400ECEB533BFA9D16A931FCFDFC36C1C62F7C09A0AB3E08489F4F +D6ED312B44B5A8FBCD38F04C89E3BD0BD14C2746C499B08DB1C2922CD7AA770F +0506823B6007604A490950D6790D024FA38A62762CD693EA10A147CE22107376 +AAED22AE7F02FE1B4810A96A3840741F12AF3E57FC5849A4DE53E296A2B78E7F +58085E498B304CC62F513ACDF0EA9EA29E8A39E67AF057CE3735E8612F98D9EE +77EFA7B090BC8169534E3FFE43F392292D231BD04591AD35BBCF6AC5B29E805F +79994B73DBE38ED215A3DBAA3E4FE249E59CBF889E3129C99590536BB69EAFDE +94946A9E58AB3488F0E6B820E64D50D65C4D399AC35894DCFBD1358802F5C0F1 +0F628AD4048701ADE6522EEE704105230336F14FB81A3F2D84ADE5EEC2439A87 +BA5A647767EB8A7273CBAE6DB0E5DB87C00AD1C8CDF539F6D00DD61F102DA4BE +EA6637A9681163EAD32D8913200EA059833DC67AD40A0B69427A588F0DC0A93E +E86697619084EB4B3B3952EDC511879FC526C4A702B7E6453B16727E51610E5F +BAB227F6C24874BDEFD5428D9254D4A87526A3324AD6F63557F7296B377CE53A +A6E27FCFCF9F6170289187C5F9701B35D822E764C1E25296C5747A216384DD55 +B641F02F3756BAFDAA08B7D2BB293D9028D8392551F5BE3C9906926FC2F5BE7A +3124813C8AF7BEE14C184AEA21515452C07B0D3D4EA3AD6AB8F9E5B7093112D7 +ED9E958AF921B6EAD2DCE5CC74D651996F81F5A5EC55D438C7E4DD3248862F57 +3DC28CAE798B543C6B8FEF03B55B158C96340D27A5A57B39A53883D174ED7A83 +0A2CBF5DF06999630A74A63B59888ACC88E96A13BC788F02C5433A0044D86DBC +7F8F5D5FC2CD8C6AE4E0867DBE1140B2E2C90F4CEFB00692765854327A9A73CC +9B52513076AD8B265E94CB4B8FC0033CEEF644EDD772CAF83DF7F0949BBDBD2C +F681D17D257787B3B93C4FC5B5ECA7DC18466FB5DD0F2A3D360A9B35F39D57D0 +105A0A5FA461AA14DDF1A95CACDBB531755D85867336F5491A1B147DC530EA8C +1DF6660FE3558EC163C8B0BB9E4DE424AF228819DE1EB8168C3187C6590372C9 +2FDAB4A0E5A08F1121A7F2642946DDB6D1E278B44F9337D31DAB725A2B6250AA +4CDD4FD6D91CC78EC693AFD3FD30F697446B3B45DB48467CCB4903C25B0BA209 +24EA4BCB450A1FF5153ED0FF51C4C2767821A63281070E8458501627BDEE7B62 +166A66F840493795981162D9C4F19787C4EFF2058CD685DF1DB94102FB88F631 +87B546184C81D6953BA2D749203FAC6520DFBC1898DD01D18F7A3ACA2FEAEE7C +F013E36C83CE5B56A79FB90E3F3BED6CCBE8433C8A9699DC7CEDB60BC1534271 +4CDFE08C178BDF612E4EB8FAD203B08EBF8D43F0762F09E1773715E75138E932 +B291DBBEBDBF9269833A2605A3DD5C36804077C7A408A1055EFA2A1776E1F9DC +914C5965795508E5A65D185596A37BF91CF5D72FF27BB20FC9013F7EA391C892 +8BC7C738413CA8D3FBEC8E1DFEAE2DD22E768B5D503A722A430DD6B88E69B2A9 +1AC29D68B111019886484CCDC696C6A87F1F67462D3232C84F431588D38EFBAE +D8C9D1418D81561F75632154173FA6ACB8A8CD8B7DB19B50A54A265C0CA7B0BC +DFA77DB810691538ECD0D9615528F7DDD83CD80F97534C7B79ACB57E7DD37038 +B0FDED1E2A80716D2687C4ED42669C280CC14A116FFD9218C0FA289D24A03E51 +2DF267ABC9F9AB70CEA856A0A5EC28017174BF03E32ED851734DA4E20C282201 +3090E1A218C3BF3B1AA3B28732A4D8F552E9A9163BCC6EA10F708972A8BBA763 +9D489A1CC41FE78302CFA605583450FC7215E141AE43AAFFEB28C19411D5F5FF +2F43DE7454CE4F6AF1A4CD704E8EAFC757AB202753DDF31D8676730D737F4051 +54A920003A0F336567F245356C6EDF40810B532AB5B475E116045C7798EFD152 +D76F0B5AAFD5A581AEFDE044360CA79D5F6776D75BCDBCDA149C2CABE1CCD237 +D1DD3C5166D7C3782540C9EFD1EB34B735C943A5CC7F7B804F92110A5AA95E7F +8AFFD2884BB7522392AE92A89913DCEA0F28B7B89A244C992A15D0B8881E6F37 +D5B1ABB54B970B61DE93578A12D81E4CC21861BCB1D287CAC00502477850CC0D +0DDC29D2DE7B362703D7CB938DEB1A64935B5C07B25F589E3C2369E1CC12CE57 +5BE15FADB9E65068B94B16242D3F0181DC92BF0B04C81716F4E197F04C17C568 +416ED85007EF4CAB706BFC780F584633922547178C2D4AE60A8D2B7BC2628674 +15D8AFEF916B6A2EAFB651697BB665A9D53DD0D0B569F8270C1E35C24DD5D2A6 +90257BE909FD3F2FC2BA7EDDE451764CB87897823AFDB0D2109AEDCC5087362C +783D3276D3388841FFEFE969601A775CFC5AB41137D5E2B86F30C5A2DE485434 +F372BFA764BA67A1B7F54BBD37FFA74A7A927C25CB63032C194F1CEF1D861829 +2EBA90769496984256A7BD0F2A427B76964882486906BACCE372616088E59E34 +603A6862A0AA2CF780DADBD2FEDD4C74FEEC3DD5E9DE299EA4FE3E60A2EFDF13 +EEA265F9988A2DCEF04FC29753F88E30AB8AC6F11935D4863F57BC12D38EFDA5 +CB566A8FCBB2211B58B4E99545EE6E1BD1478B3D4191799E3234132BCCF021C1 +D4FCD08752F2BF8F4A2A05E5ABD47F163D95CF160CDCF82429A6BDB4F72D497A +8C3C4847EB6F91BDB98786FEC2150C0707D9F1D7E4FF61685EF0BEDA88765072 +E29ADDCE776BDAB6808573E82ED790444457D1584004DA42192932A06ECC3F52 +42EBC78FAD914F5A85E892FEF5EFD24D011C5F0A177D61688A7877B5EEA3F9BC +97DFE25CC815A67858FB7A11D40EC1538B1879051120FA3A55C089BB9090360A +5D4BA4A68C8F94D99142E37D619723534A00DC29AF3F1031A6B6F9B2B3CFE40F +9E538DCFFA89CDED0FE65BAACCD42EAF4AC81E0E3544C118A4223D87C9D82B4C +E7F3D5DF5D04423A3F809B3806481D689AF165EC25FA0BBE9F052DCD8FEC161A +1491AF032649472B5ED62E74CAE799A744EBAFA9EAFD33B09BFEDAB70ECC45E1 +461F22F533596013B865CE7C6B0DD363AD150085615C36F4012B0C2367898DEC +6367112417D2C477D1674C091F1B87575F0107DE1E6919A0B3E23089D6371942 +93E2454C74599C144AFC5ED60AF6B27671821F08063FD47B6BB88D37B2D7074F +D0CCA9AE060E99856D7612BCAAF9AA1F38879B07D1D7F568D872194A862C211A +B959CA73B5042E1F024FF6C46D1CCB93179B8EF60B7C003FEF273F4A8BB18F3C +F51F479543497B252548A219EF8C3643383362D6CB8D990415579589DB86E011 +457535ED6E63B9D9ACC38959D6C68069DFB9D3F72A9B0E0707EC0D6B89A5CAD9 +A8D74A1A1FB61788514579DD347B64681BC247B4E2391B92198BB9B7A16C8D5C +C29B1F2EE9C5E2484D915EB6862034DEF5D7757588CD8F44EFF325293A8E2CAB +3D75CDF690359CD1BB95A8DBFCCCB815A5B1DB3B8C7EFC795D1F5B07A08C6E42 +01C46FC11BCCE630AF5055380EAEF2BBE7B124FABD4702D0C620ABD776AEDE72 +E7EE27B34B23CF701C3E305B3D06087658BA8443DF6B6530EE3D2F548463EFB9 +3F86D99FEE1640753685D68ACAE49ABC661CD9408D49588161B2B8F5C9760B62 +90EF02FCCE05EB43BDEE228B11A0F2A0E25AF8DEAA21ED34907094D57602F530 +93B2FBF0BFEEE3AEB27E97D19AB6751A7D7091B58912EB954EEC6FC62CA1FEAB +3F878C9214BD5085D49ECD04D8A811047F9B1E3D9E23510BF03F4D2FCC62AD51 +C36BB125B68D83A57CCD1B5C06876793C373FF0F201A83F3435CEB3A67C44048 +65D41E0EDB005F84318BE1947C8C66D79F36DECA043975383524A20A3A71D703 +613F52BBB49FE292871F5D87F18D24B4AB1D4492EC457856915A1DB3F13A6E6A +445A3CF286DDBFD282FFAA768C2B019C8C329B2E61EC3DCC8D16A5DC2D781C7E +0FF005826FA22BECE6978B61C4BE296D35546EC1D754A9A916C236BA6ABA545C +A5ACB0C001365EEB32CA78B773C81EE63299CE728C349F28589D5DD4E9C3A81B +2EE0DA75AA8ED5C6B23FC630C5C3907BBBCD01C83D5F2D07E936AC4B09333C78 +6004D36BB2943B4A5B644636C65753899448E04E967A7F48B186EAE079041782 +C75552B617052ED972D7B6FC5520266582D1F487EB4EF1A3FBD1E0848C80BC20 +066B7443434F1E2CBBDEBA68BBFBC8A38279178D4227821E8DFC21D0E2EBE901 +F9B5A8040AD1132B312A6B0EE9D79B2922C972A24BDA1349A3564C3CC5F02E91 +E3DB08FB2DA6DE7E255907B259FCF7E164154AB4D72CEC17F2E75085B0D1868A +8A58A959BA88E506D8BFC0A184EC7888EEF77C5E2B5BCD22ACC4E6B00B139783 +E39069AFA2A37B2B4967AE46B9AD37659A3AE9A3DB12FEF79CB6AF18AA1D7A5C +B2DFE741C367C6C4CA243309056EB3B1E108D9FB6EC8AD273DCD90F47FA5E2B1 +AA7C4F9FDC46E6BDDBC9F1322F019F105BE7DBED29488F3CA28F9190095A552C +CCF84B07899129672812CB1569716951E8F5725BED497AF4E30359682C293BD7 +C6A56260826EED8D01A243CEB4E90F199AC0E13B169DD71031A34DCD0416F6E2 +5F64628BE29EFEA5F2D1BB19E16801A3E1141031B26A8FCBE9A743200179E8D7 +1119B503EB36E2948DF7FA999B9B727341FE50434ACE2C3C652CEBC5F6BFF03E +2A33576E534068DADDD223AF11E43B8C4BB5D1200B4254CCE5643CBD73398234 +0C23EFF923ACA9153E65E63E37274D9BEBC952914026E0D661C41620027B5B3B +016EEC9C0442F1C3C59F8F38BEB118FEB9FCB2815BEA7763B5917A2C6F46949A +3D1D30605B4AE5D3298F4E96C2094D7B2AD397E4931CE82CC820928B215C70AE +5A48E61E9B457E869D2D99E34023553B90836C6A836791C8B8E817C57BAE9348 +CBC2EC7A2438FAF387BAC96986380BD874C29EE03DA2C9783C84CDE58F15773C +15568C23154F885838BF4E8F7F9A0BE9E9480D0CE94E769EDA4AB3BDE1DD30CE +B2A8B8ED3843CE96A201A423E39E3A45986537A3ADA499C61FC9F5D538A291CC +F6CF384AF64B8E1348673CC6B317B02AB47A88C4BAA6F8FFA0FA674F600C0120 +98314DEA39A7B5099F513283D572127EEA6439F9ADACCC981CA002E9E9052846 +B5B6CDF69389187DF7BC8942408C71B87C1BDB0E500E9B2E4212FC21340045F3 +E4C421BB9BE10E4C5802524500F4031AA36935F92D8DA29782A13D8D80AC6A57 +D2ECF2235FBCF6E0488C4523B69448D4D6D2040F7204FA910F09973EE65502E6 +4912276255CCC93F30471E517B2636754BFEB588A110BB0992A8AC423E83B22B +5591FF12D13011F30C5D8C6A3E53F72195C815AE0E613551D4A5BF7ADD5EE851 +78459EFE389D7213812607C981F3F336D3872DC617E687E4C8639F5F58DF1B0D +9F8F89EA14EB56A0F6BB0B40F9E98EF7F1774F756E8A1249BDF018B7C106B6E5 +E3DA46DC768B2BC9E6E0BFD0948F28FF5186B81A6D9ACA6F87979BE5B243819B +C341C6B5F9FBD2709D5DD4514F55B16EF6C20A6DB1EEE8D06AC53D6A593596E3 +5CFFF0EED18A48A8A94217F8F656E7FF0815C7A99DEAE190A46F6705FE75EA36 +F4F40100E125A77EE96425FB83E4B470E37AB52CB7E12D57B52C5C856BC1B634 +5A9FD75F12854EDEC5B49A4EB5A4506A073971BA96D86E8EFBE4AA55A80F08E4 +F9FE6F7EAD3BFE9D6AD23CE23A42508B3D1F0C5C706C1EEBEECDE969D33880D1 +DC553F44709645866F3BD1BCB8E768B0921A5EF72DCAACC194A56F970B363E20 +6F427BB9F981224745489CFB750C01A3F0B7FA898E23A3FCEC7ACBF263A4CD6B +9BB07614881C937DC99A90AF67A9D7F98D90CB6BC7E68A35A198124F3C4ABBA1 +B2166DAB62F411469AD070C81C11D79FD6B7698E45759695CBA05E7B7880DDB9 +E4E2F989CBCEED6C0F3F164ADCC88967C29D59FADA20AF5FC2FEE18FD0201DE8 +F49D96FE359741C7FA44FDF60BB354DA8116FD5B1910D5A26DA3693AF9EDAA68 +21955C318B5BC1C0C020ECB1AFB1090F4584B6BB616BCE5FEF3C0FEEECC545D1 +DE92766EC499E8BF2CE72DE9FE7611CAF4929E7B60DBF82175757080DCD053E3 +E6E8AEE50B540A0C27BB02D4ECBD3EE8B7ADC3312FA31F6C2586DD03505FE6DA +B462E28B67938BE4B6748B6C8C8A773D454C7D537A695EA8AF0D84D846CF3B27 +D43D15B2263E8ECB5C3BDC91DC45A4E1A3E74DF11CFBB148472B9B320CAE6035 +57DD58C6C05877AC98507619AF78FF76F8C31F04487D82D11CB645C8927D3421 +0C9F889882086C4082B91D3737DC1222FCB6304CC8582628F84D7F88411DAF98 +D2B31E67725F103EFA380555C09A9C01778A05EAD5549DC599CC377D38AE5300 +5AC88D41BDD304409891F0162D3903075A4277813378ED1530310EE75A28EEE5 +489BBED315CEE9928C012B9210E7DD4598996CD7A4A896DAE05724EC43FACD97 +1511EE90285EDA062C703A602B14872122778BE37609FAA932EF0CE234BB4941 +562C19702DBB1016FC64D60CE11C1BF1A5C4CA404CEC577A350C27F87CDBBCB9 +29720680F80556201296302B64B82782C34DABC6222A36CBDEAC67306AC65870 +B4CF79FBC80ECB5F99121058F1609E1EF924181D1A819602B5398845A70A5D6C +424E3A5C6BDA08FD2937871ED1D82C616F78D56C9307A62D654E2F41EA6CC1D9 +595963C8F308A250B855DBDDAD4A608B9A1579756B70E643EE3850010C1D8B7D +35252716C4806A79BE13FE4CAD5269EA3B2134EF402478A5A0ED0A0D27AF1EED +36F9F96A058957C383A19015531250B07A63ADF11769031F86AC1925A0FEE3C9 +ABA906808A9D8CFB58C3D09593ACC2B735B956E21B5C1139AB40CBC12F9C3C9F +EAF0A42CA26A61424B047531F5C32E0A331960A08BBA8107608BAFC9DB2C76CC +974E9EDA3840ED36B798902674A27352645858730DFEB91DCD0C2EA4514D5D37 +B4E4BBAE31D3F6282800B92D9B76AD55121D66F35BF1650B09F058D728ADF379 +1D9F342FABFF3EC15D45B8580599C10D0F5E82A490BFF210B8439249A483BF18 +64B6CE120278AFF67DAC16723E1A9056163215EA597947555C22C196D92A6C4D +2BAEBD772B7CD296EACCE2555DB375D7435A0AFE58D9C6BC8744DA241A1E5836 +75C54C03CC4065A8FA402518FCE53BFFB202403352B6CFD49B83D50B1F1AECCE +2D03FDE4CA913E7CED2CA42BE3F96CBCAEE028E4F619C788CB5AC5436EC8D21E +26A3098D6F093002BFD7E71A8F3A024AC612A38759DE7F0CE54767C2122FC1E2 +5EFF6B6A88CDE57566FC4CB6883FC070A0043E847A74307798346E0CDFEE858C +300E92C2AD0A625E2A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSL10 +%!PS-AdobeFont-1.0: CMSL10 003.002 +%%Title: CMSL10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSL10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup +/UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSL10 def +/FontBBox {-62 -250 1123 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSL10.) readonly def +/FullName (CMSL10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 45 /hyphen put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 87 /W put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 +5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 +8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 +EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C +02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D +46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A +4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D +DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384 +7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0 +C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814 +25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5 +7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581 +299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8 +80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB +5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584 +8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894 +5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F +F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B +966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E +A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5 +9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4 +A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD +94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A +DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669 +E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929 +5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23 +8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5 +155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E +4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038 +44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D +8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0 +04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC +A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F +F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07 +111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344 +8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C +567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728 +C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214 +C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094 +51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01 +66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58 +9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6 +2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4 +4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7 +5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256 +0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9 +233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D +BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF +62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086 +B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88 +DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0 +C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA +CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC +38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D +FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24 +303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2 +8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1 +8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2 +C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53 +9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363 +4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29 +03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212 +93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8 +91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0 +FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27 +06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179 +95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954 +9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2 +7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972 +6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31 +5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262 +3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91 +CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1 +797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0 +DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112 +CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19 +8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51 +04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757 +78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE +730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F +021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79 +CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57 +90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD +97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0 +F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9 +4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394 +40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7 +3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B +362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7 +DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136 +7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233 +04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8 +DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B +C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049 +B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F +9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229 +3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE +D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2 +B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571 +74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A +44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5 +A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8 +3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1 +BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64 +01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4 +6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD +DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A +CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C +683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D +87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF +550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6 +2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB +17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB +3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E +F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F +B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B +1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514 +61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7 +124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2 +ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746 +0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246 +D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933 +F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2 +BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003 +75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A +8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3 +B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E +7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD +F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F +F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7 +322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E +523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017 +6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77 +66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633 +B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182 +5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1 +093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838 +B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72 +6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394 +EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF +A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966 +8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE +144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0 +7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F +172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9 +254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6 +5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71 +011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460 +B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC +0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E +3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB +E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E +993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E +0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9 +18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0 +ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F +CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228 +1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3 +A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A +6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B +BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20 +DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323 +1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761 +93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082 +E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62 +4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB +F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526 +4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1 +361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36 +95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C +AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0 +50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81 +88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932 +AB7916D44EC2210CB941B1455867E510E9D8A0B83CB645BCABDCDBFCD51A4E12 +60CFFEF0CCA548F654037D01CD631FC4E1F97B4F65DA9AE79D99F13A726E93DC +BBB027B7D175FD17A704C4668F6F8428262959DACA9F8C687C923CFA053804C9 +9B2005FA7E0F07D81E52A9A37AD5CEBA8EA63929093ED0DAB9F7C99C82A50E6C +6440387049A0C359218F5268C9A28F581783BB9D29E08772D7252FAFA6739687 +22570150178893C418531769CB3D96F799BF1C6415820F96B6EFAB5344E82796 +38A0DF66609F5EA332C1065274EC93027D264B84B52AA8AD82E13E2A41AED340 +B240D1888CB89FBB748FD10B214773D466A44AA2AF44371CA8B9A4450DA76EDC +0167B4015A270B9983B89EFFA023A3DFFDE181B90C51D70557B0844362B0652A +6345C6EC83DFEFE099455232455943718297254186940D6305C96EE2B9E3E7C9 +A622D25E0471AC31A8ED3AF8897BD19E322CFC3BD3860D8A0634081D9AF53A9D +84F4ED39D8127CBCAF9AD48E9CBD10A67A2CD0CF93D61A593C0627AAE80E297F +610CF0B2FDB6EB3BED1D866BC1E1DA14C1A2583976BB788E9B26B26D6071AF28 +04DE56A166D01ABB14FE7A5C409A3F6AE1F17F322522621F97113DA3C0CD1EA5 +11AD5168DE7B3BBF39F61A45B553D16A31A1FF6000C7BF7A3DDF5B852BF6FEB1 +2AAA616AD71EE44D7A3EADF8CDF02666A78E346CE8507646ACAFBCB42D804F89 +07085FB776C81D773B33AD206D49FA01351D19E9B93423686FD7C8D1F4085009 +A3D67A249C7B38C40D4A83D74E819A62B938D89AE9070009275EE70CCC716937 +0BFC0EE647EC231309588DFF33EE995006FEF93469A8C4CEC33E5C77D53F8BA7 +5C444825DC75D418831EE39A0FE3DA51CD3C5CDD8D28EA853EB7F4925E040BF5 +F38262DD8FABAA1B6A5EAB2E50AA4FDBDAA7318795B5E3B8520B9CE2C02D3053 +74F30A8680D3D25B1A8D9287B67430BE892BCB142A6391FD774289B426F82590 +B01E16018820D33ECEAA498ECFE0023DD959ECDD891113323CA14761136D43F2 +A32A3F8255D0A00E0FAE6FD2BC390D9484AD38193CD5EF2A0B6526B925D91FBB +966E69F1F7310EBD4306E2D9D16F308363FC231C626445F3029990699E6B0CF5 +229ECE0EDF004E8602D582EF7810BA119B058DD90C01C22744B5EF5CB156A1DA +7A9FA7086CD89B2E8C5E90B258A3D64AF7A9E698ADF3D0EF1C2CE3D30ED5A4F8 +93572BCD11B506228DDB2C85B79631258B5376E30EC113D2D97C12854A892352 +4016AA0558446EB491FEA150C7707E53A959AEEC3F606E8FE8BD6803881E7091 +625E3DB91BD919071CB21186DBCBE103403C49F634AD063EFEF99A59DF1F589D +5CDDE87414F6D12429B32C1EEF09665D6606F33E015BD62409295538A487A93E +796AD8C64182629AD78DF437E04C0E09CA8397FFC74FA927664EACF7576939CF +CF56962843FBEAAB2C5AFCAC3DD6C05FC7402C2148280AFD5025C33A1D117359 +68BD0E06472B0D335BCCD589365BA20568DFD46180A38CA13770A8570C3C90E3 +B1D86706D81754B00B4F1CBA76D8341C4A552851A79877C8F14E8996592E8434 +AAAD811BCBD37DD9BA69E6D76A19192AD53A8F60E50166DBC41DA9B77783DA9E +5358A61F08D5FB1731EC73386AFF81B09631D57368A2984019FD887CB16A37D2 +FF085B743E2A3EEF2CF70CC006799F1AB3DE1569E2377D0F00DAB31F73CF6EA8 +339CC5F37B42E0DA5A9FADBDE4348EBD8E8E41F4588BE9CC71BA9B8CEA1FEB1A +296BBFB3E93052480FC0460EBE407B68C5DDCF3471D5D70D58562132E228742D +E1298F26E89FE76925B21024384A3BCF0805BA535818525AA30E5267076EED17 +9479E85C7BE3A67B23390E0D413B04E548BB08E7AEB468FA87707225248AB35C +043355788C90839CEC662D883BE9A5BCA92F1C802734084553B54BA72CB7A8AD +CC7A1B7439A68E84F1B1F1271B32CD1B719BA52E0BA5DB53C6372CBAF47C6622 +65D10D789FF729CE2F422D464CA83424CCE7E06591659809F91F7087EE721F64 +6FF9AA5E47FCA748EEC49D202F538023F7295E03637BD089641A14BF85F926B3 +7DDBE5B216F4A85262EAA63E204AABA92552EB93169A07C9BF3BFF389941D751 +EF82F9118E9D53EAEA71B5DA45AEAC7FC1F855AF5CAC11EDB1041FAB35423A37 +B1974AC24E5E83F32931CE05399EE7829BB1785A0F117252DD7DB5EE45159BE8 +F96026FC3A9D6E67FBE906C9FBE5D0B1CE09CD30889F575471AACBFC343A60E1 +253A70A4F7F9EE8A771474F8C3C8DD5C410165F00FD2E08FFB820C030088F452 +1AB1770F80FA609C8978C5CD1FF94A6C77CCC7315AD714B990BE419955B99747 +82D883C4DE1593875FE60460E2D370337DE830A3060EC38B2CBAB76FE40FD9B6 +00E693B9090259ABCD7D3ED4B9BA444C94D16573FB33708BCF12A0016A839568 +E223CA958242021032FC6B4AE83A900DC87CC6ECF2BC00F9F8EFAC6606208EAE +FC933B0689A554AA1BCD5F7FBC20299DFB1632B284C24D64AA90DEDDF272F7C3 +470CE467B5F959C24D45B8BF53E96E5E56B2703E863FF8A846D14C210696F2CF +FCBA34C2478F25493F39B067A4D16F8BC484F5BDA1B11038DCF25D149F49C59D +3DA99DC0A08EF232D98E9FBFE46FB5E457975E7771459E330DF4BB863E092AC6 +B368FADFC326DEF82C2E1F5014A54B5D8AB78EAD86CA2496D0D753A4914C4F3A +9251677B6B7A76B3F46D564CD855D423B7FD3756958DDAC02CBA90115E2586AB +2328ED830172111B3048FB5021CEF1A52424E31DFC904C67F3EE4D176E0AECE4 +2815188935C37E307BE490FDB7D86C9ECA73D165C659C2102D60935CEAB955C6 +D5F932B3D3F355E5AA2CE54EC1BCD0863949C0D976FAE7D862A3E8319173B55C +FD17CA38B17015634F22CB58DEEDEFF2DE3735ADA5C5BAE39B4B0805A6F77813 +51C64EA337386FBC74F2C86446A50E134E20F34E580CCF0C88F38F7D5BDFBE8D +884777BB0EAE668E1C385AF59359668BBA3584EF4B0DE732C2DC88E2D0C3E081 +358298442A33541E8494C3D8E9F0261A2B79382507FDC4503055E14ECB54972A +66FE4FF0B584E91464DE5AA6667E8D8B123CB182A652224050A235C1B0D8E5F1 +07097D98476731A1D9224E156665BA64DFD471B6C0B11519703F349C3846C2EA +F123F5EC585E2E357A9B016D82004436D460E4E3A0D81C6A4EBD3A600822A6B7 +FC2C8581DE02B61096F1E44DBDA5BD22529B31D715ADC9FEE721DEFE8D5A7305 +6FE51844A7A31FC453F8E957212D0262D8B5654C47123385D6309C9E91613C37 +693340BBE694449042CA913A6F7AF2B98270C7FE9B4ABE728AAB48D8D37D8F1E +BFC3AB2C613FB6DC9B12A69276FBB8D4218D800515BED9CC3F8ABB90F4907993 +D252C28A994B71A7A725F4EF5E189E4B8E3EB46A756469DFE6D20CEB897B331D +AF8EB7E9DB01A539EC89A3E2AAF71B4F62F9B46CF90329DAE6D0905DE7D66667 +8DC3D965DB4A54B4FC63A46CCFC487784A0B4F9045CDA8827BE808DDBF6FB4BE +CA0FCCF1A8A6B512892EF43ADF8F00CDB94D774447B0CA23AEB62641CD4D7CE8 +4DF24C4BE165D5D901EC9F8A0C91A21F1E15FB1C6994297CD468EFDF37FDED3D +CB18B1DF5F8B13F6731457E2E1E84C694FD59321C214A6FA00FD63736F43A0BB +46610DE20C7B63C2585538EACFD958D38CB48B848398722596F99FD902DE3669 +AFB419590B21C195FA98B123154544DA1E9C3E6D54679DD3434FA27E0209F7E1 +EA99684FCA8BCBB105DF37297E9EDC960DD623659F26B3C1B29DD90E89D22F60 +2FF619C26F0C7EE13B0924017DB0B7B09D6C83837C02E381A8CA197E5D590669 +BC616C29AF0E5534230A6AF724FAF6732C6BCBF26596459BB0B03E3B4D3D9F88 +3444C38978A9412CFE52ACB5DE75BE92349AB04BC08F99FFDABC98F7D20ABC47 +7FAE1E6E9909628F16DF65854E991B44BE8471ED5F84DD77CDC32A03D49BB82F +BC1E559026029D81F2E80B46062C743EA521C40E4F598655EAA50C749C92227C +26C7E481559F733518A44E467D06A92A8BE1AC43C57F3339E517F8D43F75D434 +BF40775F91ED694717B7B6A5D6A9DA2FF46DC29BCC9CF53232454BB3846DA528 +72A46D4B199ED2B80A20993BC303729EF1C06E341B321BC37383E7E201DE0BB3 +929CFF074B2AD7EAADF5DAB328D01F32DF7D3A886B90E665F5526E279DA4CDC3 +3985B1D582A1AC36C0F9708C27ADC43F678EE09101A04312072C5C4F9DDACB30 +ADA37AFF97CDC00220B71ED8D762EF3D06250D5FEA90EB29CAF1A9DAEBC23DF1 +F9680F8266D9BC42613706C8D328C2DC41CE73A6BAFB96FE7AA60A0D5D904C81 +8B2F64AA3D78C3AF18A7B99BFFC96211223B4EF5B70B1C19BE189DDC613378DA +082DE0BBB822FEB46EE05F8D83F201A8AE2B59861CA9F52C54780B3360160814 +BC369D35C07A4D4EF9FB534477376B336CF1A372E6C6E7D076D2C1F95B6507A1 +62CF058FD9D28A0D9A86E859DEC3BD2E2DA69010B1D6C3D6D0F35E25CE3458B5 +4A8DD7485A18858B6EC1ACDA8E5D3DC74CC8B37A7EA18ED9E1B3A333F7F41545 +8A9C8598E870F85DA7E4A772175DAA887A4BD065101ED1D704652299FA193387 +7A1E684357205136A83B6D76EB0C167363C9248221CB09199477D24D3788115D +B8446CC827C7385333000BBB82DAEDE63ACF9D328041961710D3FA09466CF2D7 +B1685E6B6FE892F9B75F49F1DC7F6AF4E8D5F2B0AF7986216225FCA4F7AD1D01 +880672F6AFAFE640713B5B83567264AF6620DFDB3B0BD45E8EB6C375D230FD28 +C5CF99DB705DDDB9A2B6884E2D62A9547DF6CA0D8E86E7FD1FD28CDDB4DFE321 +4921327FE2D0AEF48EE7E15E17B91D71B3485CAEF2871BF343761983B4DCB7F4 +156E6D8D5310ECACD6661DB1D962A7EA8FF44A2A12C37561E21E5C1C5AC88D32 +38159E3CCDE194F8BEF038B04F94CACFB29F8A93EC9A375667C8BDB4ACA5D195 +CECD055E06C67ED9C2C0374DB6C390EF4D65AAA194EE54BB26CD7869A5FBE3EA +09A6E1285F66BC0C0B5F1434E1F2BCFB6EEFA0A215C37CF8DEFC02727A637CB3 +46A83C6ED1B8AFB5FFA7DC2C4F1C3CD57D63BA2A986108E3EC91B54B48E99AB7 +3A58D8990D8EE81BAEA6CABB3F372A2AEA6E918F49266ACBE23A68D9A6863849 +4DBD6364F2A0AEC6FA454E5AD9D56BD097F7FF16D98C5C8FFDC5222A301B3C57 +6BDD7F281E6D575F46DCF293DDA0DFAF727226254E8CB2E39DB8EB1B443FAF3A +4F7AC38741969E050F59A9A193E0BE89544825A0C0692CFBD7044CD12CC14189 +79EE566E5FC74A76EC65E5285684F4575AF05F9FB2356CABC4BDF8A6067D169A +EA546A99288D64DDD928598FBD7ABC96B9B7C42D6912273D786385E7C60B30D3 +29756256728279E500FC73BADD4C21F0700C916E3EA0428BD052FD8A2487054E +049FD14E372F0ECD6E3ECF4805D02FD4E146DAEDE6849AC9299390414A0FDB10 +153A2AFE5E8FA44A1186A395EBBCEC9ACFE9719C6E7436785BCEA6380941CE0C +6A46296F0DCA6C3C13C3A9252BB87A45E9E4DAFCD3868CAC9D83BB0DD174DFC6 +27D5D1BBDD986CB0B5A9BF9CA5AD2C94BABB3AA21CAC876F10FBA5B464622B3D +B8AC3773E3C8B3C36BAF980DB29432A01FB5733C2887729D5FE0C412199AA6DD +A4D7623599680BA2196E9F439D6C293D6E16A2FF1205168F31277895A853FE6A +1FD47593AB67CA4F4D407A90E7F7D8A80C6D9BE25BA5ADA64F744A50FF665A43 +D9F7A8430EBF084928BC3B492E8F1EDD523C8CD0EBD4A065096A78DD3D8F5A21 +8E6A5E4DB1FB611B4CC47C87394409400C6D0615F571EE4A96564F3366E5D938 +236560F6A9957E8D087AD152B8F6E01C9DFC27ECE0BFCFFA409B94C9D523EC69 +3C328139DE7F828CEF88150A864F8F64CD7363A84601216DD34DDB4085FDE7A9 +8D90D3571DAD0C3BA52419FC79036754396903B86AD37AF2F5A877DBE1BAF1F5 +8EFE1507E8787F5C5AC5368DEA4DF9D8A8D0BDD5F0E9687D1D614BB70567BDC8 +8B1CEA009D324518C46B17D521F28E17AB8C2252E01A88DAC5187B153C1C25CD +C342ABB1E059247E276EDC61D51A2CAB2114BE28EB27407DF0E3048143062E54 +215841330CEB3212216055913E93FDB5889D0862798B2C9EC4C7AA867EBAFAC9 +8D9C5E5221C1D63654A4838F15D0640C6360EEE3F78BCAE95892191BC102EA2A +84BC256B2E51E3D5C6A2C9C4DCD5189189A292BC47FA28CDF05EC12740D45F2A +480FA39C3A164A201F0D353CCE51F8B765FC47BA5EA8FAE41832320D18A90A24 +4AD12E6C4E82DF6E172406961F414305F390148F61472D732364E581862532EC +748309596199EBDE301256766B26CCD77898C8A97A226BE0D1634DD4CD12295A +D6990DED2FB64B5CFC8B4073EFF20540D50E21A56B9E63F075FEFF20D50D96B4 +17275B729D73F68D4CE816B36FAB46C5551E4D3C001B55107EADC29DF51874D6 +E936DAFFC19B2DEB8788C7E7FCB9D2ABE5660FCB3708E81F19BF9C600F203BED +4DB8649D9B91450982A801D15B3841C7339D1D20EF138030CEEE013EFD570348 +0A6346682F82963745931F85C431792C64B1E6E0637B63AA85554717C96DE31D +B4D2515B18A00891063AAF9FD2B4BE8708009A334F7CFD689D81ABB348CA4BDD +F21882F2EF86048F018565C26728BBE7417E685776114470B32B18A71223DBAA +EC66F6A864F7944A4C459F0899EC7B5FD8C0FE9AD393C867D5B7C9E98C5FC32F +707027466005E23475A87BD88BB8B5520BD87516120A2FEB5F0C00DC0B424C88 +5D8204646F2ADF4C7081D2CD0D0B3453FE69C955BE1C40AC66624083CFEB434D +FA7D2214BC69F0310594029EB6B1D355C9FD13A8895F0BFE85B725E47809A824 +E74B7A7E31FC95E6655147D20B4A14E420A6DEFE9BD80CDD4B8924E2E7EB3EFB +3774B612975D6DC561D4DEF163AF1DD76EBCE76D339B583950C2981EBDD8D02C +48A5D5B2E8AE036020BE8B760049DD6418440ACBB03E798C0BAD524E82B6B422 +0DC30556016452AAB929801A343B719367419ABF1AD387925953A2CF4A1AEFFB +8EA00A873B2ECFD127C80E23BE2F36E10E77F86D3BFE8B076E355BE1B85292A7 +906BAC9371610C4AAC2D3A0239BC2BA384314ADC834AAD796C8A7557139D9BFF +A7B56DAB7D63FF9AC78AA9AB416A0AA3F96B0EE6C525BFDF5925F4859A3A737C +6E573FA019456ACEC1AFCAC3787F83DB80FC3DB6CF66F351D47E9042C33DA41C +A9876A5ED89F7E1C5C32045F44E6D9F99CC3AF6F3F6C537A9E6B5B33E18BEEA2 +7EFC03C85F3F9FB5BC05D57510ACF67E864A20F5C9D46BBCC179C00456EE9D56 +691F2F5A0D4F2499772A6D91517AA6EF54DF7BF4E3546C63CE47076149D5A70E +4A649D801BA0032F47668005F8460F6BB9488566D4AA5A7BAF13FB1810B219F9 +7E21BBB6619D78A42224D89A8C02721C3E802E0AF94C55461B5761200794508B +E379198FFB5A4EDF5AF7C0FCD6DC71FA1F88623664D0447694503676D6E59738 +9F79981C2AB97EEB8E493F471780B0A73031375C3827B6F50EA1F7EE885B9B90 +E9AB441283F4EF1C6C41DC8FE9DCE582BAB0CD65CB8AF0CA61DE4A7AFC3B7F75 +CA6097DFE38E07B318BE55372C64698D01486E55880DF0E177BA270AD2A5F813 +5701A4E5B87647E53EF14EDD19E4B7007683B569712FE119C27BCFC075979BC7 +8A5B0748E1960C5ABC8C5BE4B92607B33572F525562C8E039ABF49E965D2CFB8 +369DAD99981263229E068F5C3570760842486D82A78DFACC9BBDD36E4C92017F +52AF6FF3085D19FD3D69BEF26BF4FE486C4DA28B67D8F8A9EEFE6880CA09D2B0 +D6659F69E9CF9B8C048851DD2EBCCEF01D71002B2DF0B991D2E93763D7FBE496 +0CA746868E3EC8576735B7AD2980CFB4CF3D13A7D2F1A7D170816E7B5F36CE7A +26CCC8F7FDD1FAB9DF86966AB4559A2698EDDA603842D97622053AC85531F0A2 +16A97ED8B2E9E9FCE247C33A414BE13DF50A257AAEFD9A00764142AE6CF9D890 +BF73B590807FE1B7ABA71BA62CD68867A96739EEDC1EB0824C8AA59A13535931 +7B3BAD294588402474B9DD42BCA14C18F64C0FF78B85971BD4179B299D23D9D9 +954D71AF0B94986149B5EB8F18232D957FF1EAE068B90B560C72A13EA7B442C6 +828EFED6D96384E045B610B0A8BF005B0B99C11E2F99DBE20627C056E14B7C2B +0DF7DD753917691CAF013D7964DF6E4ED5E49241B65914397BFA07D68A5BC15E +E52187CC260540A2F41F4A6D4BD7CAB2C825D72B312B8794BDCB73DDA4C66E96 +CA52C51928647A5A59FF268BD487BBCC5A8A6F36AC8BEDC211B6B108606C8D36 +3A2D4EA6461CA1251E10A86A40D3C46C10DE603C3596FDD87D2510A8A29A9D0E +E27A52372345A829A84F1254847CB52378A710A8B3EAFA2FD94892D3A32C9F6D +BDC495F27573D7E5DA65146423736952A0A13E6E8030A184D2FF95CE2B68A33C +7F0D94FDE8DA4ACD5FB84C5E6B7D6AE891F4E76289F28F7D766B79B09200FC3F +A082AF28A6DDBF1DFBC29EE3D49BFA8116E5A8EA86D9B1A5E34558A83545B7F3 +0C512D2004357DE29C5221FE6163933C0A7C59995769A07BB5B817DB58B6DEED +415A3D643DEAA04A5F7C0B73801410134501C6EC7E55C737B81CFF59F91D1084 +BAC2276662BCB529973FFE12717D95C884E714678B60481B69F6059E16B83120 +7A6DB96912C2B6463E03732063AF2C6C703E95DA52B5D72265135A18D7186618 +F23610A06500E0468758B19D198870ADC4D26227C2FB99B97F231216FBAF7769 +83C421D4EDB4B880D2E53EACAC19FF259B7B61C0824FD51E281571FDE1F82A54 +93794D923DE8F5512070E6E8AFB5BFF99B8B73E22993305BB60538262B5467E0 +678BFB37BAB72658DDDB5037126E86D0F9935A9908164A06FD5055651E83A11E +E7058915122D9F2EAB20D69C6937EA70A58CBBF5F86F846785C92974B6C52D96 +BBE2CF060BA5BC78CB760B5BF518DC630031471CD2C0C136628DD815636E878C +EEF640E2DAAE6663EBF873CC521A6272349A7BE9F845E9A2CFF2007D5CD9C12E +B156BC49815D2261CCA72B9ADA22FB720223AE8C0253DDF43A4395566146B9B1 +687D5612E8485AD038BB26AFEE7433A77E69BA110183D4D7922C85DBE0DE76C2 +DB0438CC99A281AC6CDDDEC6080868AFD6C9916FF45F2FFE9EEC22EC13B7214F +A4A34342F0715E22540A26503251C4F079D53B507A7A8A4C26C765CB5D3E6487 +D3AF0A0867AA512CE112F77B379F54D91759225907A1454733EA33674337F06C +BBCF54429C15DED15DEB59AEFFFA82B4FAF1CD1E3C071A4DC9C8D634939A52EB +89ED3BA0697FF8EE3697A64F48115266635DB5F4286E828E308E1D7C6B5D5A01 +907EAE2ACCD3199FCB8AAD01471F7098D54D457215C2756D9617C9316A8E0CE4 +F32521B6F32B9EE2A8980614744A02638B157355B709444055DDD2AE8ABB0FE4 +885F5F55150D98BBFCE02164237C1D82E55F9061D44893E73C337B7C17327945 +B164F85481401656CCD0FBC280F0213E77FF6B433A49A9FA6B3DAD3C2E191131 +0C76576EAE08A677CB46CC44DC87368EFC29D4E9A8577535B619F594117D3BD4 +12DE2166B4CF59F122F16B4FB5092BB15D9501CBD734828C478638A01C7CA12F +2F3E9519766F1E31AEDB3F6D6D6820A85B72CEA12778014D207C2E5FDDDA6AF9 +B3604DF3634B123C7C7F2EEA0146FA7412FDA6AB9E62F4B0F2FE3FC94F89BD4A +290224FCC8C85CCB7AF6A86CC765ED026E7DC1FA8971DD25C67451B0CC62B07B +30549C6A7987C5A9D576E8A5DDF2CA26B9756E89B526E718B79406DEA65FB596 +0C71DC919771AA57E6913E56FF5EADD3C966F1D5FC26E56087F98AF7F37CBC22 +4FCC928AA4221F925CBB7E0A3A623DF3FB2ABB658361B88BBB1E94B78A948A9E +21198332A3FF310217C0DA145DC97314A6878126F88CA53101F0B3D4ACFE85C8 +E7BC1F33C6DAFB4D57A89FA33E8599A76CD796D653B13C2512BE4F561F81F502 +67C69AC40EC879790C00148CACAFDEAA424A809B9246486C45ECC4E09F6AE655 +2FDB077C4C5A2029949AFC6958FD029922164DC9AA8207790D0F138E0E736FD5 +5970BE8C4E4EFC951E912D614570A998DD034948DC5449C56A2B33E89B8B077F +97A1EA7542176C03553021FD98B8F0C96D2C135A43D8A0A6D33114DAC906D9F0 +4334AB431812105B969FE584623C1BC44B8D6D32C433EEBB7B9BE6BDD1873C25 +F06CCC01B9B43E4A6445E9E0936805A38BF1E01F23861FDA9B0087BF3E2C85E9 +0776A5306C6B97DB8CE6377108739EA84DF52CADF14C806DA7EB284028805B94 +8DB61CB5C591B5E3FEF87E74A0F3F1B963A1B84F717DE48F085F5AE9CB8D60F5 +ED2D3D09E720072A2A4C2A256DD98A9F69FC6095C964DCC618FAE945A714BB8A +24B0995F5FFED10FA0D8A6CBB2DF565EEDA1950907CD9AF9FD1B360BBC6E0963 +82B35E3073FD7FE70B874CB51F06D9698959F459FC748589C1856387CD60BE2E +A8F7E621858E50F0FC7965BB2CD3481C53A3E3AAC137B75F2EF13AD72E51C0B5 +F6101240EE677EE6D89E0A8A45111DB661AE6C2B3A07A1BDCE24C4F20EDCB4E2 +19DE64A2C1099AAEF4CC90568A13B83957C016D518859643557E54C43D03C968 +3B22C4834FF5204A1C94611B8B968A9D0BF33915C7A74A64BA80663F318C6349 +2A176111C6A2DBE4C5B25A6774AABD94C148F64BAA0D94A7520B23BA02337189 +F8BC91D75417AEE0935D699E4E113B7CA25E7BDD189B787D278B83041DB25479 +84098A94BB2159FD82EBC32596FDDD435D2B568F3030E31A98F005E8FEC084B4 +42FBC39627119CE8D8F7A84BF68353AED19A7576D74B7CDBBF9E6BDBD2026303 +3C1EB51FEE04DAAC22DA8B26B0C3DCFD7AD50E44CE9C734BDCC605C2C5AFB99B +815B9E0DFFE77CFB35CEB211C6E5092370628184B08ED27B8CACA1C7BE8C6521 +E41D3C4142A84D267702289E6AF90C48B7DFD05156CD6FB4EB424B0CC12BE5D8 +9A4DD29029CAFACF480ADF9E9D8BBE6F7D90F77123F3E15C6F667A718AD69721 +F2D996CA371AB4DD46D28476A84DC6C0B22507FAA8031B7D0CB8693DAAF8BD6D +24E4578B3CEC87D60018236E612025BD514B7AE56FB0C859C451F0B34885E629 +434A3937990C3C20227A043BFA53C3628F747BD588460BB25C02D0C607C409C6 +F56A23750F8B09959C7B3935E70F90650EF8A71A9293A7EE6D5D01914B9B9201 +1B53DF0BA9D573F2D6A6C0D9B884E9B46BCC92D4D82AFE8EE1661B66F77B13CD +7C5267786A4B9ED1A036B591962A4C9F49D58FCBC86EF12B447363A724A9EB9A +43B0A46580564CD8B6CDBBD0011D2C2AE51C1FF386472A8DD61C66363D88F0EA +5BBCE688605B3C7082248856EC479F04F99DE1E827D87494285CBD2AEDADF415 +D154BC6C30A35058800A1360DECF3609CF5513D86F41C4D058FB9304FE0CA42B +90F23C676499E2A983AF06FCF09E372C69C5AC195C6AA0007014878AC4EF2CB2 +A8FA9151B2C77F776DA1C329736E0F908F48512991562FD3C0EE5E7C75EBA52D +C4686544960F7A37FB2DE00B945C521E9FA54210F42C1E453D0439DEA072916F +D1C9B9C01526E79D44AFA41B7AA08BD4CDA27379C1A0BCABD929AE917BCEE67F +E3AC05E5764E79ECF059E52EE85D64D28766076B412D2CA9271B74A6095CF04A +31655432E2BF0F9C2C5F37C257B31E7A5B06EAD92329ABE9D70FAB1C16957EE5 +8C80A873E3AB6B29B0126C75CF659E483099A5A32D9B0B46E803B5F35386F136 +B2515ACF4DFF8779C311E74A57A13C127185C2CFEBAE6B9997043721DE4450D6 +61648C6A697F09ED42BAB11759845D46E8605079C36B670CAB73A0A1E01D9E38 +433FC147E25E8A702282286860917D4A0DEAC8222A740E58FBDA91816DFCED58 +F933AC7F7EACBE198DB60E6F11ACF470B57FCDC16DE31BF4B15BB951E50ABC04 +7A9EED8550B60364CF3782CDB7165385DE0B650599AB3DA34F5D5B963514B4AF +09826FBBF93278DE6EED781FECA7CF00D2191D14C9D8A5B018C73E3152EC3C7D +079350C0BAD84CFB574C35D7C9B1390D81957EEBC3EE70802E0B572AAF20C79D +B08D8C2EC77F08071356C2645A4F7C257899E0B72826B89B713A4501BACB6B92 +06DA791E0DFBE3C0E68CC28DA52D2B1FE5E924585BAA78C463D865D7366EAC60 +EAFB579FFD8E0C57385D05AE1E8B6072F56DE0D227339AA24B0E4B6838EB84B3 +A891C4F078A69245717FD73DB2704A1147970CCFD9E4B4B1B109B3B717320555 +D6E7A3CD8DFF269AA35BB959BE5A70946ABA128DA86D92B92046BDBB73C7822E +CAD1F50FD9C064364071A9A8CFBFE3F365912C2B53758807859107685023B015 +E59A1DB2C85CAEE13175BC9D60942B31EDC438AB4743AF2CCC57A0379F922DF6 +11FD6B1AB6FD9E136EC11148C08372C65278116A1457BD8DED61E3B987C0A3F9 +FDCC5C1BD67A2AFAA505A50E925D18863E2FFE33E293195DA5B3B9B993BEA762 +5C2AB3C89DA2BB72EDCADF3C7993445A26191124196494FD3819F38E1ADC02F4 +53BC8487EAEB01B6502343C360EE62FA6A5133354DE836BA12A6E98B3770051D +97478423C4C26A75B667B30844EB7C7450E39439F5E2FB30763E519F67A1BEBA +1164E4CBB723531B04BEE7572C808408965E4BD1A9C991DBC59469C57504EE3D +0EA77F0B688DAB51C1A11B5447DF43B76A97CFD09A6239A8293C9BEBEB2786C1 +04045ED4F8791918648352DBFA58626CEC471E47A0C2DD369434AA93C4D13C01 +FE22FC16270445D61BEDE0CA168DD7AF4A4DF923FA871ECE63ADF237D37CEE47 +9C6E657A4D8874F7872D0B62F775570AF435EF8FEE6D3C85571ABA7877348E32 +4712DFF94F1DB89064281B94E44B3606A9D3E63646F40774526E99390EB4F196 +4CF48B9F39EC5079091E4FD385F6B7A98DC6076582AD027DC94E7A4501B0BB26 +8C00F79509D91279A17BEBE5FB19022C1C98B784E113C126B9B5568E20700322 +E45F1CA1662471B3F3E667EEB8E0DAC038199F9982DECC9EF81B8560C697187A +F83DF3CF7F399328C13ABE41F7D091F60046D72E8F94B94D4D539B228754B4FB +769A930980B4CA7F2D88D31A842E45476E34EF002FA928E866584C7F93908AFD +E8EC64790D76157EF201BED6903511F4648645B0229E648BF2D2A61A759F0B9B +E80C814D449D65F0B7588D27BCE36D70EABBDCA2A09973BE36DDE06F651C0E6D +9A83AD303008986B2A94C0722620022E6706BF709950CE9B3EB09D8B5D4C50EB +922C5779A5A5350F0CAD649D175EAA8F3FE4C7E6ADFE77B5D9184F750E51A1CA +1C1021C89AB45777CBDFA4B7DE550005B10E21BC4D1F034A03DE398CCFD7A21A +A68BE1161911997EB8F43B150CB2A683FE2DADC53914338EC9DBB7A26718E86B +51B8D8C9E098B021C510C1FA908C4D5FA8FA60DC6B4DF825352610D5C65751DF +B3F01EFDC2D71F49C650384595806CB70B21C2503E27A06E817540EC46EA7772 +E876DEE2F17252F39A9D57A542876D9CD51F41C489813D62EF5F7BE7BA6C3644 +42D3AFF0BE9C63E2A80A4ACBA1C2E042983DF080B162FC392987DBC66F4FBC0F +DEEF00B9503C7699DA93160EAC233C7DFC7F09F91752213BC63D05775706A18B +45B5A9BE0DB983220AD2F24DBF5814314E194528AAA540BA19C95DA8622A2A61 +4FA39EB7BE6BDD394DC9B14A77DAA7FE758F6BF5F0C7B5C3C1C480CF3B41743B +6466B8C95F4C112879386508264549A56250D02462ACC3A5CA62304138A90CE5 +E0FD95D975014F3FE0EEEF30B20C5F21CD179246EE87C057FA304689471D515F +B168343171AD40C6D321510804AD735871C08F0C14A5549D21A0F4DC1BB8115A +4AE7E8739DFFAE2D51E28689ED56B3C9653CEC7B160B5A90600A9EB139E3C3B4 +99B692C28028970D70BFC1CB3B5FA95900E3E68BA80853756B768E7120F08BAA +67734E0F5588B1C71961B1CBDA92036DD24FF72EB73796C52BC00EDF27DDC1E1 +7281D147BE84C4FB91A68FEA90C3E245FFDDD78CAB1CBB53F1DD75449C03771E +5348317A3C4DC79FF83340E91D29692DE71101A7BCB4CB400E8D81DA9536F601 +C84BF0277EC915E4A0F350038850E0CDBFE9250FC166EFF1B12A92A6C160ADE2 +02A9B84DB6F998B82FCBCAA88B22E24D2528982F3F4FD44F722EEA4978BC5D1F +9D8FCAC59E66A969430B760F7433A4195A10AB6691FE2BE4057BA6B45E5A42CA +A09CC3F70DCA414232372EE4BBB9972B730F1B5E20E61982E39BB4520E805442 +ACD3D64BBB96105ADF1EB4BC3EE8790DDE514E25A7757964E0737F383816BC87 +5448723D6AC995CFC16C6813234952E63FCB69789B5A25AADE08DED559289187 +D50251CFC03CC3217BEE1F024523EDD5C7AE5A33BE538DFC366478070EE20BA1 +DE588DAF0609FB946A0931922453E5CDD65A85C2B0A59E4CD661E447C42CE2F8 +34852015D26689DF23E52CB2275A21A0FD2F4F52A98D2BCDB53C09782226C259 +B9EDE48551F5154D78EC14315D7ACEF6954259D8AA6A8C76D476AD5D7D141B8D +0C7B34988A2DF797B6F4319DF83EDB8393C6DBCA6CD1073A6D7AB000F5C911F2 +0BC35104C2B580D5019E8C16C1CAC5A84EB63C79DDD421E92BBF3C553EFE5BA1 +D0EAEFB56A51D13EF586B3D44929C32EF5CE2D087841CA2FE75EE9E79F36A018 +10154805412B91A4873A793DD9C1D7A1CBD25C57ECCCFDF950C0DD2FEF7EBE2B +A1E02B6E2F884751A5EF3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTI10 +%!PS-AdobeFont-1.0: CMTI10 003.002 +%%Title: CMTI10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTI10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTI10 known{/CMTI10 findfont dup/UniqueID known{dup +/UniqueID get 5000828 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTI10 def +/FontBBox {-35 -250 1124 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTI10.) readonly def +/FullName (CMTI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 97 /a put +dup 99 /c put +dup 101 /e put +dup 103 /g put +dup 105 /i put +dup 107 /k put +dup 109 /m put +dup 110 /n put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 118 /v put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 +5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 +8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 +EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C +02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D +46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A +4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57C5FD29DA32D34C95E +2AB2ADB3F60EEB0600C8ADE15A2380DE10AC5AAD585FBD13097B1A7E8E210D4A +EE96785449E07F0C8EBC2EC5EFBFD0897DFDC15E5BFAC9584D8DE95C5AB288CD +8AD8B9BEF0B8E5F887B3B0B331542FC8184DCCB753DB6ACEEF98B85756B988DF +CAF1AE0DBE7D37D5F44A2E760AAE3A5197C27B15E32275A64946C3E4D0476FD2 +7FDE148C788DD2106F7C825E270588AC05B57E625AB17BDD02306F9E5FC851DC +32A5A6EDC43C770A71419B2C0C8074EF3F222C8A2097CD81A91F333A521B3A09 +482A4FE1CB231CE344AD126AA284C3280AAC3AD162CF0EE241BFB4C8F20502FF +118507F5D1B5FD898571015E73E5CF2281085072E00D401F6F59761EEC3E8381 +1F26F75DB66C504AB6BABA87D121B1E7040A07AA2FE01F80DBC246CC03C4B2DC +C2A715980C52B7F96BC1A78FCC7F4F52EEED5F705E08FC1E5BBFCAD121FA88AA +8EBE58172C162AF409DBB0728F14923ED02A65EA24E5D52B6AD07777455A70A4 +61833D3789C719BA92E901232599767E423D5AD9C807670BE0E7B5CFF8256A20 +C7BF7214FFE0342809570F5966A2C43E784F35015D9040BA34FEAB6A6F089504 +3A40A9E9D711A2721D3F4998371430FB3C94BFC619559B97D49627BB630F4B70 +9D0A8FE4E916235335C3962F3CFDB04C4A3CF714DB5E260F4E66FFF2F27CEF2A +D4AA26BBCAED23B8BDC98F8F453BA27AD7758537561E766B82DC3032E92A9EB0 +125D98A22C5466AF069BF72A9BFA052A8628FEC6A6AD0B711DFFEDE3AA2D7CE8 +34EA487038EF50F953B8B4471CBA6FC3C53877EC1BC94582B1123EDF44B4056A +30F49394BDE22CDAD7F01951C7013D26979277D18EFA594E8F4F2B5E615187D9 +39E842EC28461B9ABA52020A127D2CB9002A673A435B13C10602EEFDBBA6BD49 +9DDEAB9E68D655443A5C2492BA061C1391A51592BA8C353A6F6A0708E8860184 +2B5D031D2CAB87D618E9F6F7A0BF3F66B3FD5A25BB91F7F1F5F99CFF56EFF4FF +0A35C55658001ED2E97B26C869292F6274D433A5443179DBB8EE987196306348 +3F9E87C6422AFFDD30080C9AC4EE7FE5E2DCBFEE4974331F4AAE479FD8806D4D +9C2B85FC69EB0453AD827A1E767E5C484BDFBF5C8D6E2B3C96298B390F22D757 +802643A79D5E29CF3AEDF0E12CFBECA4663444FC87F2027571DBA9ECF688BF28 +FF0DDB3AEDBA0FB28447CB4B5D5205F40C1E7A525FD7373392EEFFD910AC82D0 +98E71660A1B3227C4A2592F3E853CA4CDF64DF19A52582E167234F4036FAAAB9 +5446BE102DE2BF43E82F0112C2A20F15A3F92C6571AC761665A905362C4F8BDF +AC8705519C99862CD9C0D75113C4AB5FBB83C880E46B82715B5628890D9103AD +A2329638B95D93C4DECDC5E6C588C9D5183EE6FC28FAF9825F02DCA567306D93 +5440987A81B51EE7291107A08F201C609FEF91A8F0587E8B13D4BAF74A5A6815 +DE9E4441F46AF8E1DDDFA2D611C889614040B144A5EC064DEE4638C04EAB2E37 +4CA8F50FB8C4D65BB296DCCCD39F1F554CFBED96670A91F515CA10EF896874BC +8EF48C6447752C70FF5A06F928DB55586354076773BFF7E94C4C3A7A1C1F421B +A9B4E3936EC26E0C19BBBFC90F021E877F54B62108F6DD1C7F6D5B8E64FC9362 +E173F01BF2904B7E5A08B3543611562C2714099DE7D4FA330DB148B560A9601F +42A84452811CE213DCE782A0D7809CFD954D6BC1EBF2BA4D1B18F50FA8174C96 +3E0120E266AD5DDB40B3F6798AC28CDC5C3C4BC34583528F5B5DC8A222B80B59 +A3A93DC715D061EC6915E6E6E21A25425C25E8747C60F170D61047108826F96F +7830E220C108B441B6EA3198E33C49BAD8D43086E49F5A2BC7958A1A8CD011C4 +49045193394696EC3DDD0BE084E8F2E9F0B9496F035C0DEC1CE11409DF566428 +D50043CFF5CDD1092F6E0807E660B68163BCA738E8D98FC6EE3F713164CD204C +0BA84FFF4F33F47BC31750B448603D7ADB9AE92FA91AEBBBEC0DCD66980E6955 +CEB425ED07115B24E40F53B29B9D840842EAC691B4F591F866DF27556474B485 +1C6F53DD72499847109B16C7093984A6B8487D4F3870DD517945CD90E648C1BB +8A6861E540FCF9D75B984B5009B5CC760CBE297042C240DD624111670B703388 +6FE6FC0E89C6B4C88F51DFF3913D0CC1FB4770C8CBEADD4B86393605C0B6C468 +83CA5594754411B6FC331EF56D7CD6D247FAE42E966583C29239A8F862348D29 +60B177984B6B957E733DB4D275015691D91443BBB13C2DA96097A29733CDB284 +42F89C85A7A743338C9DD3BBC4EE53F695E5163E6E1ABE5791ABF100B198B9B2 +1C21E2FA2FB4AFE7F9BB2D381260CDD3A2CC05BF513AA1E80ED69FA27BC5ED5A +21445BF00BC2F997B356D94AF13736C6D3B0613EB6F4CD96A685FEB672661DCA +206105EDC3CA07900676EB2FAB37F48D2E8207BDE1463894DA3C5B1488AC1EE9 +D39DAF691648048F5D7A384B8927F8DA2BE3602669F71D80686E427F395134E7 +7ADCC611BA91AD4B7A0237213C60CF2C905359C90795230344FC3C50A22BD44B +55B2044792509F50F5C21F53D9F9E9F063ADBED3AB99E2613B23334FE8DF70B4 +6120F2EDF69F50BE793EE145B9FF9C73179DE640FC2ACEB5C6617F918CEEB762 +4CD81E665B2E544864D13230B058717B207D3CC5D6647D5343DB4D0356082392 +871EFFA896631A7E0D6477942B632074A9A4EF7B09D4701B1639BAAB4E03A40E +9B54A7A4F845CD63F88831EBFA4FB847847CB98F3455CB5957F2E0A0F5623645 +DBB5C5564C7F8B117D6E27E65C0F3EA81AE67B4AE4B201E7C4FB0A8364FE53F5 +41A7CE8F834C2C4B322809B353A5E63BBA7BF3B7DC1A85EA700BD287C2BD3FC8 +2832B0BB4695FC937FF5EF06FCD87DCE6DE793C2B1EE10E6450352C17726155F +220D550B1759E15AB2C1D5968E52C8080CD280E99D3CCC0E80C2EF8BBFD96001 +A226FEED7311EFB4B67F424B557A877379A15BCA54780F0CD2CCA00400B9B39D +981C6B552AFD2506D1B23618FA9AE6D8143CD7198A8482CB416CCE62B992347F +337D505A4078713BBD91E5535BD58EF0351EBDCD749CC24D4AD39F8CECD7D6C8 +139756680A4C03A58B3374CEC658D30160AE4863A3938A891BB59CBE02BB451B +1BA4B2B6E68AB61DEB85F95E3C909B8B66E220B9F18280161C279F10F7093CDC +100A53D542F071CC0A5AF834DC1D18738F5DD62A5573E884E1FFD22BD810828A +1EA47F8218C15A2E97CBC609927DA3CC2B802EA4A0D7EB57627C135E3B065905 +F97597D818A2C5CC6F328AD25AD11FA50F1E4FE637980B7474D6F85A521892FB +72989AABEBE02A2D0EFE88A6F67AC29F5D8DDFEDAAF465C439983C6B84389FF7 +A6434462BEB7B07DBE4BBA61ACD4A60C55B5C0AAE527DE381DFECA2E6BAFDC8D +310364ECB42CAFF72BA93C067B2F02D1CA7C34AE7CDC46787A0E234C8BE8A928 +7A6F3DDE0338FAD532A9886E8E3525B85DD39364AB03EC4C0DD25DC179CC1989 +1BE232E387E857C78332D834679195E10F1E7B87B7966DA3B2238F53D1E13FE2 +8F55ED6A92A750C7250C9B91E29796621E7E9520373214D7DA81B2875A986D33 +80382AFF6DE1F829F048E57664D9C4ACE91E4684A51023943A4964AB5657D610 +3A5405EFD4CFD1EBA684243E15093C9667797BB47617B66054EE02C41FFEC45C +C1BAE8AD56B00D323FCB1D2744F061FA16E161988741A319B1564E04BA210996 +4F9F02A3268CABE450D166A763F5284954564A1C86B76544C5F5ACDFE0D758DB +865A1CFCF9FE8CD5F9C3B2998C56468FD52DF8EE60C6935A3D221EAEC7714E3B +301371C7DDA0B03A2416238F2B47BAD3A2C5021C886DF51C695AF9C87A864B48 +3BB3FE0B355EED5454B59B25A0D8A1B8CBD356C24F64D9B55E16C30C011365C9 +1E0380753BA3EDC0868788D5F50B9353D0227BCEE1BE36998B2622C0759BD66B +E4444250589F9CEDE766D8B940770CB6B89503E925B35C00CBEC2873D2DC4A29 +0823FB7A3717B69A7DEDBAAECC067949932728E89BEECAA91DE3AF9BF070B9C0 +30EEFA8C0A55C8388CAA2F0515915C98E67FA095BB98967D14B0DCAFA9622E4E +2E0EBFC768D80585ACDF28D8A5C2B6EE2FE7AAF62FFB90F569F84A0903996DF0 +C1D5723366C436E4088F3E2BB9B47F9789052A71CF5C49908CDC1DDA194BFB89 +14D7E3D7D4D72A150FD6FFD8303E9DE5A97A71B808B8BDF2AE466F31BF5D7A4A +44F81230BBE2B456A221E2F72A8B59F8FEA8D31F8A005A5BD93B9F49CFDC3DCC +CE2B67090460F632271C7157BDC2F05BC2749FD562FC28682A616A52D1B67654 +DF78B7843A9EC26A7DE2EB168F874904C2915B97534B2D4D9F74A9573A771D34 +9F7BC855E8F794621BF6AD471BCC347E2DF5F620F5C209E33A4CBF1EA85AEA87 +4492A77342DD33EF615FF34037D660B713C908786D9022051B825226545827A3 +2AD1B05D654DB6E6D261B4E8AF0933AD1F0FCFC7201E1A7C1B4199F160C38676 +21ABA2DDF1CEB655B3EC3226E0B122976EEA998F7A5241F062E54AD1DFD6ED26 +47C99A439E0AE95415059179867CDD3F0FF751F3141309F40E00A6C7C28433E4 +F649BCD5DAA64177580E05C495EE7BCBCC5FBF104DAF360CC2711386655B26F9 +D349D887EEB32ADE595241560FD5924A1745A22E6A01DB9C285EF14596EBFF0F +03F36EB2E0A7C3864F819EF7B0855121292D49482F046A55CD7271FE03F02EA5 +886864D9D8EC22A68C23089EAEFFF03DED6484D8C341861EF8B6FD3C5BDF5AC8 +352DA4E13A1E30D0CB71E090E9CFB9AB2CAFD0CA7C34AE7D8E3B2EB4666834BD +9CCD1AC2108348AFEF6071796F4BB2FFA4A67ED917E76A109FA2DC2A30D744A0 +9AE653A748C1D18FB52595D84E87F1C1FB6B2F32667FE203262C66627AEFFED3 +92B23861E5EB238BB4EDCE09DAE1C65BAFC198CDD1B45D42CDF93E16BB82D35F +821E9E49067E966AFAB2AB52928F8DD6359984071FC37AA652FB834A09E5BD93 +3AFAE161140E74C6531E413E8FBBFC42BFE8A464B71EB1D8CAA93B33D7BCC3B0 +47C7EEFCD3E9FCF26FF9441DD9BDE68D77AD7251C06BBB9A2103049E8827CAF0 +F26BEF33F656A690235DEEC623CC519AFA82DE2AE16FB99F780FD7D8290DA40B +9B604AEF36B529FD184239E7D50561A07428D28E51B55546590A1AEAD4B7F2B1 +AB8C5B9022C1FA03E33F8F409B24911AB8BFCF6EF4A8E415263C789F89063E71 +C0910DC20347469380B7FC1EEB87D4CED7F4A361E58B61C91AFCABA35C03F978 +B9FB5257C31657EE48504C355CE893FE3C553274C641DBC4004F5D5B879CC5ED +D3F21F867F6DF054127067DE86189F0B59A1B90FDABCDFEE61423609D888EEFD +F4A1367129962110C651D9481CEDDB8C5C2576A59AED64E95F7ED042AEAE2F7E +81AC0C408E593DC30DCAC334EDE9EE27D932B98F040DDCD195D6155607DD2038 +970EB78221A94C52BD4F0EAC65F1FC10E5DAA93C17266F351669CAE56F42B68C +6D01E1EA03AE554D63CE76D800FDD9CFD89F80A241EAEFF7EDFA41794EA25CE7 +97BD5028464D2CD45B53834B4AEF8BF0B9E7C6ECDEACEC887E8790A47A93F668 +A9095E5FA1116A122C0E5B74E2226C654D3187C6CFD8807917820423DA3EC1DE +AA020EEEF2280C44A15209EE2F3FC1776875308CEAD38571E7BF889F287E4594 +971A83605E0B4169D4A23EE790515223DF8724054EDAD905F57918FC0BC64F96 +514B4BF7DC9BA79E763C22C977FB6146B10D26FEA1BAA7BAF21312F78D1625A7 +8E242D743471DB5821408AB786E4A7EA9D35E30E85533C617689F95758FB2C7C +392E759C299DCCE36689686DE0C4DCE32649493650BA194A6208C5EAB670B170 +3F2C70BF0EF0E3BE2FB0A79224FF4ECECD6BB3388C6D06867A0E5E3DB93C1B2F +464C23E44D3132E7D4086E3B59B1D13F49EB4772DEDF8EDC4F603217233FB7BE +C13C28648E9AA51D53F11FB896839F97AEDD8834BCA53CB0021AE91FD8E95E2E +F8A094093AF556B9639F508A401542B06821FF9DE1A745FE9AC5CACD5E8E1053 +911442FC15CA5333751ABFE2C617D38FA1DC332BFEF44AE569DC631C93EC54D6 +261583A695F5A392867A57F59B741EFCD2DCFECBC55D1EA5F2317601C9DFE9ED +D1EA466210FFA905A8F85BD58B98991BEA58DFD1CDED5C9B086D42CCE632DADA +147941917B879139E016B0DDEB8446BA017FC8EE5A354533D667B0835F5D027D +C2D580C16B80B3D05CC92C0465CAE077729F0A15B2DAFC89DCD349B3F81D0516 +C65526EB5C10E45A8A85D716EE35FB9AB201FD7C89ADE5AD925A174169DA20FB +61E96C73A143DF964C20589EF24A0FCFE6195317F2FA0D2249C0D8E649C3D9AD +FF13332EA2E4C9CD36D8443EC8F027B61CEF92C6A6B72DD4ACBACC16E429A9A3 +F5F29C1631360E32F8C1C93ACB22F810B86D2969A7480F486F62F8488BEEC74C +2C1AF13BB92BC578E8CD30BEA6BC8CB68ED730F54CED0167605FA76AD7B7E88C +7AE7688E598F91C471BD65A542E96D64B1EAF19FB4F1234308C48C2DC86E2193 +11ABDB4C6189C6F201627C693691A86DD07FF55C30FDB3F72381E09C6080FD7C +9182762E5001E30F52A216E0B71E4D2D4E2F3B20F95DF3A11FDB2D2B5B5FAA66 +C46226D5E0C77066349770514E5675550FAC9394FB27CD2C2F974F1FD58C04A3 +1EF53A8AB3B2202CCA1CEFA66228E1480A0709436C44BD3319C40CF888AE4692 +5DBBB52B15CF3A518F627F672135A24D5DB9B2EBEF04C860AECF231EBB5A3BF5 +6DCCD5E72FE4B6DD29E896691868A7DE4120AD06AC573F5608B8449B38E71CA0 +EB5CDA3F942482EA7973661170F81DC88D54DD5B92323F46F833DFA757107E9E +F62A47CC50FAA1B68ED535C3E0E1073532A05ED339C8D70B3B9864808ABACD23 +AA95E9FDA43D54C66A675FA074E0A5B8777D3C07850A09087F36852B5351F35D +8BC4DDFCA35CF29CD5E3DE118A741FAC4DED36847F2E2C6CFE08669301722D94 +376F540982958074E7F1383C409652F6C99DA39FE90B38221E75BC1ECB93ABF6 +B00F410A0C5651DB418566AB350FDA1789AFD88286AF3BCB42B98386F7BC144B +02DEB8940D20A6B3062F0C4244EABC50923390064F1D027A8BACC3DE45156E56 +4A942D1B87F1C4A76B0D4D6801AE792CCAE3009BF25368B31B6AD5476FBD3BFF +9759EF463EF5E78E10B7BF64005B2ABE0E8813950A08A1808587A98E0021D0DD +751AD515E8278F1A0759E85D8A084490BBB0F8206484AA36388B1013643D3198 +3509078847BDAE08E76FA5BF3E3A73C323CE093DCC148E3C02C2DE1E26C94D5A +40EC8308ECB02FF7DD04EC1005A2A0DC74D4E587F10A3EF349E828F69FD38962 +2F0C74D5DAB3ED6CC9F97008ACCE74C086A503948DEF1AAF58FC8BEC703CD360 +D32098A56AC776B1BD08442052A2A4EF6C8798F7CDC102AF1A2009657254762A +0793F79A39DCD6ADBAA5EC84A7ED6018BBE727E5D477893D84F157074B24C13E +8D4881C7DF8ADC13EBA0D89745EF93B7616EC5355600BB0D2B630AABA3CF2946 +AFFD0B2B724EF0F28393F3CB6A4DCBBA655E3D6E27F87E6D8BE12A15D35E1E75 +D36532B9C5000C06A58822444593A1038EEB23C7AFC9EEE3907DF8232322B09B +230015E014F1B4CEB866234266440AD3686E30ABD086CF9C0926E711F0757925 +5DEB3D39C8E6D6F0C05A364A0DBF90F6E32CD28887F7E237E04093E07A94C973 +462254BC1B1586AAC29FC7F15A80FB5993ED22E79A0FB5BF0F7362CFA24BB2F3 +D4EF7D39E1902C53053C27E2AA49C4DE54A05AFB1AA6C7CCFBD9F72150DE259A +BEBFCA5C7E828BE667E9C72222B84C4C79C2DEB885A69861DDB635B02814BAAD +9672A14E50D6A2A236AB35C6DCBFA1165F47F8F52B0787EB4B70BFE3CAA8B511 +A630E8148A51C1394C7C321156CF52EE7BFE07B6C354CB65782464D2BE42C0D8 +14EAFBE88DA3D5C90614F22E02626ABD343F3AC0A9698AE84CB97F1CC421D34F +98B69FF4C335B95F4222A8BAB77662B4A57A4B574265A679334D5EBCB073FF69 +66BD9322B1C2253AE85AB38889B26761BA509C7F638C6CBC4BBCDBBBF4BFE1AE +855973129978F707C87462B67509FE6EEFB5E0949674C34768F001827F12F1BA +77AE866711077C30DC0E40C2D8A6EF4D85355E596E26B675E8D223D4E55C3580 +5B79260E90985DA5E5B2F43DE7713D5E67080D2843D44A3585E078615BEA476C +88233D241D3A427F9B1AD26ECD535E46C137084A835CD816CCA936D0011C53E7 +B33D5B50ED7BF3F41289F48E394BDC963EB1AFD6F14F0C146E0F13B03E76B389 +8AD8E81E41F14D1682A113D8BA1482D9DDFDE71208AFC351B62E028C3D50BE01 +FC9CD5D5F36E28DADB469201F41E9F39098B65E43FD1227A26F6FF812CE452F8 +B5476C28FC1B1B3E5FEF3A3B94CD552E29288AB0A3ABCEAAEACBD2D5E9001579 +738029B0E7F635C6C4962340187558084D9CD408EF7FDCE23F465AFCAA8EAAC4 +8855BF64EC9BC75371A98095CB51BE7FF107E4C6C21079571957B2AC35ABF77E +9DCBD599C549D3B40A36AB846859C7BD9F87A2FBC724621FC7B305F02742A66E +F2BBB6B21671FF62D682982C4E8F6645EA4A7D875E03774474BD86F76AFD4053 +61E9AF3C9B374D730501BE61106AFFF8A463406722AD2C14D1A81C08C2A31E60 +42DBCDBFFE4056E6AEF59CA261835523196A8921D1BE0013F8B3D6F05793FD18 +3E767E98289DA6CA9DC9E2EF9E697998D2367E45AA87B3E75A57F64021FAB21A +A480FE7095000C29AB92E6D299B2E5EA7AE1997A6B23E1F90549334F62417196 +89BF7E9F62484C2816CF5FC2ECB7DEFBB11E63D70CA13D96BF3DB3B95F39A41D +2E0C84ABD2FFD86525323ACE4A85A8944601CEE9D157445312EE9EB81873DD63 +A1BF3256BD697289C32D8598046EF6F6646629A7C29D5B1C5855CDB95882C2D7 +73536D20BEEF480B4213C0F02826D89B76300F6BF3ECC9C1DF3AA2C91CBF7D8C +2862CB42FE32A3715855D8B7B30FF83EAD80181F8034395A1ECCCE5BDE7A2C9A +124900DD8F1732791A32ED4820F93BE8D15A5B5960F824BD17A8455F537A947B +9726CDB5DBA4107593EDBBEFF3B140B7CF51BD51B099045DB94A946271DC6C00 +24F77C781DBE53479E423426F3FE3004F4282816CB898B570C171FF63B4FC904 +8D716F6B7F3BC9AABBFBF1DDF2779CDD19CBBB60DDA40D5DFC85ACDD2A0FD2D7 +6402B7768E5B1D7CAACE9241F5891F922CD586255D1D9DDAF0910E14F3A2F8A4 +631394010C96EB7EB6E3009591E12C0C80F511D1FF14AAF65FD0A74E56361BF7 +07826E5FDC23C1AC2A50347CA313AFA7CDFA9E42A077C9D301A351A89C4DBFAD +5DC8757C93A6869B2EB9BD784B298CE59E14C1F64C508CBC1F0E3EF713F173CE +E4139B6AB00D513BBA722CA46E21F6EE9B689E29A6CF80BB91656FDD6FECCAC4 +932E55395B6770AC6A86EAB50AC58FADC1408B43F0D45378E762A9FF61DA68BA +315AEFC5A5C2B929919FFB3AFCAE5ED7D739567E868D77E76D4B70AED79F2AE7 +21CA3C966D95AA795904FBBDC8098C3DD628F503B3778D9D7583D25AD7DFA289 +204F6DC33211530ECC8E9D28B7F53F2AB48F21536F2FA00CC12DF01116D011E6 +F97FCCAFC752452AEF7E6D141205AC701FF1482E02C8021E7A50E515EB1531D5 +F0A3B72FB8B97F1EA6DDF4823AC8C1B492384AB5C4DA7035400A0A71C7FBD379 +410391CBEC1B137DEFAD3EF4F45F19A594C0E51FFBB619C7D111D213FBBB2693 +43CAE9833E9ACE422DBB6993DADDDE44DE3E990CD7ED0590FFCAD9DABEA857C7 +F5FE4C18C260F7428E4A71A65E9610CE16932F7405085CD9C5562CA83347414B +EE167A0EEB80E43C1C9251882267B404676D5A4266C3F22C3CF38FB9E2414A43 +A82971C7A66DAE9474153572B8B92BA81F3253890A6CEB715B72E1E8C218422B +5F12B8E5155A544FBF3A105DC23132C30030E335AAC5A5B1DF44F2EBFB93DF1C +AD8A7D6E1DE1EFEE889DDD22BC30D51B5D0A6BD9743DEA811F718D243F589B41 +FD0E2DAEC6CA60E7DFF1B79F53C4E1A2D5D5903D85F35CBF76BC5BDD296B1BCA +F3CDA8F0C8C61EDD7A5572763D566283D08BD014B18A1EEC712A0B8CDD4CB96E +08E991E0E78223C434B338C6F78E2741DA608167AFBA9A05CFE5B6B4499D88CA +99AF98FED3A5B1C10B71F74A5EBA7E4BFD7479D7C0C93217C7F1EB956F9A3EB1 +7AC6A9485D4EA93066EC87F135A82CFA6D2B4F252D4DE83621899D8C72270A9A +BF5C17098895A7DC73DC69042D7D2F1E517A39996B75332DFB966FE556682E9F +AA043C5C66837F618CFE04262B8EE2E34C047B2B8DC03171B4A485289C392DEB +7CA7A789D1A58642B114D535141283C659EAA77970125248DE0994BE1BD57667 +520E755850D131351E0BD4C1BF71141843CE981E0506DB539A3A867D16D1FEE5 +F409C71D115BA2C90D27B2A8F5197EADD4FAB34D0EF448542EB07B9B2FE8EED6 +BAFF794AAC03C9AF50ADED1D99BD9859D0538229F1415CA971325DF855723A81 +C04DC9D5256E376A66835ED86671E18C539279615B0798D07798BD8C4F5A6FB9 +4F7322D74669AAFA796AE5B2B5F1F971E510C1A22A05576C98075DDA9EB886BE +711211EA5F9C03986948964732849438ABDB47B88AC23E24CB4B82162533D0CB +FE408BE676FF0BEAF32E558F0F8FA82AD625A8F7F18560E3601E815A6D94820D +0CAE42EF0F650F7B954B1A52228F16683DF4E4F78B007011C8140FB87ACDA2FC +664F1F24B9212D1D44D1172CA1F8E532DFA297E07DBB928C275C7929AF606617 +865E2F555664F953926C673CB8890F9E404259A729A2FF324FDBD9CCA92FA5C4 +93F926178D2CCCC3FAF83E2AC5F574A0938A700F72D89841CEA6AF46E31FD7A3 +D2CD51BA1730F7ACC3DC8C34B3734D4B710D0CCFC98DDCA3784AD038C2D689CE +EDCF1A1F6314FCB5F59AA1C761CA9CC58666755674E7ED1E34CC5A7860C2168B +2C2764E43812900E384962D7837C932CEFBAEDA1ACA75D19DADCDFF2522A4984 +6B40BDFA2C517B7E84E3F4EDAC1AA9DBF9C10E3B031BBBC917C75214C70C0DB4 +1BDDC12BCEB48930D10522CC153BE6C0E6B2DBAA48CD409E33EA5056108A38AB +4228559D411FEAE1C0711190CFCBD66C4392BE1BC5F011E8ED31C83BC6EF1E70 +6E53A5037535DC8767B74025EF5F7A4BD3894071698C3A8D7181F60567E8B25E +EEF20429380CF256671E87499DF2A14E73B4F79AC568F0A781C9A4ED22009B55 +C1D8302B7BCC76F2C14C6760C1711CEBA13A739DBEAD0F734E9320DEE0AAD306 +734080AA5AD5978D850C25FEC472047B7062487C2D0F955911C7609F535D48FA +BA52F16DFE20A866221F463A5A22EEA0CA9247CAE708FD257BB51C5BF9075051 +2F5BB8D8E2BE94BF4BB9032C312CEFAD46DDAF74C68148F5F2CFC5C0BBD4E87B +BF978A8192DE587539601EFBBB49D4CDF1FF4E229B299DBC3855D51571F5990C +43DCCF357F4756774FC6AAC1707093B9B7926C36DC1F4814D3AAEA7A19F9FD22 +5DA49DB5BED96EF8C544F9BA29B0609134A3649AC6AB20476023DFD89D35B200 +A3ACC84A6F68C209A1B37F6B0620380CD2E4A23D08ADA7F66A3D129B702A2189 +9EDD36BEE9335386E4B742D56030C48DFDD1DA50CE4CACDE2827D4E1F7E2849D +5CF13FE1BCD0DD6FCC9E7BA36CBA91A13E4B329E8E72F0316B2AC5DB80C4490C +74C9440AE86D4FAEA76B628CF30E67609661299D1255EE6190A996EB0795BCCA +B58CD015F1980D7951910B743EAF16374C4EC491CFEAA0F89731D14A0AF43428 +473CC721027C9222B5FE9287BAAA6D2D0485C65F46E5CE9B84DAAB44807458E3 +109DA0E1AB85D0608AFD7A9831250FB4A1E19AD26707E4C188591FA88798015F +93E16EF116D128607F78D5662EB558E50459E00A2F7DBF72675EDF896D52F30F +975C45C190025E6481C806A519EECBCAB88C8B9EB9646C5689D76BF8EEEF8ABB +17ADE68C0B64521D69430B39849396ABDD904B25D620DE7503BCFCABA707B881 +935B5DE0AAFCE001EF33910442A82AA44DDC8AD235DEE928DC1706A1874348EF +0A8ABA338D60DF49BC718627DC00EBDF887637C5E6C39C66B4488C5AF59E57D3 +35A70E00BC23193E0AFDB2D6C4E26C9DB95378C65FE35BA71D71B1C51190FE32 +873AB8EB64FA3AA7EFAC3BA3DF5D3AE4DCF5170CEB863D3077FF905F4AF13055 +F76C150A6DA1A7A80B798C4E21C6044F817F0408C1D3893381A08E11F9890A42 +62ACD1A61F9F640BD13D3282B432A711E5E624B0BCC771EA1B319843A7295172 +D661D1A062DB84408A21C82C781E02FDA05F68FF78C396C0C10C7CF0D3EA7537 +6667789370ED6CAC90369FF71A3E5C8BB7870C45DD0098C6EC30CD968E897D33 +C87971E6517FDCC32701809E27AD13C747AB20DF630C3480AB0F868FADA5EB45 +EEF2ABA20547B199F37C44AED38582FB94149BB53FDC70F12BFC4AE288A7F4B3 +DFC2626158715813F2E287513593D35A304D91687FF188861ACC64AA5F040969 +CB76B0877286DB69728CE7C2B0487452ABE3863DDB85202DF1773345B654FA37 +8A1CF611A24B493144EF62937F1F87B5B83ACD523DA63FABE1437AB535B99BDD +8C2A3494911E4EF4324313C420F0FB8A5B2B5B5C0FA33E5DF0AA3102EB802B7B +313475E5D27B0FDC37BF71136350056830B611B9DD6344616597806258120F65 +75BE0D46A6C5F8263F998EC717D42350A1873BA03EAD4C337BEAD1EE21FF6080 +97A298B6D92E9B8DA2AD5E688D99ECCF577CE1BDD15FFF28E125412C527EB327 +9723B500D3CED93AF7C930CA1B94FDF3A73F23553AA785E5D8525C605842EFC4 +DC427E47BC86A737B23FB2C9178FBF673E5403099A01F334F8E6926FFFF97685 +CA02478B0311E4F4F3519EA57B80 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMCSC10 +%!PS-AdobeFont-1.0: CMCSC10 003.002 +%%Title: CMCSC10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMCSC10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMCSC10 known{/CMCSC10 findfont dup/UniqueID known{dup +/UniqueID get 5087402 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMCSC10 def +/FontBBox {14 -250 1077 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMCSC10.) readonly def +/FullName (CMCSC10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 97 /a put +dup 99 /c put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 105 /i put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 115 /s put +dup 117 /u put +dup 120 /x put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BB89566A9BDEC70EB4F2 +048A6EB631F05C014D372103E37FC3FA317EBC9973565A638403DA02E48B7D31 +CFF6C241DC5CDB470561002FF46437C06EF93BC99352DF04393C661FFFBF4BA2 +0723ABD9B3E9CA9E63BA57EFDBAE684655CBBDBA15ADAE43E1A2C98A3CF060A3 +D16AF8FE3A49B50A24C20EEED716E49AF6013D4D38CD9CC41A91C17E4D04D79D +567E1EF49110AA9C34464E95D81A730ECEB2C9AF38FBA6B45E253288438B4CB3 +DC75B3A906D4357293BA41E59C35223A6C9CBD6FF5FC90C2D07CBB376C7320FF +435A6251822BFCBB612CE630EDF826C37E95F541C21B93FCE127591D5E38165E +2B58A34AAE37712BC58B63FFD70AB80F4F24612CFD2F1466BAAF3CA2BCB45148 +D0DEA0E9B8FBA4C4FF5B8B3CB02E461355051842BD1C94F41066B9B909DB83B1 +DCDCBEF7CD00A43E4C0B8191A29600CA197F0BA227FB8309BB539D2A620BAC70 +8A1AB2DFA51ADC9873B8E5582DCD3ED154E5D727D1665F99BD89883D69E6CC2F +DB3A57AEB612171A88E22F038461DE03FC357F771675E34E90D4D19B4B36891C +9D2333960400E97494F4FC4DBCE6A73C34A0409E433BBDC0AAAEBA7D3555066E +1CFBB4515C8B573C9B9DD12ED5B6ECEBE35AD0DDEA9DB004FC6CB540B5117B49 +59CABE5FD74C6F5B6482B42C20B5FF0467D1DBD7CED2CC651CA57852B6FBB402 +A6764DB342889132C911CAA713A7F2FDD8A5E849345D6C81025E02F5B8B682BA +90CC9B467FBC37362436EA6BF8EB62D784B01D5430147945BC09D1F49EE89F2E +3E2B8E6D439248A56F82F2E03EA5C7A922F2813BE6538A3A423BEBC55B345AFB +3B3C125306749E137C647D78028AE1FBF3E1A82C260132832A9668F454D39C41 +736717DED0A99F6B11F005F0E1D07FE84713AAB4C042FDC166AA146D7B5E9198 +E4F485BE5B135EA281FF1C1E616B5AAF02771F58C5840CB5A427FF9794F93E94 +17FD799C78AED1DC4810BCEF4C6C51D3C1504EA2C6F2B29805B7ECF97B5F637D +FE92E168CB9029E90404CB54FB312FC7AA8A9F2F524C03E61F03B1E31D4F061E +1677B39D5D30C9FD4673E1723F4AE3CCF38593AD6D7F61E9DF3C010E51F25085 +35D51105E1464BA146A78D7297D4D310AD91342A0BB942034A3EC0696B467367 +3E39D202D637E6B14D0EBCA6AD3CF22B07D4CA69C0FCBB6C93782B2F0DFC5AC1 +5D8A16CB5EDB671A0C1BA9D10F63CEAFCD0E06E42C730C8EF769CCFD57937245 +658F486036D37E8BDDE5670A212FB488A8753322A5B170C9662750AA958C0BBD +8E97D8239D2A08B30416504DEEC4E506013E037C91785C674F8A6A44E23FEE6F +CCC00CC5E4D355B0871FDB8ECD64F70EE32449BB5D6F84F8C8AA2D5B1A489BA9 +D7FF2DBAA8D0B84054E93D64D3E77850A3724824914A0F821EEC3D605DD851A7 +606936B8B9E24D6E932E16C448140FE94DD96C75AECB73850035ED9C04A1D93C +64B21E7D4657E030483EC5C3554AEF8BE4D0FE5B9743B875340B09E01273DAE8 +F256C50A1A8F2E0417440A8BB0173F59E11523E1CEF2593A4AC5AF2167627B00 +C5EA97D125EB8A4BD4C372877ABF10F5B7B149D73787E0834BFB3084E9508DF7 +072DD71637019599252059738D4D6BC57A9358E4B14F6AF9C4B31DB8E25C29B3 +7A15F9953BD73ACDE5F0445A5DC406BB4635FAE51C1D8202AE31730E6F355317 +1DC197DB0B6177307C60E5D38F4487363EE051B2E609A52BC4D45B14B6558B6B +5E1618748794B8340752CDBE7756C068975B559615D4CD5A97CE30BAA7B2B1A3 +2FEF2E055232B24FD8A21BECDE1B6A479A28EC80AE2CD16DB50B30B4A6CFCF06 +491C7CD5AC29FB964D4846415233947522676DEABDA0D9535F8507D33693930C +B4E4240A02B0CE7EA288516B8A6EF908D7F8BAF9012D052C6AC96D9F8F6ADB07 +8984F3559C5E7E3022A957982155FC9CD599C74E18328D3AB46F9DD15D1C4C3F +9B93ADB4489BA02CFCF57DE6270F3AD2F8597BE71786510EF08142F430EE5568 +4F9DDB792B7C46B6135E341DBBF062FBC50FABA80CD4A384157BAE57CBEA9781 +AA4416323265168AC097DE7E30A0D4750143A4FCE70A863A31876A8FA5327C3E +36E89589E363AA2B1A6E8B09F5AEB8FFFD0396067173465B6503383DE517A6EA +88C0FC08578398C2A721E5AEB29F4AC9BC990A50CD87BD35A11F9E81F68E7B85 +5E5B95A4F9A5D30379EF90D78E1E466DEF867BAEFC4F5ED2C762BFF099C1C2B3 +5E0DA1C2FB33BE1379413CDDB1EE6BB3A495331F72F2FAEB8152E8AD5FD334A8 +AAB0082A71D5574B618EA8D487B8FAF1B445F3395B1E21224F5492A0E06F5152 +7726835C900E2E52BE3B7B654183AEDEC68053DD0AF19EF6DBC10B6FC08EC7D0 +CC0E2C8FAF8C9A4C21FB7C34E074BBA4EE64226BEC8C928A784C1BEE35B72EC8 +E9295240B29DDC2539CD118BAC38DB3917D14CD33AB45FE47E827F2A2B193AFF +53C5396C52CEA4F43F06AC2D08C74CC85D608CBA267175EC31311EE25AB48DD9 +FE811B411AE426C9FC0B6044D1EBF130231623F1566CEA4D1C06D8032FD9808A +94479C842BC41B675CF6B90113BD681F8D43F51D5016D80EDC11D7640FB950D4 +E709A46184406ED90D0892A4CD9062938A8205697A200DBE1F38EB166EFEA0EC +4FCB45CDAF82EA103DD6FDD03D146F3E42EDA6496064DB3F4FC1C5280C9E604B +D5EBCA08BF2AAC90156C11EF68137DC76502EBF216F3AF3EE30DD2676D218428 +F41C655093F8B530FCA378B5769F262A6FDB4B66B83F18F050E77227E28D71F4 +5F4425CB8D51B3DAE872CD86D7804F870BC564A6DA1CA13EDB00D131CE4F6460 +7021661B99612629DCC20C85CF155EDC5111E015A77B0B82A8FC1EBB374B7EF2 +361419BA93B857D5C9944BB5B4AEDD86ABCC261542077FE09701C96370168579 +5F89D5AAA08D700E2643E88C2FB8D1D56D37AAA9744872E7C050B4CE046B47A7 +83F224FA9FD311C955EFBF173042C8FC66524135F579B1397828870D5C9DC71F +8615FADE2A1CFAEA90F732B6C266E2F3048FC43EDA7A6B6D98E9DB793CF457B3 +F5877E7A055C92B0246FEA8C72B3B3456F93BF36E2651D32CD614C3AECC0B4BC +F824C8363E593A6458D37408FC5B09883B280005DD24123E2D4B1B85F4113327 +EEDD9186A4AF2CD6439B46C5C168C125CA80F9EE9E68906620EE126CFBF26E15 +B269838A54224EDCFE2A373EB750D4829BFA410DE5F1541E428BB1E024AF496D +F5F1C151F5A645C8622F2EF9088D57A2811868A8A8BFCDBFCE3ACB8463AC35B4 +8B6F44E1C1232805842F56FA468F81FF37D5D55B81CA56058558544C142EB3BE +07CFB1F75DECB1E48C14D6AFDD455989AA6FFE8B8DC54F462B3C20E31D270BCE +8E68E2B43A6625AC7E9792704FAAD6CE8BBE0B341DA7189EBB3E9D5375B27FD4 +12506D5BCA50AEDC6955E6C3C7BAA84BACAF7ABDF3A270C7734EC3C6EC22793B +E67B0E288F99699D38DA8B79F2D21DD97945FBDDD132A8F0BF947950D3C0B4AA +EB7B2C435AFE54489E1930610311D718AC610C21A644F34CB2D1959B3066F39B +EADEAB5CFC6AF4D191D86B02402B00D1C5262707861C5308730579795EB53207 +A291A27A8B5C4DAE0A87A0C6A260026CA3CB620E1002E066A515D7990F3DEA29 +0FAC962E0B82B7A6C86B1EDC54007822BAECED673FAAEF88C8109777EB79A53F +AF3C58546974F2F56E70E9B5CB59ACB5C27CB01895557B2D82134D7F02029B24 +3331621F38E68717F5CB68A8892D0B9C0A8ED4F8BB56E80505170D44C6856128 +2DED0254ADA4875CF56B4D97372AAE730D4C77A2940DC8C178274DF88A9EE037 +215C6FE7B9D481EE4DE809B124C0270782411ACCCF89906A8B143D0BA8B2CEDE +E9B90465C3E57A4FD9AD2702323450256ABD09A1F8C26F08480317C08B75B720 +70A161C99715A35A94DD5C9647ED0F8A5337B774C8E54F9653AC859485A1FED5 +37B725A7E4BA58711CBCDA6054E34CBD8E9F9460179DA7DBD243D81A1531FDDE +BF2BD425BD9DBE75EAA333B1F5793669A215549A774597E6ADA16D323FE5601A +EDA41092730009A99BF5B5AAE281844A6BF3292D4D4EDE36B4FD8BCAEB6EB72F +AC5D3CD53D0D621CA9EA8D254FDCB2B5161EE9E80B266563F669805A3A15271A +0753983004A1ECC7FBADF62AFEA4DAB49A178C231759857DB910668BDB07CB3F +7E8EC24901863088B3231EE3FA563924032C91CA9D68DB398F9BD9AC0C651EC8 +9051C9F709CD784F3FF5951DECD7E869ACC34B83AECDB011E6594347855EE7F5 +28811F744A4BD70D4E9077EA7EC19FFCF612689F12B34332857AE41F13E6D16A +962DB9B6AAAC167B9FBDF0068EA13412F318384134B29F3F0C399F1973A3564E +F9C3C39B5BDD4C98D81A6CB476E565860B50704BD65ABD630A5F1372F2D826F3 +3AD47C08B8AD3176A170C369EF3CEEB190134006D6135C5B8CCDBE1C11FFF1EC +3F6D8C46E15C4F5EB9ED9F31A129594D542D40DC3815CD075A0DBB648D868AF5 +15A05C4BDB28BF23653A3AD96CF6AFC065DCCCB23D5D9A945F8CBB539DD3BFA8 +DB8F1FBF9B6F25B41EB4309995CA3D5D6ABD70CBB4A2F0C6364E5439AD1045FF +72F6B45A30BD3A548CFAADDCC6C15D46F6D783D3E520215751DC98335A4ED512 +D7D19235CDF911CC69F3CF4365B678EBF3E87C456A4E77339C74930083445588 +462529C22A96A28C5CE87AFA0C981F26CAED5A1C8DBCDDA612624DBE0373F026 +465185A4D8C73CCD8D71EE97116F8F7D341B87FD78F9CCB9FBDA2A7799711607 +6BBA855AE9D5C505870DC85FDFAAA130A351D56AADBFBD6A7D52055E3200F8B7 +8AE9A00092B55DEA8BDE224B4BA7FD4A191CB1FFC4CB995FEE1AC2883AB69E1A +AFFC09AB5B9AE311A030A5BA05E2213F9BBF016C8FA80689C069314D91274B20 +53FCC65C7D7B3A7504887525BFFA060304931672A078BCD7F269595686310E34 +E1ECA868899BC402D17EC36CE40D5041D7CEDA77F7764C9D98793F5334F574DF +E93CB10A5E8ADAE95CE63D2339557091B4B4911A4987CF21B7F1DBADBC2DD605 +8EB72473C1F2EABCC44E0D0339EECB55DA74085606C3F89D57ACFBF5755A5395 +CA8D4BD47E4EE8D8B882D3AB31A1F0C62E74654C7E041E4FF2693A38A9796064 +46526B0A37E6B5BF8E48E80EDEF81E34DA8F6CC9025936A4D0E6D709D61B7B5C +AB550397117F3F9D2F5A542A64DEA8E1178F7337124D6B56BA92F659AAD694D7 +391028731E01284BFEA635314A8DA8DF7A34EA3B6B2F8803BE6DCB423A9E8015 +55EBD90EBAE8A00298B3B6B1C02BA516AF528122C1F2B07EF69F5466C2C36643 +0D665D6561705509B7582D8301AF3C32E2F3B9433E3E04D62117C7E8A368BDE1 +0D4DAA1C415B2A6573116D2A169AFEF700A83F55D88813585E89C94C07802BA8 +3AE8F9BC3CDBFD9C2E35D062B1FD6E79E1EF104FC70B0AB09D12CA027F33F85A +22F0ECBB4AD55FE8C616B82C46CE69A600E4F767BD7A9C5F9B37A3196B038384 +5DEF76A8884425FE598A63AEB19FA698C2AF7CAA4983CEC789268E22BA051EE0 +20A40633D22D8F707626ED30E8273EAAD1C065F0B2E1718B5AC853ABE09330C3 +B0082A71D557169BC1559B6D285A3499D41C4CCF1F74884EC3917EB9C574371E +AFE8578DDCA459B8D22C0188A8D150437B05FB92022C95EB6FBCC954216B5FED +CBC7C90B9A1F061376A9840FB64390A6BA99CFC8279A86A730C6DBFD14C53C4B +7277D676BD42203677E9ABEEC8C97E13DAA626474513B06F8734DD784F2FBBB9 +B3B448B8E8221E380AB4A86D3A683B86A54129519D50DD4FE63B30954D805CED +A9A5D9A39C58B65B08E1C19555E927C6DBF7FD07252B2B57F62B905D6B488201 +213D106A41033B26FFBAC2E616DA6ADA6D560BADF10E68872806CFD6F6E19D7B +57CF1F7A030A7BAD374F16A977E0ECB8742D034ADAF9C247DA19C8AEA74EF6CE +DAFD6B1DC562FD3B77E4D008BDE4D8C7FCA9895DA1AC9EAA01C32A0DA712B082 +9438E77230D38FC4153E1711417B918BA6CC03203A5FF082AF880F48518D8271 +C1121E4F1386B30A7F1BC6F10EA98443F8A65C867A109336B808BC9A8E2A75AC +F950835AA84B56F59DA4C8A18859C3B68F6B6DE09A6675F639EA9107BDB67B0F +54EBC564BC2D781B61C14363A54956BA78A2BB89C9F966C94EEFC29EE9F4E23E +C0BF750144DC289F0DEE1F8A25BB52E54F656FAFEE4BD2DA57E1306BBE648051 +1D0CFD6A23A3DF082E3CF13197BF1B7FB22B2CD427BB78F455C9634DF989DC90 +7BB2AE247B1C99AB2062855B2948341B0F857ACD750B59E370A6698C6A1F5287 +72A4A9628A592E313956C242DF8277EDD2F1FDFB07CDC104275FFBF796D7518A +DF49FF3CDEC3BDFF1D290C382F244DF18005ECDABF0C5C2C64EEC4383E2E07DC +5C82587C071E59B46B7BEF31D268F39D9B12D534344FBA515E9DE8F166FAD1E2 +7D1558967AAAD3829D3F7EC6938D20E5379F414532976ABA844D97A5E9078901 +EAE4D0ED1F4C7EE7A2D80D891A5013D6409A38ACFA497F5A169EB7F9F4890DC4 +62FA6A89EA48267331F086992B9CA9305E16611E6AEE67DCDD588A25D37F45B1 +0DE75C802EE021E574B64B3969DE2E5061ED9364B646C38D4BBA86802CA6338A +94E135D2256920EBFB1AA22D9E90C7D16853F0DF9F2D942748EE540E4FCE63C6 +5380D7AB4ADD6CB00FE8F7867E4862D8DB432F28331428CC350CDF7F447A65ED +D7683ECA35A22ADD06E9FE6BAF060913AEEE7B2B8EE4798E437698CC9EB2428E +74CE73F84D0D2292DE709D71FFF8901C3505370E6F1D4E28E6B7372492C65A88 +159371B1D60D77CEC93B272B6C5394EE1D2EF9969DB2838B8E128553879A1BA5 +2884B0A596E8FC3D1E648B7E26A4AC57DF09B9CE09B2F91D8CA618CA52AB3DBD +D005A56A420366069B73146A6F58E88BA49671A1AB7C2070C3D42AA770285143 +40AE7D7868C0E1993506B07C086AD7D4F28CE2D15853FC5FBCBF9425D8012B9E +DB6E1E5002517659C8DA69DCEACA94F368537668843D281FC11782F1C5F71977 +CA215349EE6F20565DE3D8D8212A40E1227A4B22965FA64A0B02C62BFDE97E6F +C3C54FED4057EF9D258C42D7440C78C5E0CC58A40DD74ECED4152F70A93CE71A +1B3A57C46F74A6D27BF98C97CCD31A8EA487260F224A3E40F52C65490AB4098A +7B9EEB54A5A415C8C88568F7D9EFE74BBB785FA18AA27D9201F28BBC477A20A5 +D1307AA78EB8C7CAD409AB64B29E4115E45F5FADDCC80CA74B296C4265A40614 +37F2ACD8386AC0202D6FDB6711E8CB06442F209D781E940ADDD6D881D4F8E874 +357C533115923B90138FFE31D3577C6AAE60D768970FAAB682CD0DCA3E9A9A68 +6393E4B772691C1013ADFFC90C508D51B02D2518ADCC7E79F7DE5DF9D18B8435 +6129064DD1A3995E5A6F45D78287CC10A0EAFBF47223494C5EA934B1BC2F7C53 +686C5880303F9E3ADC8B100D441D944686E1FD811C646C6DD0224F6CF55FA87F +D132EF50450879A25242A18683BD6D0266F8F333F3768D1952B0F32AA75106D8 +EC0AB703F287E847CB91FFB88CD9DA174B49171822BDE34621CF41EA772230A6 +3088F8D19CF2364A329162D39E166AC728B267758341630B00398D64538FCC4D +E3E6CF103794C29AEF7F7E56970F6B1ABA87DC8D23E280EDC77556593D02DFF3 +154883CFE4EF04E07E7539A4750FA1CF1A994E99B656E728D140C83AE1F196AD +9F049188A4184C84556C0476BE46DDA8ED86888DDA3065C5091D99EEEAC43092 +40B97AE327215024ACC0134CBE91FD761C26A48EDFF9028DA28222985FAED7B6 +A1CC891D07185666E34BEFBBF77C6C32B88FF3F1046E4EB2CD942E70746DDCDE +002E74BA03A2B15E0529E61DCAC207A71F61C89D81B3C53C5B458EAC70ADFC54 +810310CB04E1A21FFBC5DE2429EC0989A3F2B6AE4290A005FBE736750956765D +637B7CABF7F9A593D9FF6C322895835C0007A78771D1404671122F9CF898AB24 +1A5648EF8C40B27FD537612C4CBC6E584FBD058DBD4F0A00C63A79077826D3F1 +859589B221F7F82DBE392601B0A89142648EB40BCD943E382FC7758A10F978FF +6DD9C3C1D284C5642C812DBF29A75A50BF63F788CBEA5883DC1544ABB49289EE +2C99CB03C1BA72C7320904C7EC94736825A793D5629EABFCEFAB8D28B6F23858 +89A6967942A943FAB5E5B26B8567CC9606DE60329C6D890843F700FC1F60656A +38164ED7976AD47A8E54940B9E340D61353AAD260C9273D45772AEC8E9F4F045 +9CC576D152757AF3B74DFB9B6962001EA9FF7F62C2E36F71D9B76BB99DA7631F +774795B8CD1E08480153496DE5E08A1F4BEA681D0C1D6336A49A222B0537ABD9 +75A3A9D27D0B71B8913E9355F8E56C5FB3E14B9D5ACC4F87339FF9D9039ADEEC +660B5CEF75E7C1772D4A3A4D0C8976A165766D9DBD0CA8132D17E5149AE716A9 +2E255277FB5294A96194C462C74AAB251A36941768EDB3EC6DC2C481393ABA6C +8BC2F3AB0BF5A6E5619BE16DF43BB099C6CEA5044ABACC419174664232E97B29 +ED32362D219AF109E5D8CA751EB1F9F31BDD08C93AE018E5269AC327FEC67D99 +588CA80F068AEB94A7B943BAD5EC8D89C0B8D153B4345E77A5AD9B4522208A33 +DA92CDF765B44123C6EBAA06D629EB9E8D0FDD29BFD60EB582CB369474767FE4 +C0947F27DCFE0C8BD3CF5131E706E02ED136DBCE6363CB5CA637E08C3D832037 +5AAA88B746B6D915EE72D7B458C55598DA6284F362D2DBF06C51DB50A9FFFB5E +EBFD69D8D06AB0A6DF2D03F6E14FF290B1A1531109E43892B82B29395910021F +A6EA74B8420A14FC189741ECF67F81686BD3C5559DAF75DF9FEF3346CCC35AC5 +37A1E30C2602945974A2359EE3183A1AA568978F7732C35BE2B9224C27161748 +515E5899B0387F0640DE1D712F390A8A026FC5C5A893E98F46B418B7B32BEF07 +AD0EEA87737D929180B2BE697D0DFD46CF307E4FF76BC03492E66633F1357848 +AA5A594EB8CC5913E76602C9CF8B7428F67965D5BAAA29BD6C978EF6B22B0BEF +4203B223443554971EFE558FD2F51D01B35D2194A1F6820293385CF12DC1ED73 +79EA6082A30796D5EB72A67C5DB42A01F18CCBFEBE2F10B091C43C2CBACD8914 +D665B340281C1EBF92249FBDAA577CB7769974B669DA0B74E822EE5DCF3A32D8 +9C6714D8C82CE9BF3F16E6336094BC55381E73A96D45B7A70AE00F9CB8348E08 +2A64E4B40B3BD0A653B423C5D3C1ECB62F5E05393FB8C9B0C44AB26F6BF796BF +5B51601913014ED708B97731A5642351ECD0F6CA9C06832E0BCD0055E9BA51CB +7242CD34AF0B75F3594AF9235C42B974074665C5B6C934B08E5C7F55638E7DB5 +312BC541A8000E69A92ED6C63AA6485A50DFAA1DCF9B0DDAD23C43DF22F3000C +0CBF6F8F64F37BDF8F8DF321FD8F42C3FF774A388F9C033572B177A493814ECC +BE19595AD285F11763857603EAE0D6AED509225CACBC49351E6BF1457BD11490 +EDA1C3DD6DE8C7036464CF80FE562CDA51ED2EB92BBC79252FA79EAFE5E6BD4F +DC16AB83B2C902A9027BA4AE30ABADFF6D513BEA850FF35416E76FE62D8E88DC +69F0C60921B33BA59FA3EDC8F532B47FF2A5E5680BEFCDAEA4474DFA2F8FD68F +74B5837A22984A7534A5321B83459E436AE4C498702EA14A77D3F78DAEA47BA0 +1BE6CFAD95132683BCE0601F3EDDEFF5207FD5FF3CC9093ABD946CC7C1076DB9 +4DAF08C682269CEE980159541D92FFE484B7440E5AC58D7707BAE579605D1EB6 +42C396807AA13B3ACEDBF3A465CBD56F076FA9319E43907B6522904F92483537 +6102700CEAA52EE916B80AA4C5F8C98C9AC9557F97784F075D37A83649D632F5 +82A519507162012A671F3B4DBAC454D920606E9C87CADCAA1172A04E445A28A7 +0FA9545E5FFD15302664B5C2C4F479C8C760C2A015F5F5CB51EC6C0260154D37 +4A65B01E58B458ED0FEBBE74884C9DF7D50770153FB498E94F65475A5EA6A687 +543DEA3156D3E5CEE23923120DF4D561D2C082F1F3BFC5039A1DFC1C9C3A328E +6F879AB979F2C177FBA357FD63F8CC21E8AF632D6B01A3AC3EA7DE91C17B8120 +42E78A1AA2E04581B1C434A8147DBE81A87C73782DAF4BD5F309280FEA22DBAF +586AF386182364E45D7DEAFFA74E338E875B64B13CFC909B30E074D777D347ED +3A58A82D5F6A6E913054F9FABFDD9ABD8BBF54DC3480F3A90965A0081092714B +D77604CC7275050DBCCC800BCD8E2BA540B18CB07AF27D66F8887A571685600F +3FF8C7A4966A8CF8CB25DE0495CD4E048999ECE6579AFA82D1644FE160E2D3F0 +EE7CE89045332B172425D7D1443E8DD9043A12042ADD7EC106CB4DAAEAB310E5 +85F93869A1C519DC0E3CF8F4C05030F0BF7054C5859A74ECE7D6FC5644C5B84A +F3EDF0C4B2DCDD0D193599CB3CA00464A90AB55674F884001EC896726A9B374B +3A73AECDCBE06895E87FCE6267091C6CED0E779DEC36D8CC35184E00247AB90C +37161FFEE7CABFD7499859042093BCAE22D6B811FD16EFBC8AAE6283881C12CA +98E0792640063169F76B18EF543AFE7951E82EDB1DB9597F2F9C959B69943379 +CC7F5BDBD1BAFF7C77AD8D504D5F17E1B7DFFC515AC237748D33FB6B9D7DD903 +2F3E9768290A90A5FC5EA516A94C1885B17676D33CE4124CED1359E473305B02 +03C28731C0FC52B18FC14360C9494FF2A86AEE929E4022ACB78C02ADD6174FD0 +D35105BB00643F6560A9CCBB3E5CE2F79F0EB9BA774D27DC476867C991598380 +F77CC0444500CF43DAB8D729B31EA5A3184F178F82622A8B711A9CA6A770971C +521C44969E814B44D8E1927C283E6A38B78D7C258630730EA463FEEEAB263838 +2A517BA176D1C137AAE7430532FFB0FFCA8BF110DECB42B1A7A9457A9ECCABFA +D6CC11CD925518857AAA8498CEF35377CF92FEA77C09E6AE25DB2D09F1E355BD +7F7F5C72A76315F3C2B6BEA1AF7BA5D0E8000778A0FB2C60FF677ADBA9156A11 +A5B0B7AE92DB368571C040FD7A29C3DF384CCC29A0E9F40FA385630D23AC1E97 +C15C06848761CC7D19D208BC115A6A2933056BCEB3717CE2488E86D0B0D6D276 +22B2FF1E77FA719372BE62A5B6E10D3DFCA57DE70AE16C57718B86C58B6A7F3D +C6DD45D7559F9A0ED8889E707FE7622997F2D573F7688621245E0FB3D34A08C6 +40B72F4BDA0394CBF90735B9E6B3928AD56F50FEF9A5DA8B195008164EC03424 +7F5317FB8157C33F6903FD6D4B4728F82F1B02046DA16F4285DF088E08A136FD +1366494E3F5AEBED4B48B3B9072BC811A700940FF4B2A51C0434ABF225B37BBF +E4AB11F394332D66393420D4B843CAB6AAD9C32418CFE6A2A1260BF430E61176 +4B1762E3C9F1727BA47AAE4C7589E7099A56F5E1CB6BD64C0C8D026ED60EAFBC +BAD1476E98F5F12ED94BDB1E4B0D8FE9E36CF40DA6F5B2E1BC41EF5F7CB49825 +EA5058FF7C49C5FA11F9F9F575AB4D8237FFC2573F94B695CBE9BC44A1BB26DD +C6E55627BA16E5197CADA519CC7302DBE77F1FE4CF68C558D8F6E264 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.0: CMMI10 003.002 +%%Title: CMMI10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup +/UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMMI10 def +/FontBBox {-32 -250 1048 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2 +1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C +7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B +0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085 +EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37 +404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133 +78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF +A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE +88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4 +C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC +BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88 +98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760 +E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44 +143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3 +981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490 +88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285 +4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683 +FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F +347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F +FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB +C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04 +B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733 +F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA +29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66 +36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12 +048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0 +80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C +9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B +75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E +4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC +74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B +D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355 +E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097 +EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D +543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883 +710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6 +EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F +7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93 +03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2 +01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89 +500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F +F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208 +AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE +1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915 +85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C +4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1 +6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F +55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18 +085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02 +BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951 +2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D +CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E +BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E +D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1 +991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125 +6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754 +E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80 +E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1 +B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3 +4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65 +1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB +B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7 +8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA +FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6 +AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E +BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051 +E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD +38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3 +7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751 +2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27 +DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D +22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6 +8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB +44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90 +D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A +42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF +C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E +0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE +66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6 +E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1 +6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E +1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10 +B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B +897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E +EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40 +A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3 +F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA +A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126 +2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6 +51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3 +598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F +87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE +178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6 +4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78 +7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6 +AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6 +3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379 +337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547 +C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5 +DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA +7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD +6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC +98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355 +821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4 +C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886 +7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6 +B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16 +A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325 +23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF +C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3 +969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10 +3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B +9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725 +1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239 +B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966 +95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7 +FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE +44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986 +FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4 +E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA +633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D +6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F +FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD +375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2 +6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7 +EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C +E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D +F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156 +DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891 +D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538 +D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4 +9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B +9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6 +B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0 +D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF +8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93 +FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26 +B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F +00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50 +909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49 +5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF +7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA +BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0 +C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1 +BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37 +BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D +4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075 +94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1 +F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9 +E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA +92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0 +63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A +CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271 +B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9 +5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E +86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0 +AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180 +3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC +35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD +155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580 +AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255 +E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F +226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496 +9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B +8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B +919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE +A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7 +9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0 +523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7 +88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D +2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF +AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66 +B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D916672480464F7E22 +CA6E431FE38D3FC019BDD229E064B72C545C61C6EA55984565CCA88ACB01F744 +3B4593CC8944C70F30925FB48A16342CC26D444F54CA15E5A624C4A2DAA2AEF8 +404145BBA339F2A2D6FC2F3ECE54387761CA1213C8D56FF96E37C6147CA44B84 +262EA87E7CC10D931E6B5B80D7F09813498497AA84ACB4AC69BC6C8481ED2953 +084F560D7B1CF90555E69BD2AF7C5D944E8E3506165014652462BE1BC81CA341 +E1B0725159D36DA0FFF3577D1DEBC5D91AE683FB0384 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMMI12 +%!PS-AdobeFont-1.0: CMMI12 003.002 +%%Title: CMMI12 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI12. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup +/UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMMI12 def +/FontBBox {-31 -250 1026 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI12.) readonly def +/FullName (CMMI12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE +882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3 +2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A +7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541 +0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69 +987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7 +609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC +182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A +CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A +1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE +C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D +3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6 +D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E +E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200 +761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24 +8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F +68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D +10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4 +262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6 +922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16 +56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26 +32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA +7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460 +7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A +46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD +754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF +88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F +CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A +7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760 +8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0 +BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B +CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25 +8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B +D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300 +135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A +C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812 +1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86 +07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39 +14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D +7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D +2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D +639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3 +D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F +90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948 +10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E +1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E +8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC +D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9 +1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33 +9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875 +EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE +DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3 +60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8 +FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D +203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608 +FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09 +DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F +2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D +244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077 +31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B +724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8 +F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7 +D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA +AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907 +CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF +01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D +CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA +287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605 +8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9 +9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1 +6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5 +7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C +192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA +AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4 +A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9 +50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67 +A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912 +3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF +CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6 +5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96 +8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE +084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7 +92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2 +AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27 +97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF +92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5 +7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824 +5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199 +13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76 +6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1 +5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5 +6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83 +F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E +A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4 +7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A +9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817 +E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962 +AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD +F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8 +0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003 +1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31 +7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E +38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8 +5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F +3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B +B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85 +15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B +AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674 +6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6 +CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322 +EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82 +A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D +806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4 +461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1 +4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361 +9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C +172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6 +69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E +ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690 +356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0 +E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78 +7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C +B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A +31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF +EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7 +98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30 +C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61 +AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208 +E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900 +76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40 +8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573 +CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7 +761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A +2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138 +89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60 +D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF +C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485 +D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8 +B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39 +AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F +D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3 +866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD +207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73 +756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7 +60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD +A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A +1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4 +A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048 +C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3 +03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321 +1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B +97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE +D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8 +4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF +94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97 +201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7 +9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000 +CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7 +29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939 +4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED +66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31 +14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53 +84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74 +6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12 +49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C +224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5 +5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4 +A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498 +1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D +5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6 +40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C +E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B +C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FA96583CF3F1519CD +CF08806F40ACD7BB5C960F21E9DA7FB3C72CBA0801ADE83DF738A4EC94F2977D +2B95A166BA4AE28CAD1E37FBBF49D342CDB4DF615E2C5F3076313AC517C350DE +710F5D52DE31DF69864D29DABF14234DF13904BA4333B0D714EEA55CDD79DE45 +FF5D64259C877191547076B1C7684CD252C0337BD9DF66CDC5DBAA4F3102F2E8 +FE48385C55727B80D11F3BE0B7568AA9356FB2B180A6B1392D620DED02F0B736 +5F4399FB9D32DFBC8ED942AD311C82250DA8BFE98D65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.0: CMSY10 003.002 +%%Title: CMSY10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSY10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup +/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSY10 def +/FontBBox {-29 -960 1116 775 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 13 /circlecopyrt put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 +7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 +DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 +511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 +1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD +028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 +1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 +3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 +91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 +E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A +11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 +C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 +D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 +B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 +93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F +10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D +7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF +B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B +491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB +F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 +019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 +915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 +356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 +5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D +9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 +3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 +FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 +720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 +D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 +BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 +7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 +DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 +AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 +A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E +0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 +AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 +CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 +0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD +5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B +5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F +E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB +54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 +E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F +A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 +4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 +4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 +038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 +B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 +5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC +B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 +A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD +2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D +CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 +455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE +FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 +16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C +16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F +483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 +67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 +3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 +1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 +93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA +051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B +8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 +8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 +6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 +06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 +84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 +D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 +DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB +0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD +8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC +C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 +754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 +1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 +CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 +1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F +153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 +905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 +617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 +8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A +98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 +53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B +888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D +052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A +CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 +A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F +07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 +B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 +10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 +CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D +3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 +D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F +849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 +648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE +84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA +2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD +2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 +9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 +B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B +D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 +135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE +EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 +C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 +7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 +4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 +9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 +050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 +3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 +C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 +843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 +CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B +B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 +3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 +19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 +FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 +17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 +8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B +CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 +F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 +1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E +4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 +2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 +9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 +E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB +8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB +BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 +04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 +C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 +ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C +4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 +84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 +C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 +09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 +D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 +56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF +035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB +FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 +CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 +B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A +F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD +CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B +0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C +B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 +33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 +4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D +F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E +2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A +CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 +88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 +17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 +55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A +A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 +2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 +406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 +AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B +60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 +C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 +5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 +822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E +94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 +D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA +343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE +894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 +DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 +DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F +8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 +A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA +DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 +E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 +DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC +4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 +5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 +02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 +88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A +60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E +71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52 +9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016 +A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44 +AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829 +F1795501020D5FF0AD25584C1D47BE08ED6CE96278050BA67680A3B973613647 +A93FAEC756FC253B3693FA2D6491B276EF45751EFB306961788E7C15297A5822 +AFC5A2DABD0DBBFF0BE135267EA6B9D1B4E4760ED14895FFE1F8C3F564830001 +EFA901B8442BD2D98561BAB9A0FD939E0F856E4D2EB04A9A4496704109B8A84C +EA06AB0999427B3B1BE776004AE906D0F22159C051D88CF573A0255D99B56781 +CF326CD11919AA40B096769CD6D0ADF3ACEC7957621084ACF21AF1F265416628 +86B67FCBDE9370D4F5C6F5CC67EBB0A2727E074090DBCA459AFA1A4778AED4C9 +AE5400775223E684BFCB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMTT10 +%!PS-AdobeFont-1.0: CMTT10 003.002 +%%Title: CMTT10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMTT10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup +/UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMTT10 def +/FontBBox {-4 -233 537 696 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT10.) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 36 /dollar put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 53 /five put +dup 55 /seven put +dup 56 /eight put +dup 58 /colon put +dup 59 /semicolon put +dup 60 /less put +dup 61 /equal put +dup 62 /greater put +dup 63 /question put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 89 /Y put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 95 /underscore put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /braceleft put +dup 125 /braceright put +dup 126 /asciitilde put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3 +7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260 +6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89 +14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0 +0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397 +3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4 +BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F +D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0 +FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB +556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F +8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E +F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB +B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673 +125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787 +A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77 +4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC +56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178 +E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F +15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385 +2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9 +05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390 +6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD +04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728 +C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4 +70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA +4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A +A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473 +62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364 +240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D +69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2 +ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84 +121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4 +0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB +D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A +0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157 +D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C +550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844 +CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A +9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4 +FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F +7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06 +E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6 +50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A +2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05 +9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2 +44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE +49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9 +385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091 +8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011 +6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C +EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0 +E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB +C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE +484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29 +4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0 +0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C +6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F +5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C +1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3 +909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8 +BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506 +CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0 +2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0 +CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08 +EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811 +0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6 +9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A +D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4 +21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0 +7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F +52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A +FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD +AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7 +F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429 +067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E +E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431 +C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937 +5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B +0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD +CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC +2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD +E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714 +56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957 +F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F +E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F +0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D +67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046 +EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7 +CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8 +9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5 +9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0 +C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861 +327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203 +F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC +60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD +A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4 +B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5 +0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F +1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1 +DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D +55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C +7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E +75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5 +E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149 +8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E +F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB +8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F +D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914 +54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0 +49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9 +CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0 +34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276 +1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA +6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A +DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4 +E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD +4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD +2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC +ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934 +3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE +97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C +FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570 +A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF +639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4 +D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615 +E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2 +1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E +A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3 +F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780 +5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5 +4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50 +664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844 +4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8 +35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04 +1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6 +01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A +5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82 +2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0 +DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C +BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507 +39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1 +C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665 +99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481 +7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE +D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8 +6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184 +5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38 +6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B +F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81 +E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9 +39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81 +7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5 +ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77 +6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882 +2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230 +1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41 +06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE +5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A +288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E +7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F +759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF +E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E +03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A +6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859 +314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266 +74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D +906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36 +673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E +A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901 +931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B +CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390 +E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1 +4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136 +2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE +F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B +E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE +E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE +251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71 +7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6 +46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C +E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33 +DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A27D3813 +F871C07E725D4518013D9A84CEC96782541E5580E33C2EBCDB18F08EB4655A46 +507A8526DB26C854928B81FD502B0CCE4A68943C12078F57C10F4E85FBEE1025 +46D925B8B3B447D4920410FEEB9844FABE985F9228FDD9F58392F2F3BD650E49 +2E3AD5A14984874DF4572816931885CE8A448EC95BBF40DDF4F85653AD90A88C +C4A879C0C7596E61997B972E8A55E57B17F802C738E5C7A8FBF6424F8B131B23 +CEE3EA3747DB066246C250EAD335A76FA166ABF75120CECB59076AB31A51F176 +57176CBE8C802A97B0542A5CFD6D5E6D7EC848B923012E45D9F065BFFA0D03E6 +788B68BA4DE51DA37994948F859D41C28BA939C3A82BFDB44DA585AE80B8CD7B +A6EEA79B70BFB4864E06F06A9751BD2D2A209D150D7135E0A25D67263EDD2A7C +C63B5B76ADB05A2BF747D5699036377F1A645372E5CF6497D8D4465492780B56 +0D7A64F4AACF00DD611A0D4AA2A1B4ABBCE41B0BF87A7351F26E125166E2E07E +2E64639C4DC21B996EB744C784A145F80D07676331178ECAA4967195803AE02D +1A6A04B38D721323251A1B1F656498F5FF255E4F1632DEE1A8C2B197CD7BD5FE +3819B1998273EA5EF8EE032E0638F6DCE419852021D098A19CBA9A2B675BEDDA +B6513BFA1F239FFC92CEC9ECC612072E87FBEF1ABEDF6804E605AC8979E970E1 +3EB524894E3949BF090C1BB477C45FC0054DFB6B6816C5B0312BB9FA09EA87A0 +9A18B9B5E0DA687BAB199267EC6668094D1FA853632DE7124CEAB78BC994D6BF +FD8BB4B920B89A68DC0D60BB73AFED84D38925B4E8C4D4E239080FB47F44979B +7660A9C57F1CBCE1AD69AE3E7782796EE69BC910251DF8406ACF78CDED5224AA +B13F1E17BB454BD4B5AAAF0143570E5FB2236DD096A2607B8D24EE238110486A +0759B4AA276E3B5AE6BCCD2299EF7EC5C0ADB9E3A838DF0A0541FC56F62684E2 +F165BDE1EEC719A7DD44D7251B0D28C63304BA3758C76B1FACD54A4E73C9B32E +A49366083906EF8927B6463215012B3927CB643C0292688601AF2348D62292CD +5E20110FDD05739D7EC6A3BD1B166DCC421ABA7901FB926025EF88A54B0E695C +38E9C894A2EF7F33E5D0304268849FC3D2F972148ED6C631EA375D67DEA1F8C3 +C44173E5FAD943C81B72D818D7202AB20B77EA0299D4FF7FBCFCD7BDB0C9655A +B02646E5BA32F6A7033BEA306BE69EDF532347B24DC7E6BA226C6005EBF841E4 +16430F8B4405B2ED05003F10080C12CC74EB07708FDBADB821BFE0DE6C8A3278 +C2349EB88B977D15639695B35C35235E00862E70D7E9BF6632E0F2E342FCEE2F +16880A993EA9BF5FE7C0220D844C5920A5428CD87225C7FF28FDCD4FB898A052 +A0B1A3CFAB8A066ABF646D25C4A9B9B7E940CC8A46D56B1235EE247C868B3040 +A83D4392DA442669E8524ED46DFAE1514F44EE67F9147F0A8ABD317CAE4BC719 +0E0E2655654FC2DF6240564952A26549517E0B48C2500F5F052CEC01B7D39950 +109BD5E58C7C0EEDCBC27CBFECE20B9291E85CC2E80A8D41D1603838C789F254 +30E5E1A7B589FD23566A12D027B5BB21A3A0D9D40CEDFD850FADBE1B12A00F10 +7E3B1011AA803A608FF37988C7DE6AC1E955C04C1D1D08ED95F1C0520F069B4A +53082ACE33BDC0E2A514CB5EE0ED77A861F64C9FB4E23586A6B2ADC96B4D71A8 +CDCAF63D2BBD0D8D935025944BF6B17546BAC8DC48A5ADABC729BE68EE00509E +B084990A2BC6178A994455F9286937DAC6EEE7583FC13EA26F504E6E66142EF7 +09DD59E6A9FCA4713E92EDE9E4D415872F1FFE2F5AC5EE285E03B895E81476B8 +1871ECAC61DD555266C1D037B1BA381D130F9E21F39849DC022ABE678A7F2EA9 +1823352AA456085C98292DED9FAF082E89FC52487BD40ECE92476CE768166431 +92F6AB4CC2844565A01B9B8C16ED8FB1B59A70832339A063C5D408C566DCEA53 +306C334A0F24E5159870B2F8D999576D4A88AB3C92E5990D22AADFF62906DD21 +A7C173D5BC35A4B35017EE8F7EB0EEC8BEC6A54E1FBF1956A3650BD13560818F +75699A8846A45307AC3C6AC39E7147844D098E2011490315DF92E188503C59BF +525AA6C11A07F3FF28D346BF0B37C891A8CB5DB768B20E954466C7032C6FD35E +EC745501DEECE92659642EAE17B656DEC9A19E38AE2F07471333774B9BFEC3B6 +2AEF7077B8FADB994B61C91C7C48E51FC3EC6CE490A71C82A089CD2DF1094C39 +8E652DD1F7BCB905A78F5F4350AB844877956B837795893A9D08EB5EB02F0881 +94A0670ED2AA24FE20349DADA8B51874773167DB9A897BAB5BD85ED5F38ABE6F +A6D4AC4E4347E745919A78E8AC8781C586646D0C4195ADCA042A4F4DA6F4E253 +8B208E59816B15DAD0C761F0490CD3CC898BBA3647C9EB7B316717EE859DFCBB +C1CBCC5CC82ED5039851E8BB34D4F7BA55E5268D7DC5010F985B12D28C94EABA +89EDA7AD3F181889DD8BC773044C49C8DD6D3484ED6ABB5E15F4DF7898D01CFB +EEE92BA769DC7E4CD4A8FC8BCF5450624F83FABF5CA9C211B89490C5C7222AB2 +3779526A71526361ED2C379ADCA9DBFA54708645485ACEE6918CFEB08A3B932F +B2070F32ECE42722897C1AD9E6A375D7F789809B4AC77CDE3467108292EC20A3 +2C93477AE6756D18A0F6E3812E43BD6B5BC69540904C2AA56825D73500F90AFD +5F008EDF78BC053A65AE1FF5A96C70431D39319341D0F40BE6863DF9377D1E52 +FF3322E00CE6B5407E1085B1D5104903AA396FC8BFBADBAD045C005A89B2C0DD +DAF6263FAB5B49AEECE01384C811D7CD6F47543077A1A13C521D64E30219493B +2268F34FD8F101329AC69D417756B409A0E3710FCF1FD58AE0BF6E031ADD737A +7EF145530CBB631666A10C443D004B7A5B15B913A00461E8A77CC311A899BE4D +1BCF43FC73C175F2A6CE589D68CA1D4231D942499D5874C9CA6B18D5DCAE8691 +25C8F66CF10B72F697410AFBF10B097312CE5B3F3A1DF658E60183C6B41D526D +99AA575525B01BBC8C7FA511AC55EF418D623CFB9BDA56CF7A0A6D9631A8068A +8D64EAF69D686195515A8BB77FE8832DFC42AF6120FBCE8EE04C0AA8BBE76698 +AA6E14AB126F943975648593D61B43AC7CF02F70CC7E73AF153DB464621608E5 +34EA5FFF06BDBABFD479E76EF16C20B6B2708BC6975A0916AAAC519852ED02CD +5A0263E10A1E86A3B24E090B54A955B059E1CA5D7C777FE5B14C7533E0D25D1C +DA7C18633AA579BAAF156FA2B70100CDA3A4DC3CC1872C27D7B74DB62AC8AC2B +89436B90799506697631BDC3B5046645E447542243FF308F1292043098AEBD4A +582D640FA44E67257672F6D970C895BDC9A4D76F64A401EA9546B513B07DBF4F +E9BE239D2CAEBA74AFB0478BF80B60C49E279642C58F8DE0735F63CC8A90417E +00453A7C7894EDD18CE46DB581AC7B31B200C195FCDD345D4E041CB612C41F63 +0A9E92D85A844FA6FBB87FD97F8F73719BFD12A0D8EBD1DF7DFF8306DEC16839 +B837E406959906450EDF9EF40CD44A3AD473C97ADE2C01AA359E228F9826B0C6 +C5C1D434F1465203E0729A996DE29F3BCC92C87FB454329422931B9207F736C0 +5D5E97514792F2083FD9F1525E9EF04DC053B789B421F3E1AEB49D686392777B +EBC0E947BB46EAA99BB5B7AC7C18F14B69D8610C8C79B65FA060ACF860AD4A85 +D0A7739496E6DC26B83665DB7108F24530D6F4A1A61CAC9C73600E741EF36EC7 +7EC5B8A90DA28F20DC78EAC9DEA0FE09766DC2F366F035471E74DF28FE5F0ADA +A9DC604FD782CB0E49590F55DFE398DFA307BA722C9D6FB394CBFA74093A9135 +B8FA32034AC05E82B513763721F72F6A4B7C0CD71E40BC5F39EB014512A973FB +61CC99399D73062A1BCEB2E5181E58012782419ED04275BF52E0644C8B047D51 +90A9F8D14BB550C9275957C9B42D776A4A6580C29F66C1D558BD532303DD8F6B +355E4589C383B16C30C4366584C985E2EF67BF9E4ED2E43C394C721C08256F8E +BB96D01319C9249E4DF21EC9EB11A5502614B3AB1FA3E88E78F574F24F9BB0D8 +CAA6A831219E22B4BEB5565D90F47F65063714F1E1072AE989D20E3322A07658 +9005E26EBA791BE0EBECCBA007948EA225EE84D7B17CD57370CB7E81E20CBFA7 +C108A591743A35470E9B75E228EA751EC4EF6FDC8E7FE4AA30CCF26ECD0D9201 +288A20AE15E48B02416A424AF491DB60594B63C2B3B58E51A0E68B8C19685FC2 +ED2E9CE4DDCE32F69C5223935CAA058FBB23FBCD1226095D1B08C611A8D20455 +3305D203E4C7E164F6D2F755789FCA26D9FE576300D0D67FD60C7A5518287D38 +E921A0FA64A5323033B7932FE2E4F2C611D57CCB21E013F5C68BDC1F9384D359 +F69A9FA143D949DE07F815CEE5C2BE175C21EFE7F4972CCE0CB5ECBE15D1F935 +07B74E4D562153E20034E9963772452873FF6640DEBDACC45D478107E1F63DE6 +2849DC422AE297F9AF9BD5D693F67E94075C78ADF063F15E1805CC6E7613DD44 +4F737BAE5458383BF6CE214B25B597B94015052E1762197A486DF662694150FE +5861DB71C9B1F7C8363ED993D7B07D03A9A7820A3C7CB15B22921C618C5A7597 +C0C426049928B01E78C6FCB7776D3BB98787A498BE501A394771789187A40AFC +F4C8DB01466F1F45B7C6B8FB1CE812FE29544F3242FBADF7947D43C5321EEEC1 +661568BD694E7EE8D3FB402C45DD5329CEB27FA083A633E9AD0C8AA34B5C8E46 +3ED00B2B20606532FE953B68CBAD741CABD3F7D672CD605F5E64FCB1595453C6 +A36EFDC1C9E98FF3B2093CAE8D3961BFF4E005CFF5CBD5601D2EB5536B9B6CEA +139EFFE8E9B2D4DEE00EFC3F842097050B18031420D76E5AFEE2B8B11E09EDBE +29E6FF5974CA3320141D185AE1F530168F2CB0C1C888B7D26324AD488FF12DA0 +431080FFB11CFD5861E618A7B65A5AE1D1B56D26AD7CE67FE12480B601E4B6FF +4237E34F2D3E727113B123A27009A4C81693B0AA77D121F3831FC72C9D5871DB +94BA60B6A0105618DBD146B6AF1DA4DF3CE38296CE453A05DD95ED9694F57009 +83C2678269CB44118A8C7B343F4797C370F5656AE36FEF1C886BF01C4EA883FB +0C42F916AFAF34407846E2AA43A3522EFC994E554D6D65FC0726B1F11F12DE77 +4C78A0BAF54DDC1C9904846736E274007D95BDB876813FF180704CA8EAA734DB +FA15E13657059E50CF9A7551968478A76740A562AA711180FE6D9F373C3401AB +BC6077CDE48C9BF0EEC50627FD195FBBEE1D90B03C9F7F767AA93E97FD05A1BE +ED5A5B069C19403A0E992A7886F45D4C06EA8546AE507B0299436932F2AD0478 +1E379A14CEAB5ADDA6A8626E6DF684070B79BA96B2083B410A02989C9EF5AEF6 +F7A804382F47D5A7B66B496DFDAD64AC9D6086F92CC88190B2307A4B5E3E71D0 +35E24506FDD43EF2562AB4867357801E5B5BB6AA64ACE2DCF1B97B817F789E15 +8973096781509A4058F689A98D1B05ADBC207645FF13A0825995996402D5EA00 +B847BA18818498028B02AC410BFD5B3414272C6D34DFBA9CDA4AB9930BDF9506 +B91857E1F4A5049F4B05E172009703746F067DB51D4E997F3EDF5C075EE127E6 +18E8EE032C2E83ECD277079DA1941E31D952379C7D63918EE958D6E25AAEABBA +06CFA50DC26AED0A2E6E3566EA97E0F21CB454EDED957119EA0A8FADFF8B368D +948F218F20C4027148117C60D3B4BC939A642CD738C876A0D92541DAC80A499E +248DB1E598754E33BACA4615F42D6397260E70AAB376943110888E1D69303AA9 +71D381EAC2ABB156E11680D550B4F54008A7938F38D6FF5A50817E55DE259420 +29AAC7E7123D75292E73235B46A3CF5A4C28365E82EA7D8CA4EB509A283C37F0 +35A6F52AD84DD677A24397048D047529E11253385E15C2FF341B7DE707ACC496 +F0A2686CFF1B5CEA08A96D28659800ED072CC2D9C79CBB1ADDE8F7394C2F67F1 +8905D68A157A1302EA67D781351C78DC34CB2D1AD93C6C2DBD48A3A53DC61D5E +F9E6A0CFF942D6D9DE3BED7BE729C2CA6190F64A0B0EA8493EC7645531B7CA41 +0747884902D1CD0298B1DCAFD5CF1F66A5A3AD0436FFEDD294C72A0B0EE7A5C3 +90522F83DFD8481A0863E3F07A4714791641E56D5E9369007DBC4491306DFE61 +2047BEFF64616B48EF99038FDF956C03FF681FD3B7C1CB8C6606E39DE034E294 +04DFBA771187CA8695B9F330278FEC2EAE9F45478D2C1067CF1106DEBC98A274 +5EDCF9558BE466971A70E843CB54A2BC53E862EF20D256C92401CD94B3BE8A88 +BAA77244D0B40764C8D8077EA8EC43BCFD0ED135EF8C88F1B9AC84415247B838 +5F4F709AE4DF8A2DA0135E8DF48B8AEB925DFE31A01203A33CB1B74A4535F408 +A8ADC7F972D5244C2AA189644C106465D2E6C2C48EA732E7BA43E7067710928B +B423C4432713D799C40EC86EF024F092F8229CAC49B86ABEC80250787F487BD4 +BBF8314D2F4F9F539117710BC6AB068759C16F1DB4974827282BE302A7313685 +16BBF11D450E360B5B7C5B6A75A4CD29B666CE4ECBB1FC1CA2B99FAE83F75812 +E61344B81C1FA5BA514BD5327E69C9DCEB4BD4AB758FAAF50DF78DD4BBEC06CE +EFF5CEB85A11A42EE3C778B7EADC94793550EB108517AD41A4598ACCFA639E40 +D39EFBCB19C8CCA7DA731C897ED64471FBEC17E91CFD91BED8181FB42DFD3778 +9E0C6B93D8AA7E26200711586603A656D57B0F558DF3796DE457D400B6908D67 +479FFE7AC76B66DCC4FA1543B5802017CD00D4219DF00A0B93D8A4C2C3831751 +BE64E87FA5E64C6B248A6FE29A67DC089B61574B0ABB2D4335455C9427F39AD2 +77582C61F93397A409EBA5342DD249087364DE2A572A1E85E1FD719557551582 +91119BB95610F8BEBB846136D9C1F061FCA81D9312A96688067E4E4521715605 +F22499DD4DACCF31B2CEDD089B492C1AD8A932F8F317580189F9405D1411E119 +7322A61C34D8C28366732D159EC649921DD30D45104C6CE3545FD04C37F56171 +0F31AD0166C87B3044A9FB57CF1022D61426353D4EB90092AED1787B93128566 +CD834695773A27D6824D0A27D4DE5AB3F4F7B4E2033AD18B18382515EBB8EC8F +1B14C8CB4D16223297C948279967D5260373EAEE3115BDF4879490C057A28955 +2D61B67A36F7C36C22D4C1809AA0C212B7C5818749B8A05E5C7C29BED844424B +A5D6B567BCE77F47F68948E4A1724BED4905ED6242C25B4D340BB286380E27CF +7EAE415F40B6CAA65CED05B83247C1D7E7E7FB13840B032D1B6417D387DFFCE3 +1FDC074917C02C9050E30FD3515F868D14E78EA6DD1774D53D536CBBEC587F08 +7ACCD9EF5D0AB6783D7C5ADE6EB45635BF621FAB33A2C96146F66269A61FFF79 +7EE8CB26F53AE36DDD6B5A0F5DFE4623CFFA95C62022DF4C5F7DDD07BE2094F1 +1B52D753D7BCC7F2D027C712549BA2573A9816DF204C69157130413ABA61432E +D5FE2C8F832310FCD4F447224EA6480493C81920D2D3FC3F09864F3106B3FE3F +2A7959D486FD0399684DEA5ED991976051B3FA1EA35EBD85BDD576555B4CD7DF +260C814635BA76377BF73A1F731D3204AF925597984921257E0D96298A4A1FE9 +46B5C0EA0E2B2300BF6BBD213B90D057C1C9FE128B538F8A468599DBDFBAA75C +D772CA628843D9B974D71C54151F1F39B03ADF0526BE78C4FD254B1804797F8D +712DF3256BA1CE48C84114298044AE44974A85C4DD88EF100A343D8981F63DAE +54726ADA9541A267178BC364ADAB814B4843C220A90C0E3AC2B50340E401E79D +7EDD9C79050D36BC884EADB9A709914129412F54413EDE625AD5BD358EF2840D +B790523F2097F866B345C6C7387C96706E397F19C8AC6B97DC0E81AC5661E170 +05B7959DF77C5A6303FC519BCDB33133C1E15FED427C684AA3E6E97C37D37B7E +27F7073DE8D29D302DF8D54B85B8A15A10C5DD9351E04C46BAA0609A30571B95 +1679D5087B19A1FA8CF0521D7FA06064919E836D4863D78782142F19C026C89F +E4A4D63DB8616B2D0F1803C06F1E5BAAC418E60851519F5A26E128ADAEF6539F +BB81B33A953E7D2EDD4876380897CC5005C5A6446EBD2048467BFC12905A7E91 +0B8EFD5556FC65611B041949CB215856D8C2BA72B610BF430528F83A65511E8C +9AC94517F552BE2B360026478A3FF288671E84F10717CE62FB5532805BB08995 +635CC573539FB78027C7FCD047DD3A114A805AC8DB17CEE18A2F877E9994A012 +E50A6C1AD66644E4C9681B0140194236D4ACA0A3373BACB09A8697703EEEDFC7 +8FA20135C17B1ABA2FD0070181E70B4E7664F3F3D8E101BFE84E017B1FB63878 +41282D114DEB771235694F26D7DE9E56E9791A82AC31EC52773F803B564A28AB +321848A9A5618D672EEE376898CE5E8F1041CE60623AF6D9E93D1D0656B0C5DA +537134D9DA2B1695EA902D32EAEB3C052122044F4BAC000C7E9D08281C425F6D +65F6C9798F355209DB4E064F70A29247785CDA9E3EB4DCDF8F8EBA3692165CB3 +BA213D93850DE5BFF53C5B7F8FDB6317C85022DF1FE61D737D9386BA33C81123 +2A178503ACB370A73D47EAE72AF806F919117FAD1397E06411F6A38C35B41911 +A2A29A108C2727A94AA062E460C9DF98285C1E9F18C11E46E9ED356A57D86E09 +B2B354741C5EB89D030373D05F8BC428633B2B3B34E576129AA4E00B747D5D64 +92EE15C465FEDA8CDD7198B281921F68A358220C1544A4E32AF3F46A14B878FA +66C3A72D2099264FED218675AF7514DE124379D744C9ABFCD095A180CDFEAC7B +55CD99B8AC31E70F5025FFAA3AEFDCA59230511E5169E869321A10735C150F8E +20CE65284CE384EBCDF8ED5625FBE021C06881474FDB5CA6E35A93DEDAA4994D +4583F593618B783A04B4F570F4A49F7A1B5D71A973494A9A1847D31AAF4EDAA0 +32AB019FC8402204E5ADE1F6A4779BD194A988E12A5984865A01A8B3803F11B2 +443FD579D4526DF6367091BD71D7EAAA2ABCD4348EE7EB8A9297BE2EFDCFA98F +DBF753CE4F12E85C8ACC4E08FF3769A7A3F726938E0E55F5A3A9CE490D7F5431 +367968C741B2D995B9E85B3EC55A82B1296025FF5C21E1983E472EA337E7ABBA +72DF1EC1DA965F7DB1C86CB47681C1081133343B11DBEE24C85468ADFF83471A +2CAB807668E6062768887BFF51D8FF80EFD05D60970C54A2E5537C92FFB9B22D +3FE513AC19802FDE6CC580706E32055BB984A519FCED4432F14136C87737EE09 +FFC9C480F1D18587850120D87DCB4B7D3A917F82CEB781456CB15B9E661F5040 +4AE387D7CD536748AEABB810398B2DE36AA14D5DB5CFA46AF7EBD109685E0DBB +34DC36E2C71A84CC32ED67DECC9E14B9D1D175A82E5F71285938C2247D1DA758 +06C57A01BD59DCFAF05348AB71C019B791B1FFDD106139AAE43D89E718858A4B +4C31FEF996236826907BB9EC5842625AE120335B1C6FF4C8F68FE7BF748373F5 +2CB3EECA756C9CA0151D91FD2EBE7B6DA5E887E235DC6D6B34CD3FA42F8026AA +30B9C7BF0F5A2B991C1F4C0FC1D675E7ACECAFACCC07F08F585C76A18397CCB4 +1EE5B17DC4B866AEC1F5284361EA5C65E0BE363CFCE3F14B81B7E44090219538 +43BC367204A88570D920458E36614D7097DA6C015277F83476AB0D9BA3CAB2BB +F937D01957325E9442527D3892D3EFD388DDA4F7C1DCE849C6A490AD5AAA13A0 +A05F966ACFF3CCC6CCE8C08D8F384FA73A96E8799865D76340E9634D0009AB4E +C4F539A4D6EF523744294A5FF4D3B934ECDD46460DEBC6852468A85B33C53210 +F80ACD68DB86979EA360CE9DD06FC7194808D064B35933E5E046CDEE1AE18183 +31FA6A62DA4F18B3C7092234F0FFF91A2635328FAA18D250C18C688422B243EB +D5F520A6457462C393C57BA985588D0FC47F2D8E6CD2CB3D73D6C35EC6E578D8 +3254BBC4BDE31429C6706B72D518DB45D4457E8C60D0007623C520B1B7AF3A01 +A79AB2AA961FF7A5237D9993A4446FEBBD6AD51D662C9909D2D1C2D3424E9CD5 +8A170DF06CB7C304AA9774F13301495CDB010DA9218EE9A1FC05F477DE533217 +5ECC5996E4D340CBDD2DD6C53F9B8EC5E9E5300AA0D5967555B9DC31019F45CA +A702C6F0568109C55DF33FD90A0E9B8FABF3ADBB0CDC353AC7B18F4E60D88A96 +E22A85193C953042F26BAC0A4182352080D44CDFE47AB34FD7848BBBB9021EAD +82D68F7A6C6ADE8E317C8B7026043F5321475EEBE56C21EA0C6FDD617C588986 +EF0044BFA70E2FA9285625739D63C8C9DD6E2D62CB9760C62EDE6D29700BB89F +AA7FD01A9E4F3A6364B2ABCB324DA52C6A518E68F7DA61FB12878DD94F8FDBB5 +57300284213E77C7D6DA5E2BA3DE91D7A3116CE9C8A45F3F98C8DE7C7FFB5628 +D3175A93A027FCAE02A0783A09D09997F247A8923D7E7442DC3B1D259893BB6F +3D664620C9C4A2C66F6B4D1F2E9957D8C47119EBD1759B9EE6F5BE2D2FB0EC32 +EAAC468888774B8AADCB59FEF948FE89F18D2436D877718900E4F5A4B885C38E +9C9B344895FFC5F2895DC187C3481CC23F4F1B87B9FEF11AB9FEAF9498ECD126 +99A8884A86BF9C943D6E03EC4D974F030F157E387B51D360BF8C21C799DA4848 +09DDE528DBC3AF547833DCBDC7404452245E0580012542267EFF13CFC5DC8EDA +66958A20A94176552A25D024ED91C3F6FF945DECCAA7C0D71EE0591E53E75008 +0D31A8BD2D1096C8E8A7D5422595D65E1B981F14489F00D5A57C9884EBC6AB67 +2E0C5156295A3D2EA764D77CFABF2DD2A8F32F75B1A4F42BB819F3B59101EB70 +7C571225510ECA1DBAD5C618B6864BDB0FBA7C5055D2F36D5599022F2D95E340 +A0329B0C30B54CC501448AA38EDBF41E023EC8CB8451D32D392D5FAE1736ECA2 +647D6C41BCAA3BACAF8070747ACDC10B51C686534EF2CE5967A94BDA40B8AA37 +7E21DC9BA34B7156BB4310A60B179DBD4CE01E76A84F0E8F9788C356532ACA96 +9A122BD6ADC5F94FFA90A0C3A14C839727FB419A6A49B119DF87CD515CC5E85F +2A4C2CF778C5B893B8D24B966BEB874B5292C31737F985C8029CD80E1AECA3ED +AAA8EAF5DAD31C8073512D5E68511D31513B066DDBAC22B75A5C78F213DC962D +ABA84D447C6D68BE5979BD72B7D5F060F96B9B1BB07B7A0CE956BD3BDFBF116B +77CA0D330B08B4D276393CA20E16DE346AED3650EA9CF3DA4FC30061DFF8801D +0AF8C7152AADC3B929B59F328ABAC8357C09A393C33EF7BC23F36CFEDAF32024 +84CA10A51E1469915A3BFC5602565BCD3F89A875408526A90491D570090C98F3 +A2BBC8B14F8F4EEBA923594002203589879938CC709564111459A10D152C45BB +113E255C541E2CA81B683D4249C25A2C64F46E576F1037138157477B23631E5E +473DF12785547266190EE3FDEE18F2B78308E3B66996949E4482FA814CDFC92E +F6C4B5CB7FDBA581B35B5E0B8E9C93C2A0BA5E251DB94C4C56D1DD4F7FACD2BE +A8A28E20B8115309859E681D4E93148B4F09E06C5679BAB4076B808BA999FBDD +E654E96EFBC2B99FAA1D6B03D7FDBA7044B8C1B9A4EEA8E9AE07071F0218669D +42512E6BB0461118C832392814C7E8E98082FAECA79DEEC151E2E09601629A2C +95C82BEBA0B97206EB627CC80A12CB85D93145802AE6394F40E53D0BED4BBC59 +0D36545D1D272C9F9FB2DF0780674F8D4E482A85F8883516691BBBDA48F23308 +F10630CFFFFCD8CA7467AF857E5AB4C8B6DB9162C566438DC5B99301D3FDE196 +C3F84B25C8C3664A8375C41A63B2ED7F3D68E9C364CE6E5EF3E77540D8FA5D9D +D5333D3BE7705DCE754BABCDC8ADC7CE092E877AB0B202B622BAAFF4B106FC00 +11821EAC567FC09BC1A6964187419AD9993A67AC4D7C9FD56F59FD6DCFCB07CF +488016ECF192A7C21978A965D9B7DE9A3A0D9BFC4FBC575A5AC759148820876F +CF881A503EA410922B51A9DF213548943125218C779A598FC852C08098E5C3B9 +202E68950097BB1B7990A0C814899C446C332E662622B1738A49E60BA8EDAFEA +F7079B848946ECEA50EB3DD0F45994CC0C40E1FECC5372FD16D15DAEA0CF4EC7 +2142A6996B21BB26C3C0D2ED65EBBB549B3A5BB223F7558BB29FCD5A74407920 +17088857E275CBACE034358B1E6019E1EA4D99A4B5AF86420ADC8971C3265979 +5EA9FB66C49EF456D95343BCD7481056158D0215723ACB98D856242265882D07 +1073E86E684FD4AC53818058147D91E34A3354337127C6068B9C795891748532 +D9E212FF70F5FE51F71A735CDF254E9756D4925377E50203F857B32669F68E01 +5E1E588D7B392F7F68482434FF32D1075112ABD9DDA7B5548450A842B75A05C7 +8CD1061A90AC5AFE23901FDB209CFF92A9E582B78DD2BB2A9FCC9500C58C7483 +A8573576C96CF7AFE5204544D975C5D349C75E0C100D4F4C87E5C2FC2C4C2708 +211C9CF169EB2E862EBE04A30F87250440BA02BC5D419E2EB73367CACD2CC246 +B8470A0AA6859105193365520C5D9CAED67D98D634C2DFA472A78EC5BAEDDD78 +451F8146DF4C698139C7C87E0548AB705A738CC3D88D4D2E8EB12F859A319A13 +FAC067CBFF9A5382F5930E144CC97C79C1D3106204BDFEA2E668F3B78A5ADCF8 +64B925A7626E7A731603D1E0E18571D3122435BE105C2A8FC81364AACFA468B0 +2BFAC6E5725A0D8302B2384FD5A6AD833A4BA6F9A68B60F11B4268F8AAFCA77D +B1B97BF7249815B6E4747E80AF42DF6EADBE5DAADDD938425FBBA6AA29BA6162 +19349F546A26E5CAA8619677493274427DED8D06D8365C4568FDB3ED722125E1 +7F71A26172462D731D08B26826B673F61588C4C72141504A3A1ECE7C63BE260C +B181571B3B01092F8029909E2DD0AF6B569970715A10039ADA5A1E8E408C5A42 +990D9FFC95976613079B5C41FB82593B1F43C7E2B5AAC5B380061992FFE05E67 +AAC224C578AEA1E900048528175C1397C39FF257D32CD11CC5724EBA27A5FF63 +CA8DEDEFB7926E1A9484A733F3E1D1608A8E7FD468F8130290233F4843C553C9 +A9AB80FFC55DF6E961A32174D02C569CAC2EA8D8D72B9B301D87F695BDDE44AE +AF7ACBCA79A169E05D9156613E3E6A46C9B7B1DA76D3AAFA9F0E40630EF57F41 +EF285DFC9093EF3C6B50FEC74DF0B9063022F1D3C54EDACC4B7CAB6A219BC271 +7CAF4D3B0723F822184FA5A22899F2674812F54951E7072C0F8FD4256748E452 +BB8D0DF7B9D5C7C2A6803FE2796CA7F49DC97D9C2C1257C0FC7084E5D04B96C6 +D340C9839D58A3C10C9A8CED7DF1EA90CB6DE2917C62B0673AAD1053593681DE +3E0F592B5515A94B0289DAEFF215958ACE8A8552B046B18D6CFBC3498CC1C8D5 +FC3A971757DBC374C25C4856EA4340659EAF6309C38F9CFD28CBEB3A69F39E56 +A40DD0DC5DD44B1FA830973506CE0B06391DF4051E4000E0C3C26F60F872A4E6 +0BE9119C5DB19BAA854EDE7AF240AE413A197CDCE98DDC42856D4544EFBC52FF +5D6D174FB3D034CA658D8BDFCF9952924BCB88762C3E1AAD29A85E5E77654ECF +FE26903AC41E3A2B1CD3FFB89CAA132D5278332FFD46AA489D5667BBDB73CC0E +6F450052759710E8B96CEC8487EBC16ED29A41D4C5ED88212F7FB702F876C03E +481579AC5072AB64462CAA2337A720C89FE442B49D135C5935FFDA2960710E64 +8A7B80A5E71AA1A693671EF5718E7E342DD4BE71FBD10919E9A2F79FDEC33F0A +8FFF1628A6A18E8624DE0FDF484A0647DF62C7C67D1AF3959E452ADFB4493521 +DEA9C6C81FBAE5EC68379C93DE9C138E2332E7A2D9EE1953BF10AA9D1CC9CB2E +654FFF2A2514FF93478E9BB0B84A445FE6EEC8D92BC52282BA53BEA122768FCC +73DC0E6F1935A06F2E253988CA69649D0E8C39CF9AAFBD3DDD04900E2698CEE6 +221D808B958CD833EFDA976E6D7B359D8CF62428F87FB70D47CD5CCC55007212 +A9B932E5966B475FB7DEF27B4F05B3B969C100CBD384DE7DA3B1245B5BCBBF4B +F4D0496A9B0AF3E5CBA8A2D239346CA6577AD19B2C23D2E401A9CC6B2FB9DB72 +F522E2935C3B3D5AFCD18D27F94859B797473502372F188F5ECDE0E69064B6A7 +6EC311DC3A6A7FAB5691652F7C486325CB6E58BA814C8EB2861F974913D173F4 +2A429DF45B2B91BF02DA372CA190FD22FE315E877FD24E42F82CCD0570748C3B +BE64305C56E7C087D38D28147F80D93B8624E63093FDEC6E546157DE842D9021 +26FFFF44372AEEB9D0B197B668B82793D719A50AC9F819A3E4EB3C0C5BFB0C01 +29412E6876FD5A5A183A19087A65270E06AE876E28EDC8FB2C49EEA549BDAA4E +2E03BEEEA8B22C667BC6E6B193E5C914A14E09FB1103996B3CEB61F3F4549EDC +B4D9A78D7CD44A28448F24F27EBAF2C255F19097AE400B8999F080167F14CF25 +959BFCA4059FEC8B3D8B1D1EC66DD5AFF05CE758BEFAAEAE7E5D1D434F1B0B6E +1EE01D63FE8A2C2D0E1FE4A14DC35D2A63128049DE51BEF14482812ACF89E981 +E51BBB5BE0524DDB01771D7B419DADE73EF0AA7CC99591BCED208E55912AA6F4 +EB9ADE2B7D47514F7E11AEA12BAB51E93B24313A2CC4FEB226B00934A1D50CCE +21F84E7C4CA87866A3FF5C5529D73F7F848B49C9D350BE4543CEC67F1D2A0BBD +A79C21470C090659081CA4FE7DF3138ADD83C8A35DE85B44BC4DD3A955911DB4 +B78F9CA3F674D36FC9D7CEBD66A571F73D1ABD57A2208706ADCA285E4483A95A +73F1A9D762872F0AC7AC808E59F69D1E273C046940D642F92E8E6D37D08CE03B +608FFE19F882B40AAE1DB3F5355F6C2192EDB927935514794BB8DD035C072BC3 +A9793A31480B7A761144B77777EC03357A58D90A7E08B0EC9EC90F0F2D67844B +0E6AF90CEDAA04CCECAC1EA93988322CD7543E57DB0C763F68528C7171F264A7 +D1D016B1470DAB2747EB3D27BBB448E040198A43C67AFD52CF31B801C6A838C2 +A720B7A819B534ED283CA362CE12EED34B31F32BDBD521ECF71DA160578602FD +ED11D7B60D313A5A613ED89ED8BE69F5C2F1ABD04331A2E1D8ADA570FF96A5C9 +C6703EC7420F8EC43598E81691D291F193AD4F95CBF82EF712EC190A898CFDE4 +72B0388BBD08BC03CBD3DDA0648E3E0A0DE0FDE15739060FDB10629D78457645 +1D32ADCC813FD66FDDFC9EE79FA705B274BCD3656E745B1CADC2A1799BB8430F +7C34ADA3E81DF1777D175B3BFA199E092B3CB5517EA3D41BE449BEB1E5BABB65 +F42069121C1014B05D9D2B90DB93296183CC7FAF597D88329918BDFDC283F3A7 +CA2A2BFC573F934E576B438761E75487377CD4BD09085158ABF569C0A4BC209B +9952457D15BFB036BD0BBE942E10A82A89E4D012AB1B72A4A59A18A55E5EDFCC +CC9DE3382ED090B1F3CC5D8EE59900828175C92E7C5410631A804FEC75603CFC +F1033827927E485F6236B227E9D54D29CE5D2A3009B88A3D2ACD9430FD5E3AC2 +E321581FC966FD628A099EB795A4D1230C0F57F78E8F619A6D4BE8F328886E3D +AFA2C1CA5B009075056F92E55CBF2B55B59EBE68859B7584CB852C3924095559 +B255ADFFD79AFA6BDF6D68838AC48DE5B79A277932244DEF5306E4A47DD0325D +5DBA34765AE92F8094C11FCDA5646747105131838106D9C1D79714F9576C8F28 +FC6E7D0BD07254B1D29FDA5E4FE5E2F7FFD1A56D41435AE2F6DDC1970C9A89BC +930E99448B124112B488AAFBF01DB6EC917734BBBC7376D6EF09DC05EB283A36 +C2B8CA16F4E3718C00311C64DE6A03682E84845CC57BAD00F9C4F5D85BBF6D46 +093A22DD9DF218019573415B8371AF1DEF2770CEE7FADE0FA43DDC61AF7858A0 +ED625FACF6FB35EFC5968F5FA0D2FA2A8961CCF36FED33CE945A1F7265AAA702 +F33CB51F651600EBAF3DE4F3A2326BC38E48F8A6762DBC107DFA4F5C5BFBE52D +CB3D2A1AC15DAA0564A465FC1BAE1202C3DF85AD87832C27F4440C276D11BAE7 +7B591FECAE5171DAA8C68DFBBC2AB09312BBF1B4D2F43A59A80DBF22AFECC1B6 +3B7D57C3DD4C00B7ECC587F40F5211709340A56FEC69DB55DF1B5E8F78790722 +A0D712FDF782AEFA64A7429262E976AB9057466C549D8C05178AD9545ED838B6 +CB5BAA750B223DB6DA2C137E4EC91A1D3750C09D56BEFD4EF0760113ACABC2E1 +BC2A833994518E00054595B787195547424C8D96351C86113962E507560A92FE +D7813AA3CB95AF370975998ADF00AA0FD5F9274976B119805AC287BBBAF27E25 +91913C949BEBA56F72A7B6D01789313B63DD404F575BBC1D2336BB81BD1BE035 +F54116DC276E02E0F70D6C1BD3FADFBC43552E07F39758D5E2BFD423F3A06341 +524468B77DC403BD7D6913DB11284EBD1AF581F391B9D4CD599A0DBA01E0907D +4E211BC887BD450FF7FC5E0670215037AEFEEFECDBC096A4141764DF63D97C1B +3A77F3DFC74A0325937A5D6A089C8127B511527D2D5FA186FB762229809B7BA1 +E49BCAD0B9D7F610FBB3FC37AC5021250FBD022BE60A841FB4FAA33C359A4268 +2F7C9E75F3E72DC43D2DD07FA94ACE36FB9A774F2E076563048068D6127BC83D +CDD9C71A01C1D7F5C345741C64F2AE3F891914088A1F1E5CD29F6CE3D5B54F7E +0C8407DE6E8673F1AC639E20178DBDFFFF951FF36FA22AB4ABF6A99EAD86A733 +2D50D2D127B66F5155BE6EFEBBCE178C529CD741BC5B2630EA89B7A18C0B084C +07AA4DDD7DFAA145FD912C380809D194DB1475B00798CC816F91747FE19C062C +9B3BF4C93C3A7B33B60C6F143A67A877946F9C01B9CC781DFDBA109101079CB4 +FB585C978B17707F76E1DBE44201A0AA388B0237BAC3FCFDDE2A714BE0B80BA2 +FE71AF9739BDB8DA3A066B5ECE33BA7584924EEDAFE2FE28D5D984B9243DEA82 +0A92529A6DACB90EBE1F1BA717E80C6F25167C5077E82B23A1B66FF964736B51 +57E1359B9EE4189E21A889AD4EA99542612C88B6065F294C4937B816B7D3324F +F42ECE164FEE84C8A6E31D0F16811D1FFF66FAA889C28240669A8CC40C84C547 +EF4CE28DBD4CF4FE5A93C70C707894EE6B6A85CB7D017BD2ECC11434319D2AB6 +AFE26BC9BE7150F6E8BE52E3A925DC06D4A309EE9BA0432935B095B84369AAAF +CE1C65F9E73D867235313C9809E2B6733ABCB79BA9762FA1215BB41388854ACD +66E5FDD73927ECBBB55C485C88BB540470C6EF6699C8C9D83EDCCCD207780DF3 +84A4EF2073813C676704C6F0C1287733007F7E05DF0FDC445B22B0315ACD75B7 +9AF8B5471A1EE52458A1E34CAAC8C78E8A01B7224BFE7774314736EC8086D7A9 +2B3A4A95C0D4ACFE4778E4827062FFDFC4A11ADC64E85722F459F9C21B4D6532 +5F7A90E3A68F55F9F4712CB1BC050DE2A04F9F49D84D4675FA5C5A0C6C747CF5 +55AD0A63587BF4BBFCF882201038DFAF873F155FD375B424191EA3FC0017B54F +81371A667B8746EE18B794186C109949289764A353E54118448F285BAE6F364D +39FDCE512FF45982FB9DE54FB2B13702ECEE078C0431B769DF0B42ADDE5D64A0 +A3B9B94CDEFF9CEE74B0B48E9E380324B936C6ABDB7F80503AA787200D09D0F1 +07359242E0EC0566E9DECEFC02898566C5457293E1FDA6AA2CF780DADBD2FEDB +1610246EEDE4BD00C6B7284DF3794711E6D6EEC64AF3F61F5F45A468E400E743 +C49B543731414124EEACBD9264C76A6A58ABEC3F7292968695617E4B4F4436DC +EA3C75B8BCFC570AF2A942769C4972B6B8A4BCABB2F6695B1E045249ECC4181C +8EE6B49C53B38117755B95F5843A712B47B6098339C5AB733807CCEC17575439 +78CCBCBBF9D852C36062A586DB00A5EC089AF853289A9F089A08F2C7B8285844 +B2A28E5B6E4367A228E84F2A1C72B1FD37480DDFFCD28585A24D7630FA56AB02 +222A5F764029C82DD67F10986E77865AF507A2BBDA4B3D4D54E20C00816B8202 +F2EDF2A828528DD170FB0ECC605EC794EBA4E7A78B31F4A564FE4994C2B65752 +820A49B51196EB4192CA4B777D675DE57A00D23F4BEEDED6197CE8BBF6E01F26 +B045D4252CB302C57C0D076294E407A823BEB4FD7305C230D084CF7FBE7BF161 +1DE690D4765927D2B95DBEE0A1D678C4DC8F2BEDF9CB96C5945A525BCBB9F9A7 +E36D2FEB22A089E3C8A5792DB5DCA7FB46BB78DD719DED2F2B8A5314658549E8 +20F20D49296AD845FF45EC0F4395E1553DE991B2E40F2F267901CC3B3344660D +00A4C51870835CF4A2611979826825F8EF045FCDF258353622B352C119D680FF +857AD6DBCF66BCE00060DFA1B32A722AAC5ADF0323ED78B269EB284A4223A9BF +896CDF2307259D21ACC80CE4E6D43736317330D00867C128D2CDFDCE2226BBD8 +1626137CFFD53D7C37946BDA99FD955ED54E25EF71C1F19CB4BEB4D3B0099E86 +42622EEB4C57E9C3D1BBAD07FDEFD3C3DA91A66FF9808F13EB4B7895CB2BFE2D +00A238EA7240032300BF6DA66217A55C0D47344738EA21F9081FF597413C79BE +4DBDEEAC2C93EFCBB4680EE2BEEBFC14033CC5DE5EB86D5D0E4DA274BED45366 +283BFBF9D937144CB903CCE1003325BED0EC8CD03D250B8666BFF9B33983B670 +20ED1995D24E63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +TeXDict begin 40258431 52099146 1000 600 600 (rluserman.dvi) +@start /Fa 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39 +2[39 3[39 97[{}13 74.7198 /CMSLTT10 rf /Fb 134[39 39 +39 39 39 39 39 39 1[39 39 39 39 39 39 1[39 39 39 39 39 +39 39 39 39 39 9[39 39 39 39 2[39 1[39 1[39 2[39 1[39 +39 1[39 39 39 39 5[39 7[39 1[39 1[39 39 39 39 2[39 39 +39 39[{}48 74.7198 /CMTT9 rf /Fc 167[62 3[60 46 2[57 +1[62 76 52 1[43 1[62 65 54 1[63 60 67[{}13 83.022 /CMR10 +rf /Fd 134[65 65 1[65 68 48 48 50 1[68 61 68 102 34 65 +1[34 68 61 37 56 68 55 68 60 7[93 4[85 68 92 3[96 116 +74 96 1[46 96 1[77 81 1[89 87 93 8[61 61 61 61 61 61 +61 61 2[34 46[{}46 109.091 /CMBX12 rf /Fe 133[40 48 48 +66 48 51 35 36 36 48 51 45 51 76 25 48 1[25 51 45 28 +40 51 40 51 45 9[93 1[68 66 51 67 1[62 71 68 1[57 71 +1[33 68 1[59 62 69 66 64 68 19[30 33[53 11[{}45 90.9091 +/CMSL10 rf /Ff 137[42 1[30 37 38 3[51 74 1[42 1[28 1[42 +1[42 1[42 1[46 84[51 12[{}13 90.9091 /CMTI10 rf /Fg 134[48 +48 48 48 48 1[48 48 48 1[48 48 1[48 48 48 48 1[48 48 +48 48 1[48 48 1[48 2[48 14[48 48 1[48 1[48 2[48 48 48 +17[48 48 2[48 5[48 39[{}33 90.9091 /CMSLTT10 rf /Fh 135[56 +2[56 1[42 2[51 58 56 4[27 1[58 49 51 1[54 1[56 97[{}12 +90.9091 /CMCSC10 rf /Fi 197[25 58[{}1 90.9091 /CMMI10 +rf /Fj 197[33 58[{}1 119.552 /CMMI12 rf /Fk 135[85 2[90 +63 64 66 1[90 81 90 134 45 2[45 1[81 49 74 90 72 90 78 +11[124 112 5[126 1[97 4[127 101 106 124 117 1[122 15[81 +49[{}29 143.462 /CMBX12 rf /Fl 242[91 13[{}1 90.9091 +/CMSY10 rf /Fm 134[71 71 97 71 75 52 53 55 1[75 67 75 +112 37 2[37 75 67 41 61 75 60 75 65 9[139 1[103 1[75 +100 3[105 128 81 2[50 105 106 85 88 103 97 96 102 6[37 +3[67 67 67 67 67 67 2[37 1[37 44[{}47 119.552 /CMBX12 +rf /Fn 129[48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 +48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 1[48 +48 48 1[48 3[48 48 48 48 48 48 48 48 48 48 48 1[48 48 +48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 48 1[48 +1[48 48 48 48 48 48 48 48 1[48 48 48 48 2[48 48 48 48 +33[{}80 90.9091 /CMTT10 rf /Fo 131[91 45 40 48 48 66 +48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 +51 40 51 45 25 2[25 45 25 56 68 68 93 68 68 66 51 67 +71 62 71 68 83 57 71 47 33 68 71 59 62 69 66 64 68 5[25 +25 45 45 45 45 45 45 45 45 45 45 45 25 30 25 2[35 35 +25 4[45 19[76 51 51 53 11[{}82 90.9091 /CMR10 rf /Fp +134[102 4[75 76 79 3[108 1[54 2[54 2[59 88 108 86 108 +94 11[149 2[144 3[151 1[116 2[72 1[152 71[{}19 172.154 +/CMBX12 rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: Letter +/setpagedevice where +{ pop << /PageSize [612 792] >> setpagedevice } +{ /letter where { pop letter } if } +ifelse +%%EndPaperSize + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 150 1318 a Fp(GNU)65 b(Readline)g(Library)g(User) +g(In)-5 b(terface)p 150 1418 3600 34 v 1873 1515 a Fo(Edition)30 +b(8.2,)i(for)e Fn(Readline)e(Library)h Fo(V)-8 b(ersion)31 +b(8.2.)3118 1623 y(Septem)m(b)s(er)f(2022)150 4927 y +Fm(Chet)45 b(Ramey)-11 b(,)46 b(Case)g(W)-11 b(estern)46 +b(Reserv)l(e)g(Univ)l(ersit)l(y)150 5068 y(Brian)f(F)-11 +b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)-11 +b(oundation)p 150 5141 3600 17 v eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 150 4413 a Fo(This)29 b(man)m(ual)g(describ)s(es) +g(the)h(end)e(user)h(in)m(terface)i(of)f(the)f(GNU)h(Readline)g +(Library)f(\(v)m(ersion)h(8.2,)h(19)150 4523 y(Septem)m(b)s(er)36 +b(2022\),)k(a)d(library)f(whic)m(h)g(aids)g(in)g(the)h(consistency)g +(of)g(user)e(in)m(terface)j(across)f(discrete)150 4633 +y(programs)30 b(whic)m(h)g(pro)m(vide)h(a)f(command)g(line)h(in)m +(terface.)150 4767 y(Cop)m(yrigh)m(t)602 4764 y(c)577 +4767 y Fl(\015)f Fo(1988{2022)35 b(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F) +-8 b(oundation,)31 b(Inc.)390 4902 y(P)m(ermission)21 +b(is)f(gran)m(ted)h(to)g(cop)m(y)-8 b(,)24 b(distribute)c(and/or)h(mo)s +(dify)e(this)i(do)s(cumen)m(t)f(under)f(the)390 5011 +y(terms)25 b(of)h(the)f(GNU)h(F)-8 b(ree)27 b(Do)s(cumen)m(tation)g +(License,)g(V)-8 b(ersion)26 b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion) +390 5121 y(published)43 b(b)m(y)h(the)h(F)-8 b(ree)46 +b(Soft)m(w)m(are)g(F)-8 b(oundation;)53 b(with)44 b(no)g(In)m(v)-5 +b(arian)m(t)46 b(Sections,)j(no)390 5230 y(F)-8 b(ron)m(t-Co)m(v)m(er) +31 b(T)-8 b(exts,)30 b(and)f(no)f(Bac)m(k-Co)m(v)m(er)k(T)-8 +b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390 +5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8 +b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end +%%Page: -1 3 +TeXDict begin -1 2 bop 3725 -116 a Fo(i)150 299 y Fk(T)-13 +b(able)53 b(of)h(Con)l(ten)l(ts)150 649 y Fm(1)135 b(Command)45 +b(Line)g(Editing)26 b Fj(:)20 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)39 +b Fm(1)275 786 y Fo(1.1)92 b(In)m(tro)s(duction)30 b(to)h(Line)f +(Editing)17 b Fi(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)h(:)f(:)g(:)31 b Fo(1)275 896 y(1.2)92 b(Readline)31 +b(In)m(teraction)19 b Fi(:)e(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)32 +b Fo(1)399 1005 y(1.2.1)93 b(Readline)31 b(Bare)g(Essen)m(tials)18 +b Fi(:)e(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)31 b Fo(1)399 1115 y(1.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)i +(Commands)18 b Fi(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32 +b Fo(2)399 1225 y(1.2.3)93 b(Readline)31 b(Killing)g(Commands)10 +b Fi(:)k(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 +b Fo(2)399 1334 y(1.2.4)93 b(Readline)31 b(Argumen)m(ts)22 +b Fi(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)36 b Fo(3)399 1444 y(1.2.5)93 b(Searc)m(hing)31 +b(for)f(Commands)f(in)h(the)h(History)20 b Fi(:)c(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)33 +b Fo(3)275 1553 y(1.3)92 b(Readline)31 b(Init)f(File)13 +b Fi(:)k(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)27 +b Fo(4)399 1663 y(1.3.1)93 b(Readline)31 b(Init)f(File)i(Syn)m(tax)26 +b Fi(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) +39 b Fo(4)399 1773 y(1.3.2)93 b(Conditional)31 b(Init)f(Constructs)16 +b Fi(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)29 +b Fo(13)399 1882 y(1.3.3)93 b(Sample)30 b(Init)g(File)22 +b Fi(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35 b Fo(14)275 1992 y(1.4)92 +b(Bindable)30 b(Readline)h(Commands)22 b Fi(:)15 b(:)g(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)35 b Fo(17)399 2101 +y(1.4.1)93 b(Commands)29 b(F)-8 b(or)31 b(Mo)m(ving)18 +b Fi(:)f(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h +(:)31 b Fo(17)399 2211 y(1.4.2)93 b(Commands)29 b(F)-8 +b(or)31 b(Manipulating)g(The)f(History)f Fi(:)15 b(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Fo(18)399 +2320 y(1.4.3)93 b(Commands)29 b(F)-8 b(or)31 b(Changing)f(T)-8 +b(ext)12 b Fi(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)25 +b Fo(19)399 2430 y(1.4.4)93 b(Killing)31 b(And)e(Y)-8 +b(anking)13 b Fi(:)k(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fo(21)399 2540 y(1.4.5)93 +b(Sp)s(ecifying)30 b(Numeric)g(Argumen)m(ts)e Fi(:)15 +b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Fo(22)399 2649 +y(1.4.6)93 b(Letting)31 b(Readline)g(T)m(yp)s(e)f(F)-8 +b(or)31 b(Y)-8 b(ou)22 b Fi(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35 +b Fo(22)399 2759 y(1.4.7)93 b(Keyb)s(oard)29 b(Macros)11 +b Fi(:)17 b(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)24 b Fo(23)399 2868 y(1.4.8)93 +b(Some)30 b(Miscellaneous)j(Commands)16 b Fi(:)e(:)h(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f +(:)h(:)f(:)29 b Fo(23)275 2978 y(1.5)92 b(Readline)31 +b(vi)f(Mo)s(de)10 b Fi(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 +b Fo(25)150 3229 y Fm(App)t(endix)44 b(A)119 b(GNU)39 +b(F)-11 b(ree)38 b(Do)t(cumen)l(tation)i(License)25 b +Fj(:)20 b(:)32 b Fm(26)p eop end +%%Page: 1 4 +TeXDict begin 1 3 bop 3705 -116 a Fo(1)150 299 y Fk(1)80 +b(Command)54 b(Line)f(Editing)150 527 y Fo(This)30 b(c)m(hapter)h +(describ)s(es)e(the)i(basic)g(features)f(of)h(the)f Fh(gnu)g +Fo(command)h(line)f(editing)h(in)m(terface.)150 766 y +Fm(1.1)68 b(In)l(tro)t(duction)45 b(to)g(Line)h(Editing)150 +925 y Fo(The)30 b(follo)m(wing)i(paragraphs)d(describ)s(e)h(the)h +(notation)g(used)f(to)h(represen)m(t)f(k)m(eystrok)m(es.)275 +1058 y(The)35 b(text)i Fg(C-k)f Fo(is)g(read)g(as)h(`Con)m(trol-K')g +(and)f(describ)s(es)f(the)h(c)m(haracter)i(pro)s(duced)d(when)g(the)h +Fn(k)150 1168 y Fo(k)m(ey)31 b(is)g(pressed)e(while)h(the)h(Con)m(trol) +g(k)m(ey)g(is)g(depressed.)275 1301 y(The)g(text)i Fg(M-k)e +Fo(is)h(read)f(as)i(`Meta-K')g(and)f(describ)s(es)f(the)h(c)m(haracter) +h(pro)s(duced)e(when)f(the)i(Meta)150 1411 y(k)m(ey)i(\(if)f(y)m(ou)h +(ha)m(v)m(e)g(one\))g(is)f(depressed,)g(and)f(the)h Fn(k)g +Fo(k)m(ey)h(is)f(pressed.)48 b(The)32 b(Meta)j(k)m(ey)e(is)h(lab)s +(eled)f Fn(ALT)150 1521 y Fo(on)c(man)m(y)h(k)m(eyb)s(oards.)40 +b(On)29 b(k)m(eyb)s(oards)g(with)h(t)m(w)m(o)h(k)m(eys)f(lab)s(eled)g +Fn(ALT)e Fo(\(usually)i(to)g(either)g(side)g(of)g(the)150 +1630 y(space)h(bar\),)f(the)g Fn(ALT)f Fo(on)h(the)g(left)h(side)f(is)g +(generally)h(set)f(to)h(w)m(ork)f(as)g(a)h(Meta)g(k)m(ey)-8 +b(.)42 b(The)29 b Fn(ALT)g Fo(k)m(ey)i(on)150 1740 y(the)c(righ)m(t)h +(ma)m(y)g(also)g(b)s(e)f(con\014gured)f(to)i(w)m(ork)f(as)h(a)f(Meta)i +(k)m(ey)f(or)f(ma)m(y)h(b)s(e)e(con\014gured)h(as)g(some)h(other)150 +1849 y(mo)s(di\014er,)i(suc)m(h)g(as)g(a)h(Comp)s(ose)f(k)m(ey)h(for)f +(t)m(yping)h(accen)m(ted)h(c)m(haracters.)275 1983 y(If)23 +b(y)m(ou)i(do)f(not)h(ha)m(v)m(e)h(a)f(Meta)g(or)g Fn(ALT)e +Fo(k)m(ey)-8 b(,)27 b(or)e(another)f(k)m(ey)i(w)m(orking)e(as)h(a)g +(Meta)h(k)m(ey)-8 b(,)27 b(the)d(iden)m(tical)150 2092 +y(k)m(eystrok)m(e)30 b(can)f(b)s(e)f(generated)h(b)m(y)g(t)m(yping)g +Fn(ESC)e Ff(\014rst)p Fo(,)j(and)e(then)g(t)m(yping)h +Fn(k)p Fo(.)40 b(Either)28 b(pro)s(cess)g(is)g(kno)m(wn)150 +2202 y(as)j Fe(metafying)39 b Fo(the)30 b Fn(k)g Fo(k)m(ey)-8 +b(.)275 2335 y(The)39 b(text)j Fg(M-C-k)d Fo(is)h(read)g(as)h +(`Meta-Con)m(trol-k')j(and)39 b(describ)s(es)h(the)g(c)m(haracter)i +(pro)s(duced)d(b)m(y)150 2445 y Fe(metafying)g Fg(C-k)p +Fo(.)275 2578 y(In)c(addition,)j(sev)m(eral)f(k)m(eys)g(ha)m(v)m(e)g +(their)f(o)m(wn)g(names.)58 b(Sp)s(eci\014cally)-8 b(,)38 +b Fn(DEL)p Fo(,)f Fn(ESC)p Fo(,)g Fn(LFD)p Fo(,)g Fn(SPC)p +Fo(,)g Fn(RET)p Fo(,)150 2688 y(and)d Fn(TAB)f Fo(all)j(stand)e(for)g +(themselv)m(es)i(when)d(seen)i(in)f(this)g(text,)j(or)d(in)h(an)f(init) +h(\014le)f(\(see)i(Section)f(1.3)150 2797 y([Readline)c(Init)e(File],)j +(page)e(4\).)41 b(If)29 b(y)m(our)h(k)m(eyb)s(oard)f(lac)m(ks)i(a)f +Fn(LFD)f Fo(k)m(ey)-8 b(,)31 b(t)m(yping)g Fn(C-j)d Fo(will)i(pro)s +(duce)f(the)150 2907 y(desired)h(c)m(haracter.)42 b(The)30 +b Fn(RET)g Fo(k)m(ey)h(ma)m(y)g(b)s(e)e(lab)s(eled)i +Fn(Return)e Fo(or)h Fn(Enter)f Fo(on)h(some)h(k)m(eyb)s(oards.)150 +3145 y Fm(1.2)68 b(Readline)47 b(In)l(teraction)150 3305 +y Fo(Often)32 b(during)g(an)g(in)m(teractiv)m(e)j(session)e(y)m(ou)g(t) +m(yp)s(e)g(in)f(a)h(long)g(line)g(of)f(text,)j(only)d(to)i(notice)g +(that)f(the)150 3414 y(\014rst)f(w)m(ord)g(on)g(the)g(line)h(is)g +(missp)s(elled.)46 b(The)32 b(Readline)h(library)f(giv)m(es)h(y)m(ou)g +(a)g(set)g(of)f(commands)g(for)150 3524 y(manipulating)e(the)g(text)h +(as)f(y)m(ou)g(t)m(yp)s(e)g(it)g(in,)g(allo)m(wing)h(y)m(ou)f(to)h +(just)e(\014x)g(y)m(our)h(t)m(yp)s(o,)g(and)g(not)g(forcing)150 +3634 y(y)m(ou)e(to)h(ret)m(yp)s(e)g(the)f(ma)5 b(jorit)m(y)29 +b(of)f(the)h(line.)40 b(Using)28 b(these)h(editing)g(commands,)f(y)m +(ou)h(mo)m(v)m(e)g(the)g(cursor)150 3743 y(to)35 b(the)f(place)i(that)e +(needs)g(correction,)j(and)d(delete)h(or)f(insert)h(the)f(text)h(of)g +(the)f(corrections.)54 b(Then,)150 3853 y(when)24 b(y)m(ou)h(are)g +(satis\014ed)g(with)g(the)g(line,)i(y)m(ou)e(simply)f(press)g +Fn(RET)p Fo(.)39 b(Y)-8 b(ou)25 b(do)g(not)g(ha)m(v)m(e)h(to)g(b)s(e)e +(at)h(the)h(end)150 3962 y(of)33 b(the)h(line)g(to)g(press)e +Fn(RET)p Fo(;)i(the)g(en)m(tire)g(line)f(is)h(accepted)g(regardless)g +(of)f(the)h(lo)s(cation)h(of)e(the)h(cursor)150 4072 +y(within)c(the)g(line.)150 4269 y Fd(1.2.1)63 b(Readline)40 +b(Bare)h(Essen)m(tials)150 4416 y Fo(In)31 b(order)h(to)h(en)m(ter)g(c) +m(haracters)g(in)m(to)g(the)g(line,)g(simply)e(t)m(yp)s(e)i(them.)46 +b(The)31 b(t)m(yp)s(ed)h(c)m(haracter)i(app)s(ears)150 +4525 y(where)e(the)h(cursor)e(w)m(as,)j(and)e(then)g(the)h(cursor)e(mo) +m(v)m(es)j(one)f(space)g(to)g(the)g(righ)m(t.)47 b(If)32 +b(y)m(ou)h(mist)m(yp)s(e)g(a)150 4635 y(c)m(haracter,)f(y)m(ou)f(can)g +(use)f(y)m(our)g(erase)h(c)m(haracter)h(to)f(bac)m(k)g(up)f(and)f +(delete)j(the)f(mist)m(yp)s(ed)e(c)m(haracter.)275 4768 +y(Sometimes)i(y)m(ou)g(ma)m(y)h(mist)m(yp)s(e)e(a)i(c)m(haracter,)g +(and)e(not)i(notice)g(the)f(error)f(un)m(til)h(y)m(ou)g(ha)m(v)m(e)h(t) +m(yp)s(ed)150 4878 y(sev)m(eral)e(other)f(c)m(haracters.)42 +b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h +Fg(C-b)d Fo(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150 +4987 y(then)f(correct)i(y)m(our)e(mistak)m(e.)42 b(Afterw)m(ards,)31 +b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)g +(with)f Fg(C-f)p Fo(.)275 5121 y(When)i(y)m(ou)h(add)f(text)h(in)f(the) +h(middle)f(of)h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m +(haracters)h(to)g(the)e(righ)m(t)150 5230 y(of)d(the)g(cursor)f(are)h +(`pushed)e(o)m(v)m(er')j(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h +(that)f(y)m(ou)g(ha)m(v)m(e)h(inserted.)40 b(Lik)m(ewise,)150 +5340 y(when)d(y)m(ou)g(delete)i(text)g(b)s(ehind)c(the)j(cursor,)h(c)m +(haracters)g(to)f(the)g(righ)m(t)g(of)g(the)g(cursor)e(are)i(`pulled)p +eop end +%%Page: 2 5 +TeXDict begin 2 4 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(2)150 299 y(bac)m(k')24 +b(to)f(\014ll)g(in)f(the)h(blank)f(space)i(created)f(b)m(y)g(the)g +(remo)m(v)-5 b(al)24 b(of)f(the)g(text.)39 b(A)23 b(list)g(of)g(the)g +(bare)f(essen)m(tials)150 408 y(for)30 b(editing)h(the)g(text)g(of)g +(an)f(input)f(line)i(follo)m(ws.)150 571 y Fg(C-b)336 +b Fo(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m(haracter.)150 +732 y Fg(C-f)336 b Fo(Mo)m(v)m(e)32 b(forw)m(ard)e(one)h(c)m(haracter.) +150 893 y Fn(DEL)e Fo(or)i Fn(Backspace)630 1003 y Fo(Delete)i(the)d(c) +m(haracter)i(to)f(the)g(left)g(of)f(the)h(cursor.)150 +1164 y Fg(C-d)336 b Fo(Delete)33 b(the)d(c)m(haracter)i(underneath)d +(the)i(cursor.)150 1325 y(Prin)m(ting)g(c)m(haracters)630 +1435 y(Insert)f(the)g(c)m(haracter)i(in)m(to)g(the)e(line)h(at)g(the)g +(cursor.)150 1596 y Fg(C-_)e Fo(or)i Fg(C-x)e(C-u)630 +1706 y Fo(Undo)k(the)h(last)g(editing)g(command.)50 b(Y)-8 +b(ou)34 b(can)f(undo)g(all)h(the)f(w)m(a)m(y)i(bac)m(k)f(to)g(an)g +(empt)m(y)630 1815 y(line.)150 1977 y(\(Dep)s(ending)c(on)g(y)m(our)g +(con\014guration,)h(the)f Fn(Backspace)d Fo(k)m(ey)k(migh)m(t)g(b)s(e)e +(set)i(to)g(delete)g(the)f(c)m(haracter)150 2087 y(to)h(the)f(left)h +(of)f(the)g(cursor)f(and)h(the)g Fn(DEL)f Fo(k)m(ey)i(set)g(to)f +(delete)i(the)e(c)m(haracter)h(underneath)e(the)h(cursor,)150 +2196 y(lik)m(e)i Fg(C-d)p Fo(,)d(rather)i(than)f(the)g(c)m(haracter)i +(to)f(the)g(left)g(of)g(the)f(cursor.\))150 2398 y Fd(1.2.2)63 +b(Readline)40 b(Mo)m(v)m(emen)m(t)h(Commands)150 2545 +y Fo(The)27 b(ab)s(o)m(v)m(e)i(table)g(describ)s(es)e(the)g(most)i +(basic)f(k)m(eystrok)m(es)h(that)f(y)m(ou)g(need)g(in)f(order)g(to)i +(do)e(editing)i(of)150 2654 y(the)k(input)f(line.)49 +b(F)-8 b(or)34 b(y)m(our)f(con)m(v)m(enience,)j(man)m(y)d(other)g +(commands)f(ha)m(v)m(e)j(b)s(een)d(added)g(in)h(addition)150 +2764 y(to)j Fg(C-b)p Fo(,)f Fg(C-f)p Fo(,)g Fg(C-d)p +Fo(,)h(and)e Fn(DEL)p Fo(.)54 b(Here)35 b(are)g(some)h(commands)e(for)h +(mo)m(ving)h(more)f(rapidly)f(ab)s(out)h(the)150 2873 +y(line.)150 3035 y Fg(C-a)336 b Fo(Mo)m(v)m(e)32 b(to)g(the)e(start)h +(of)g(the)f(line.)150 3197 y Fg(C-e)336 b Fo(Mo)m(v)m(e)32 +b(to)g(the)e(end)g(of)g(the)h(line.)150 3358 y Fg(M-f)336 +b Fo(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m(ord,)f(where)g(a)h(w)m(ord)f +(is)g(comp)s(osed)g(of)h(letters)h(and)d(digits.)150 +3519 y Fg(M-b)336 b Fo(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)g(w)m(ord.) +150 3680 y Fg(C-l)336 b Fo(Clear)31 b(the)f(screen,)h(reprin)m(ting)f +(the)h(curren)m(t)f(line)h(at)g(the)f(top.)275 3843 y(Notice)c(ho)m(w)f +Fg(C-f)e Fo(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m(haracter,)j(while)d +Fg(M-f)e Fo(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m(ord.)39 +b(It)24 b(is)h(a)g(lo)s(ose)150 3952 y(con)m(v)m(en)m(tion)32 +b(that)f(con)m(trol)g(k)m(eystrok)m(es)h(op)s(erate)e(on)g(c)m +(haracters)h(while)f(meta)h(k)m(eystrok)m(es)h(op)s(erate)e(on)150 +4062 y(w)m(ords.)150 4263 y Fd(1.2.3)63 b(Readline)40 +b(Killing)i(Commands)150 4410 y Fe(Killing)35 b Fo(text)28 +b(means)e(to)h(delete)h(the)f(text)g(from)g(the)f(line,)i(but)e(to)h +(sa)m(v)m(e)h(it)g(a)m(w)m(a)m(y)g(for)e(later)i(use,)f(usually)150 +4519 y(b)m(y)g Fe(y)m(anking)35 b Fo(\(re-inserting\))28 +b(it)g(bac)m(k)f(in)m(to)h(the)f(line.)40 b(\(`Cut')27 +b(and)g(`paste')h(are)f(more)g(recen)m(t)h(jargon)f(for)150 +4629 y(`kill')32 b(and)d(`y)m(ank'.\))275 4765 y(If)g(the)i +(description)f(for)g(a)h(command)f(sa)m(ys)g(that)h(it)g(`kills')g +(text,)h(then)e(y)m(ou)g(can)h(b)s(e)e(sure)h(that)h(y)m(ou)150 +4875 y(can)g(get)g(the)g(text)g(bac)m(k)g(in)f(a)h(di\013eren)m(t)g +(\(or)g(the)f(same\))h(place)h(later.)275 5011 y(When)23 +b(y)m(ou)g(use)g(a)h(kill)g(command,)g(the)g(text)g(is)f(sa)m(v)m(ed)i +(in)e(a)g Fe(kill-ring)p Fo(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h +(consecutiv)m(e)150 5121 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g +(killed)h(text)g(together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)f +(bac)m(k,)h(y)m(ou)g(get)g(it)f(all.)43 b(The)150 5230 +y(kill)33 b(ring)f(is)g(not)h(line)g(sp)s(eci\014c;)g(the)g(text)g +(that)g(y)m(ou)g(killed)f(on)h(a)f(previously)g(t)m(yp)s(ed)h(line)f +(is)h(a)m(v)-5 b(ailable)150 5340 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac) +m(k)g(later,)h(when)d(y)m(ou)i(are)g(t)m(yping)f(another)h(line.)p +eop end +%%Page: 3 6 +TeXDict begin 3 5 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(3)275 299 y(Here)30 +b(is)h(the)f(list)h(of)g(commands)f(for)g(killing)h(text.)150 +456 y Fg(C-k)336 b Fo(Kill)31 b(the)f(text)i(from)e(the)g(curren)m(t)g +(cursor)g(p)s(osition)h(to)g(the)f(end)g(of)g(the)h(line.)150 +614 y Fg(M-d)336 b Fo(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g +(of)h(the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m +(ords,)g(to)g(the)630 723 y(end)j(of)g(the)h(next)f(w)m(ord.)41 +b(W)-8 b(ord)30 b(b)s(oundaries)f(are)i(the)g(same)f(as)h(those)g(used) +f(b)m(y)g Fg(M-f)p Fo(.)150 881 y Fg(M-DEL)240 b Fo(Kill)34 +b(from)f(the)g(cursor)g(to)h(the)g(start)g(of)g(the)f(curren)m(t)g(w)m +(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m(ords,)g(to)630 +991 y(the)28 b(start)g(of)g(the)g(previous)f(w)m(ord.)39 +b(W)-8 b(ord)28 b(b)s(oundaries)e(are)i(the)g(same)g(as)g(those)g(used) +f(b)m(y)630 1100 y Fg(M-b)p Fo(.)150 1258 y Fg(C-w)336 +b Fo(Kill)35 b(from)g(the)g(cursor)f(to)i(the)f(previous)g(whitespace.) +55 b(This)34 b(is)h(di\013eren)m(t)h(than)e Fg(M-DEL)630 +1367 y Fo(b)s(ecause)c(the)h(w)m(ord)f(b)s(oundaries)f(di\013er.)275 +1525 y(Here)42 b(is)f(ho)m(w)h(to)g Fe(y)m(ank)47 b Fo(the)42 +b(text)g(bac)m(k)h(in)m(to)f(the)g(line.)74 b(Y)-8 b(anking)43 +b(means)e(to)h(cop)m(y)h(the)e(most-)150 1634 y(recen)m(tly-killed)33 +b(text)e(from)f(the)g(kill)i(bu\013er.)150 1792 y Fg(C-y)336 +b Fo(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h(killed)f(text)g(bac)m +(k)g(in)m(to)h(the)e(bu\013er)g(at)h(the)f(cursor.)150 +1949 y Fg(M-y)336 b Fo(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h +(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h +(the)g(prior)630 2059 y(command)30 b(is)h Fg(C-y)e Fo(or)h +Fg(M-y)p Fo(.)150 2256 y Fd(1.2.4)63 b(Readline)40 b(Argumen)m(ts)150 +2403 y Fo(Y)-8 b(ou)40 b(can)f(pass)g(n)m(umeric)f(argumen)m(ts)i(to)f +(Readline)h(commands.)67 b(Sometimes)39 b(the)g(argumen)m(t)h(acts)150 +2513 y(as)g(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)f(it)h(is)f(the)g +Ff(sign)47 b Fo(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m +(t.)71 b(If)40 b(y)m(ou)150 2622 y(pass)33 b(a)h(negativ)m(e)i(argumen) +m(t)e(to)g(a)g(command)f(whic)m(h)g(normally)h(acts)g(in)f(a)h(forw)m +(ard)f(direction,)i(that)150 2732 y(command)g(will)h(act)g(in)f(a)h +(bac)m(kw)m(ard)f(direction.)57 b(F)-8 b(or)36 b(example,)h(to)f(kill)g +(text)g(bac)m(k)g(to)g(the)g(start)g(of)150 2842 y(the)31 +b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Fn(M--)f(C-k)p +Fo('.)275 2975 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g +(argumen)m(ts)h(to)g(a)f(command)g(is)g(to)h(t)m(yp)s(e)f(meta)i +(digits)e(b)s(efore)150 3085 y(the)j(command.)42 b(If)30 +b(the)h(\014rst)f(`digit')i(t)m(yp)s(ed)f(is)g(a)g(min)m(us)f(sign)h +(\(`)p Fn(-)p Fo('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150 +3194 y(will)39 b(b)s(e)e(negativ)m(e.)66 b(Once)38 b(y)m(ou)h(ha)m(v)m +(e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)g(to)f(get)i(the)e(argumen)m(t)h +(started,)i(y)m(ou)150 3304 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)f +(of)h(the)g(digits,)h(and)f(then)f(the)h(command.)40 +b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fg(C-d)150 +3414 y Fo(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f +(t)m(yp)s(e)h(`)p Fn(M-1)29 b(0)h(C-d)p Fo(',)39 b(whic)m(h)e(will)h +(delete)h(the)e(next)h(ten)150 3523 y(c)m(haracters)32 +b(on)e(the)h(input)e(line.)150 3720 y Fd(1.2.5)63 b(Searc)m(hing)40 +b(for)i(Commands)g(in)f(the)g(History)150 3867 y Fo(Readline)22 +b(pro)m(vides)f(commands)g(for)g(searc)m(hing)h(through)f(the)g +(command)h(history)f(for)g(lines)g(con)m(taining)150 +3977 y(a)31 b(sp)s(eci\014ed)e(string.)41 b(There)30 +b(are)h(t)m(w)m(o)g(searc)m(h)g(mo)s(des:)41 b Fe(incremen)m(tal)35 +b Fo(and)30 b Fe(non-incremen)m(tal)p Fo(.)275 4111 y(Incremen)m(tal)c +(searc)m(hes)h(b)s(egin)e(b)s(efore)g(the)h(user)f(has)h(\014nished)e +(t)m(yping)i(the)g(searc)m(h)g(string.)39 b(As)26 b(eac)m(h)150 +4220 y(c)m(haracter)37 b(of)e(the)h(searc)m(h)g(string)f(is)h(t)m(yp)s +(ed,)g(Readline)g(displa)m(ys)g(the)f(next)h(en)m(try)g(from)e(the)i +(history)150 4330 y(matc)m(hing)25 b(the)f(string)g(t)m(yp)s(ed)g(so)g +(far.)39 b(An)23 b(incremen)m(tal)j(searc)m(h)e(requires)g(only)g(as)g +(man)m(y)g(c)m(haracters)i(as)150 4439 y(needed)i(to)i(\014nd)d(the)i +(desired)f(history)h(en)m(try)-8 b(.)41 b(T)-8 b(o)29 +b(searc)m(h)h(bac)m(kw)m(ard)f(in)f(the)h(history)g(for)f(a)i +(particular)150 4549 y(string,)g(t)m(yp)s(e)f Fg(C-r)p +Fo(.)40 b(T)m(yping)29 b Fg(C-s)g Fo(searc)m(hes)h(forw)m(ard)f +(through)g(the)g(history)-8 b(.)41 b(The)29 b(c)m(haracters)i(presen)m +(t)150 4658 y(in)38 b(the)g(v)-5 b(alue)38 b(of)g(the)g +Fn(isearch-terminators)33 b Fo(v)-5 b(ariable)39 b(are)f(used)f(to)i +(terminate)g(an)f(incremen)m(tal)150 4768 y(searc)m(h.)71 +b(If)40 b(that)h(v)-5 b(ariable)41 b(has)f(not)h(b)s(een)e(assigned)i +(a)f(v)-5 b(alue,)44 b(the)c Fn(ESC)g Fo(and)f Fg(C-J)h +Fo(c)m(haracters)i(will)150 4878 y(terminate)h(an)g(incremen)m(tal)g +(searc)m(h.)78 b Fg(C-g)41 b Fo(will)i(ab)s(ort)f(an)g(incremen)m(tal)i +(searc)m(h)f(and)f(restore)h(the)150 4987 y(original)30 +b(line.)41 b(When)28 b(the)h(searc)m(h)h(is)f(terminated,)h(the)f +(history)g(en)m(try)g(con)m(taining)h(the)f(searc)m(h)h(string)150 +5097 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275 5230 +y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)g(en)m(tries)g(in)e(the)h +(history)g(list,)h(t)m(yp)s(e)g Fg(C-r)e Fo(or)h Fg(C-s)f +Fo(as)h(appropriate.)43 b(This)150 5340 y(will)26 b(searc)m(h)h(bac)m +(kw)m(ard)g(or)f(forw)m(ard)g(in)f(the)i(history)f(for)g(the)g(next)g +(en)m(try)h(matc)m(hing)g(the)f(searc)m(h)h(string)p +eop end +%%Page: 4 7 +TeXDict begin 4 6 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(4)150 299 y(t)m(yp)s(ed)37 +b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i(sequence)f(b)s(ound)e(to) +i(a)g(Readline)h(command)e(will)h(terminate)h(the)150 +408 y(searc)m(h)26 b(and)f(execute)i(that)f(command.)39 +b(F)-8 b(or)26 b(instance,)h(a)f Fn(RET)f Fo(will)g(terminate)i(the)f +(searc)m(h)g(and)e(accept)150 518 y(the)30 b(line,)g(thereb)m(y)f +(executing)i(the)e(command)g(from)g(the)h(history)f(list.)41 +b(A)29 b(mo)m(v)m(emen)m(t)j(command)d(will)150 628 y(terminate)i(the)g +(searc)m(h,)g(mak)m(e)h(the)e(last)h(line)g(found)e(the)i(curren)m(t)f +(line,)h(and)f(b)s(egin)g(editing.)275 777 y(Readline)35 +b(remem)m(b)s(ers)f(the)h(last)h(incremen)m(tal)g(searc)m(h)f(string.) +54 b(If)34 b(t)m(w)m(o)j Fg(C-r)p Fo(s)c(are)i(t)m(yp)s(ed)g(without) +150 886 y(an)m(y)i(in)m(terv)m(ening)g(c)m(haracters)h(de\014ning)e(a)h +(new)f(searc)m(h)h(string,)h(an)m(y)f(remem)m(b)s(ered)e(searc)m(h)i +(string)g(is)150 996 y(used.)275 1145 y(Non-incremen)m(tal)48 +b(searc)m(hes)g(read)e(the)h(en)m(tire)h(searc)m(h)f(string)g(b)s +(efore)f(starting)h(to)h(searc)m(h)f(for)150 1255 y(matc)m(hing)d +(history)e(lines.)78 b(The)42 b(searc)m(h)h(string)g(ma)m(y)g(b)s(e)f +(t)m(yp)s(ed)g(b)m(y)g(the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150 +1364 y(con)m(ten)m(ts)32 b(of)f(the)f(curren)m(t)g(line.)150 +1627 y Fm(1.3)68 b(Readline)47 b(Init)e(File)150 1786 +y Fo(Although)f(the)g(Readline)g(library)f(comes)i(with)e(a)h(set)h(of) +f(Emacs-lik)m(e)h(k)m(eybindings)f(installed)g(b)m(y)150 +1896 y(default,)26 b(it)g(is)e(p)s(ossible)h(to)g(use)f(a)i(di\013eren) +m(t)f(set)g(of)g(k)m(eybindings.)38 b(An)m(y)25 b(user)f(can)h +(customize)h(programs)150 2005 y(that)39 b(use)g(Readline)g(b)m(y)f +(putting)h(commands)f(in)g(an)h Fe(inputrc)k Fo(\014le,)e(con)m(v)m(en) +m(tionally)h(in)c(their)h(home)150 2115 y(directory)-8 +b(.)39 b(The)23 b(name)h(of)f(this)h(\014le)f(is)g(tak)m(en)i(from)e +(the)g(v)-5 b(alue)24 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5 +b(ariable)25 b Fn(INPUTRC)p Fo(.)150 2224 y(If)30 b(that)g(v)-5 +b(ariable)31 b(is)f(unset,)g(the)h(default)f(is)g Fn(~/.inputrc)p +Fo(.)38 b(If)30 b(that)g(\014le)h(do)s(es)e(not)i(exist)g(or)f(cannot)h +(b)s(e)150 2334 y(read,)g(the)f(ultimate)i(default)e(is)h +Fn(/etc/inputrc)p Fo(.)275 2483 y(When)e(a)h(program)f(whic)m(h)h(uses) +f(the)h(Readline)g(library)f(starts)h(up,)f(the)h(init)g(\014le)f(is)h +(read,)g(and)f(the)150 2593 y(k)m(ey)i(bindings)e(are)i(set.)275 +2742 y(In)26 b(addition,)i(the)f Fn(C-x)i(C-r)d Fo(command)h(re-reads)g +(this)f(init)h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m +(hanges)150 2851 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g +(it.)150 3065 y Fd(1.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)150 +3212 y Fo(There)f(are)i(only)f(a)g(few)g(basic)g(constructs)h(allo)m(w) +m(ed)h(in)d(the)h(Readline)h(init)f(\014le.)73 b(Blank)41 +b(lines)h(are)150 3322 y(ignored.)72 b(Lines)41 b(b)s(eginning)f(with)h +(a)g(`)p Fn(#)p Fo(')g(are)h(commen)m(ts.)73 b(Lines)41 +b(b)s(eginning)f(with)g(a)i(`)p Fn($)p Fo(')f(indicate)150 +3431 y(conditional)i(constructs)e(\(see)i(Section)f(1.3.2)h +([Conditional)f(Init)f(Constructs],)j(page)f(13\).)74 +b(Other)150 3541 y(lines)31 b(denote)g(v)-5 b(ariable)31 +b(settings)g(and)f(k)m(ey)h(bindings.)150 3722 y(V)-8 +b(ariable)32 b(Settings)630 3832 y(Y)-8 b(ou)41 b(can)g(mo)s(dify)e +(the)i(run-time)f(b)s(eha)m(vior)g(of)h(Readline)g(b)m(y)f(altering)h +(the)g(v)-5 b(alues)41 b(of)630 3941 y(v)-5 b(ariables)34 +b(in)f(Readline)i(using)e(the)g Fn(set)g Fo(command)g(within)g(the)h +(init)g(\014le.)50 b(The)33 b(syn)m(tax)630 4051 y(is)d(simple:)870 +4193 y Fn(set)47 b Fg(variable)e(value)630 4335 y Fo(Here,)29 +b(for)e(example,)h(is)g(ho)m(w)f(to)h(c)m(hange)g(from)f(the)g(default) +h(Emacs-lik)m(e)h(k)m(ey)f(binding)e(to)630 4444 y(use)k +Fn(vi)g Fo(line)h(editing)g(commands:)870 4586 y Fn(set)47 +b(editing-mode)d(vi)630 4728 y Fo(V)-8 b(ariable)36 b(names)f(and)g(v) +-5 b(alues,)36 b(where)f(appropriate,)h(are)g(recognized)g(without)f +(regard)630 4837 y(to)c(case.)42 b(Unrecognized)31 b(v)-5 +b(ariable)31 b(names)g(are)f(ignored.)630 4979 y(Bo)s(olean)c(v)-5 +b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f(set)i(to)g(on)f(or)g +(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the)g(v)-5 +b(alue)26 b(is)630 5089 y(n)m(ull)e(or)g(empt)m(y)-8 +b(,)27 b Fe(on)d Fo(\(case-insensitiv)m(e\),)29 b(or)24 +b(1.)39 b(An)m(y)25 b(other)f(v)-5 b(alue)25 b(results)f(in)g(the)g(v) +-5 b(ariable)630 5198 y(b)s(eing)30 b(set)h(to)g(o\013.)630 +5340 y(A)f(great)i(deal)f(of)g(run-time)f(b)s(eha)m(vior)g(is)g(c)m +(hangeable)j(with)d(the)g(follo)m(wing)i(v)-5 b(ariables.)p +eop end +%%Page: 5 8 +TeXDict begin 5 7 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(5)630 299 y Fn +(active-region-start-colo)o(r)1110 408 y Fo(A)27 b(string)f(v)-5 +b(ariable)27 b(that)g(con)m(trols)h(the)f(text)g(color)h(and)e(bac)m +(kground)g(when)1110 518 y(displa)m(ying)50 b(the)f(text)h(in)f(the)h +(activ)m(e)h(region)f(\(see)g(the)g(description)f(of)1110 +628 y Fn(enable-active-region)25 b Fo(b)s(elo)m(w\).)43 +b(This)30 b(string)h(m)m(ust)f(not)h(tak)m(e)i(up)d(an)m(y)1110 +737 y(ph)m(ysical)25 b(c)m(haracter)h(p)s(ositions)f(on)g(the)f(displa) +m(y)-8 b(,)27 b(so)e(it)g(should)f(consist)h(only)1110 +847 y(of)37 b(terminal)g(escap)s(e)g(sequences.)61 b(It)36 +b(is)h(output)g(to)g(the)g(terminal)g(b)s(efore)1110 +956 y(displa)m(ying)h(the)f(text)i(in)e(the)h(activ)m(e)h(region.)63 +b(This)37 b(v)-5 b(ariable)38 b(is)f(reset)h(to)1110 +1066 y(the)29 b(default)g(v)-5 b(alue)29 b(whenev)m(er)f(the)h +(terminal)g(t)m(yp)s(e)g(c)m(hanges.)41 b(The)28 b(default)1110 +1176 y(v)-5 b(alue)30 b(is)f(the)g(string)g(that)h(puts)e(the)i +(terminal)f(in)g(standout)g(mo)s(de,)g(as)h(ob-)1110 +1285 y(tained)40 b(from)f(the)h(terminal's)g(terminfo)g(description.)68 +b(A)40 b(sample)f(v)-5 b(alue)1110 1395 y(migh)m(t)31 +b(b)s(e)f(`)p Fn(\\e[01;33m)p Fo('.)630 1570 y Fn +(active-region-end-color)1110 1680 y Fo(A)48 b(string)g(v)-5 +b(ariable)48 b(that)h Fn(")p Fo(undo)s(es)p Fn(")d Fo(the)i(e\013ects)h +(of)f Fn(active-region-)1110 1789 y(start-color)36 b +Fo(and)i(restores)h Fn(")p Fo(normal)p Fn(")f Fo(terminal)h(displa)m(y) +g(app)s(earance)1110 1899 y(after)26 b(displa)m(ying)h(text)f(in)g(the) +g(activ)m(e)i(region.)40 b(This)25 b(string)h(m)m(ust)f(not)h(tak)m(e) +1110 2008 y(up)e(an)m(y)h(ph)m(ysical)h(c)m(haracter)h(p)s(ositions)d +(on)h(the)h(displa)m(y)-8 b(,)27 b(so)e(it)g(should)f(con-)1110 +2118 y(sist)29 b(only)h(of)f(terminal)h(escap)s(e)f(sequences.)41 +b(It)29 b(is)g(output)g(to)h(the)f(terminal)1110 2228 +y(after)36 b(displa)m(ying)g(the)g(text)h(in)e(the)h(activ)m(e)i +(region.)58 b(This)34 b(v)-5 b(ariable)37 b(is)f(re-)1110 +2337 y(set)e(to)g(the)g(default)g(v)-5 b(alue)34 b(whenev)m(er)f(the)h +(terminal)g(t)m(yp)s(e)f(c)m(hanges.)51 b(The)1110 2447 +y(default)38 b(v)-5 b(alue)39 b(is)f(the)h(string)f(that)h(restores)f +(the)h(terminal)f(from)g(stand-)1110 2556 y(out)30 b(mo)s(de,)f(as)g +(obtained)h(from)f(the)g(terminal's)h(terminfo)f(description.)41 +b(A)1110 2666 y(sample)31 b(v)-5 b(alue)30 b(migh)m(t)h(b)s(e)f(`)p +Fn(\\e[0m)p Fo('.)630 2841 y Fn(bell-style)1110 2951 +y Fo(Con)m(trols)44 b(what)g(happ)s(ens)e(when)h(Readline)i(w)m(an)m +(ts)f(to)h(ring)e(the)h(termi-)1110 3061 y(nal)37 b(b)s(ell.)61 +b(If)37 b(set)h(to)g(`)p Fn(none)p Fo(',)g(Readline)g(nev)m(er)g(rings) +e(the)i(b)s(ell.)61 b(If)36 b(set)i(to)1110 3170 y(`)p +Fn(visible)p Fo(',)32 b(Readline)i(uses)f(a)g(visible)g(b)s(ell)g(if)g +(one)g(is)g(a)m(v)-5 b(ailable.)51 b(If)33 b(set)g(to)1110 +3280 y(`)p Fn(audible)p Fo(')j(\(the)i(default\),)i(Readline)e +(attempts)g(to)h(ring)e(the)g(terminal's)1110 3389 y(b)s(ell.)630 +3565 y Fn(bind-tty-special-chars)1110 3674 y Fo(If)e(set)g(to)h(`)p +Fn(on)p Fo(')f(\(the)g(default\),)i(Readline)f(attempts)g(to)g(bind)d +(the)i(con)m(trol)1110 3784 y(c)m(haracters)30 b(treated)g(sp)s +(ecially)g(b)m(y)f(the)g(k)m(ernel's)h(terminal)f(driv)m(er)g(to)h +(their)1110 3893 y(Readline)h(equiv)-5 b(alen)m(ts.)630 +4069 y Fn(blink-matching-paren)1110 4178 y Fo(If)36 b(set)g(to)h(`)p +Fn(on)p Fo(',)h(Readline)f(attempts)g(to)g(brie\015y)e(mo)m(v)m(e)j +(the)f(cursor)e(to)i(an)1110 4288 y(op)s(ening)k(paren)m(thesis)h(when) +f(a)h(closing)h(paren)m(thesis)e(is)h(inserted.)74 b(The)1110 +4398 y(default)31 b(is)f(`)p Fn(off)p Fo('.)630 4573 +y Fn(colored-completion-prefi)o(x)1110 4682 y Fo(If)f(set)h(to)g(`)p +Fn(on)p Fo(',)g(when)e(listing)i(completions,)h(Readline)f(displa)m(ys) +g(the)f(com-)1110 4792 y(mon)c(pre\014x)f(of)i(the)f(set)h(of)g(p)s +(ossible)f(completions)h(using)f(a)h(di\013eren)m(t)g(color.)1110 +4902 y(The)f(color)h(de\014nitions)f(are)h(tak)m(en)g(from)f(the)g(v)-5 +b(alue)26 b(of)g(the)f Fn(LS_COLORS)e Fo(en-)1110 5011 +y(vironmen)m(t)34 b(v)-5 b(ariable.)50 b(If)33 b(there)h(is)g(a)f +(color)i(de\014nition)e(in)g Fn(LS_COLORS)e Fo(for)1110 +5121 y(the)22 b(custom)g(su\016x)f(`)p Fn(readline-colored-complet)o +(ion)o(-pre)o(fix)p Fo(',)c(Read-)1110 5230 y(line)24 +b(uses)e(this)i(color)g(for)f(the)h(common)f(pre\014x)f(instead)i(of)f +(its)h(default.)38 b(The)1110 5340 y(default)31 b(is)f(`)p +Fn(off)p Fo('.)p eop end +%%Page: 6 9 +TeXDict begin 6 8 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(6)630 299 y Fn(colored-stats)1110 +408 y Fo(If)26 b(set)h(to)g(`)p Fn(on)p Fo(',)h(Readline)f(displa)m(ys) +g(p)s(ossible)f(completions)h(using)f(di\013eren)m(t)1110 +518 y(colors)40 b(to)g(indicate)g(their)f(\014le)h(t)m(yp)s(e.)67 +b(The)38 b(color)j(de\014nitions)d(are)i(tak)m(en)1110 +628 y(from)24 b(the)h(v)-5 b(alue)25 b(of)g(the)g Fn(LS_COLORS)d +Fo(en)m(vironmen)m(t)j(v)-5 b(ariable.)40 b(The)24 b(default)1110 +737 y(is)30 b(`)p Fn(off)p Fo('.)630 925 y Fn(comment-begin)1110 +1035 y Fo(The)62 b(string)g(to)h(insert)f(at)h(the)g(b)s(eginning)e(of) +h(the)h(line)f(when)g(the)1110 1144 y Fn(insert-comment)26 +b Fo(command)31 b(is)f(executed.)42 b(The)30 b(default)g(v)-5 +b(alue)31 b(is)f Fn("#")p Fo(.)630 1332 y Fn(completion-display-width) +1110 1442 y Fo(The)41 b(n)m(um)m(b)s(er)f(of)i(screen)g(columns)f(used) +g(to)h(displa)m(y)g(p)s(ossible)f(matc)m(hes)1110 1551 +y(when)28 b(p)s(erforming)g(completion.)41 b(The)29 b(v)-5 +b(alue)29 b(is)g(ignored)g(if)g(it)h(is)f(less)g(than)1110 +1661 y(0)e(or)f(greater)h(than)f(the)g(terminal)h(screen)f(width.)39 +b(A)26 b(v)-5 b(alue)27 b(of)f(0)h(will)f(cause)1110 +1771 y(matc)m(hes)32 b(to)f(b)s(e)e(displa)m(y)m(ed)i(one)g(p)s(er)e +(line.)41 b(The)30 b(default)h(v)-5 b(alue)31 b(is)f(-1.)630 +1958 y Fn(completion-ignore-case)1110 2068 y Fo(If)d(set)h(to)g(`)p +Fn(on)p Fo(',)g(Readline)g(p)s(erforms)e(\014lename)h(matc)m(hing)i +(and)e(completion)1110 2178 y(in)j(a)h(case-insensitiv)m(e)i(fashion.) +40 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p Fn(off)p +Fo('.)630 2365 y Fn(completion-map-case)1110 2475 y Fo(If)22 +b(set)g(to)h(`)p Fn(on)p Fo(',)h(and)e Fe(completion-ignore-case)31 +b Fo(is)22 b(enabled,)i(Readline)f(treats)1110 2585 y(h)m(yphens)29 +b(\(`)p Fn(-)p Fo('\))j(and)e(underscores)g(\(`)p Fn(_)p +Fo('\))i(as)f(equiv)-5 b(alen)m(t)32 b(when)e(p)s(erforming)1110 +2694 y(case-insensitiv)m(e)47 b(\014lename)e(matc)m(hing)g(and)f +(completion.)85 b(The)44 b(default)1110 2804 y(v)-5 b(alue)31 +b(is)f(`)p Fn(off)p Fo('.)630 2992 y Fn(completion-prefix-displa)o +(y-le)o(ngth)1110 3101 y Fo(The)h(length)g(in)g(c)m(haracters)i(of)f +(the)f(common)h(pre\014x)e(of)h(a)h(list)g(of)f(p)s(ossible)1110 +3211 y(completions)g(that)f(is)g(displa)m(y)m(ed)g(without)g(mo)s +(di\014cation.)41 b(When)29 b(set)h(to)h(a)1110 3320 +y(v)-5 b(alue)26 b(greater)h(than)e(zero,)j(common)e(pre\014xes)e +(longer)j(than)e(this)g(v)-5 b(alue)27 b(are)1110 3430 +y(replaced)k(with)f(an)g(ellipsis)h(when)e(displa)m(ying)i(p)s(ossible) +f(completions.)630 3618 y Fn(completion-query-items)1110 +3727 y Fo(The)c(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h +(that)g(determines)f(when)f(the)i(user)1110 3837 y(is)43 +b(ask)m(ed)g(whether)f(the)g(list)h(of)g(p)s(ossibilities)g(should)f(b) +s(e)g(displa)m(y)m(ed.)77 b(If)1110 3947 y(the)29 b(n)m(um)m(b)s(er)f +(of)h(p)s(ossible)g(completions)h(is)f(greater)h(than)f(or)g(equal)g +(to)h(this)1110 4056 y(v)-5 b(alue,)45 b(Readline)e(will)f(ask)g +(whether)f(or)h(not)g(the)g(user)f(wishes)g(to)i(view)1110 +4166 y(them;)33 b(otherwise,)f(they)g(are)g(simply)g(listed.)45 +b(This)31 b(v)-5 b(ariable)33 b(m)m(ust)e(b)s(e)g(set)1110 +4275 y(to)43 b(an)e(in)m(teger)j(v)-5 b(alue)42 b(greater)h(than)f(or)g +(equal)g(to)h(zero.)76 b(A)42 b(zero)g(v)-5 b(alue)1110 +4385 y(means)40 b(Readline)h(should)f(nev)m(er)g(ask;)46 +b(negativ)m(e)d(v)-5 b(alues)41 b(are)f(treated)i(as)1110 +4495 y(zero.)g(The)29 b(default)i(limit)g(is)g Fn(100)p +Fo(.)630 4682 y Fn(convert-meta)1110 4792 y Fo(If)22 +b(set)g(to)h(`)p Fn(on)p Fo(',)h(Readline)f(will)f(con)m(v)m(ert)i(c)m +(haracters)f(with)f(the)g(eigh)m(th)h(bit)f(set)1110 +4902 y(to)33 b(an)e Fh(asci)r(i)h Fo(k)m(ey)h(sequence)f(b)m(y)g +(stripping)f(the)h(eigh)m(th)h(bit)f(and)f(pre\014xing)1110 +5011 y(an)24 b Fn(ESC)g Fo(c)m(haracter,)j(con)m(v)m(erting)f(them)f +(to)g(a)g(meta-pre\014xed)f(k)m(ey)h(sequence.)1110 5121 +y(The)i(default)h(v)-5 b(alue)28 b(is)f(`)p Fn(on)p Fo(',)i(but)d(will) +i(b)s(e)f(set)h(to)g(`)p Fn(off)p Fo(')g(if)f(the)h(lo)s(cale)h(is)f +(one)1110 5230 y(that)21 b(con)m(tains)h(eigh)m(t-bit)h(c)m(haracters.) +39 b(This)20 b(v)-5 b(ariable)21 b(is)g(dep)s(enden)m(t)f(on)h(the)1110 +5340 y Fn(LC_CTYPE)26 b Fo(lo)s(cale)31 b(category)-8 +b(,)31 b(and)d(ma)m(y)h(c)m(hange)h(if)e(the)h(lo)s(cale)h(is)f(c)m +(hanged.)p eop end +%%Page: 7 10 +TeXDict begin 7 9 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(7)630 299 y Fn(disable-completion) +1110 408 y Fo(If)36 b(set)h(to)h(`)p Fn(On)p Fo(',)g(Readline)f(will)g +(inhibit)f(w)m(ord)h(completion.)60 b(Completion)1110 +518 y(c)m(haracters)28 b(will)e(b)s(e)f(inserted)h(in)m(to)h(the)g +(line)f(as)g(if)g(they)h(had)e(b)s(een)g(mapp)s(ed)1110 +628 y(to)31 b Fn(self-insert)p Fo(.)38 b(The)30 b(default)g(is)h(`)p +Fn(off)p Fo('.)630 774 y Fn(echo-control-characters)1110 +883 y Fo(When)f(set)h(to)g(`)p Fn(on)p Fo(',)f(on)g(op)s(erating)h +(systems)f(that)h(indicate)g(they)g(supp)s(ort)1110 993 +y(it,)e(Readline)g(ec)m(ho)s(es)g(a)f(c)m(haracter)i(corresp)s(onding)d +(to)i(a)f(signal)h(generated)1110 1103 y(from)h(the)g(k)m(eyb)s(oard.) +41 b(The)30 b(default)g(is)h(`)p Fn(on)p Fo('.)630 1249 +y Fn(editing-mode)1110 1358 y Fo(The)d Fn(editing-mode)e +Fo(v)-5 b(ariable)29 b(con)m(trols)h(whic)m(h)e(default)h(set)h(of)e(k) +m(ey)i(bind-)1110 1468 y(ings)25 b(is)g(used.)38 b(By)26 +b(default,)g(Readline)g(starts)f(up)f(in)h(Emacs)g(editing)h(mo)s(de,) +1110 1577 y(where)j(the)g(k)m(eystrok)m(es)i(are)e(most)h(similar)f(to) +h(Emacs.)40 b(This)29 b(v)-5 b(ariable)30 b(can)1110 +1687 y(b)s(e)g(set)h(to)g(either)g(`)p Fn(emacs)p Fo(')e(or)h(`)p +Fn(vi)p Fo('.)630 1833 y Fn(emacs-mode-string)1110 1943 +y Fo(If)j(the)h Fe(sho)m(w-mo)s(de-in-prompt)h Fo(v)-5 +b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110 +2052 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f +(of)h(the)f(primary)f(prompt)g(when)1110 2162 y(emacs)g(editing)h(mo)s +(de)e(is)h(activ)m(e.)40 b(The)21 b(v)-5 b(alue)22 b(is)g(expanded)f +(lik)m(e)h(a)h(k)m(ey)f(bind-)1110 2271 y(ing,)27 b(so)f(the)f +(standard)g(set)h(of)f(meta-)i(and)e(con)m(trol)i(pre\014xes)d(and)h +(bac)m(kslash)1110 2381 y(escap)s(e)f(sequences)h(is)e(a)m(v)-5 +b(ailable.)41 b(Use)25 b(the)f(`)p Fn(\\1)p Fo(')f(and)h(`)p +Fn(\\2)p Fo(')g(escap)s(es)g(to)g(b)s(egin)1110 2491 +y(and)37 b(end)g(sequences)h(of)f(non-prin)m(ting)h(c)m(haracters,)j +(whic)m(h)c(can)h(b)s(e)f(used)1110 2600 y(to)h(em)m(b)s(ed)f(a)g +(terminal)h(con)m(trol)h(sequence)f(in)m(to)g(the)f(mo)s(de)g(string.) +61 b(The)1110 2710 y(default)31 b(is)f(`)p Fn(@)p Fo('.)630 +2856 y Fn(enable-active-region)1110 2966 y Fo(The)46 +b Fe(p)s(oin)m(t)j Fo(is)e(the)g(curren)m(t)f(cursor)g(p)s(osition,)52 +b(and)46 b Fe(mark)52 b Fo(refers)46 b(to)i(a)1110 3075 +y(sa)m(v)m(ed)37 b(cursor)f(p)s(osition)g(\(see)i(Section)f(1.4.1)h +([Commands)d(F)-8 b(or)37 b(Mo)m(ving],)1110 3185 y(page)25 +b(17\).)40 b(The)24 b(text)h(b)s(et)m(w)m(een)g(the)g(p)s(oin)m(t)f +(and)g(mark)g(is)g(referred)g(to)h(as)g(the)1110 3294 +y Fe(region)p Fo(.)62 b(When)37 b(this)g(v)-5 b(ariable)38 +b(is)f(set)h(to)g(`)p Fn(On)p Fo(',)h(Readline)f(allo)m(ws)g(certain) +1110 3404 y(commands)f(to)h(designate)h(the)e(region)h(as)g +Fe(activ)m(e)p Fo(.)64 b(When)37 b(the)h(region)g(is)1110 +3513 y(activ)m(e,)43 b(Readline)38 b(highligh)m(ts)h(the)g(text)g(in)e +(the)i(region)g(using)e(the)h(v)-5 b(alue)1110 3623 y(of)35 +b(the)g Fn(active-region-start-color)p Fo(,)30 b(whic)m(h)35 +b(defaults)g(to)h(the)f(string)1110 3733 y(that)23 b(enables)f(the)g +(terminal's)h(standout)e(mo)s(de.)38 b(The)21 b(activ)m(e)k(region)d +(sho)m(ws)1110 3842 y(the)32 b(text)h(inserted)f(b)m(y)g(brac)m(k)m +(eted-paste)i(and)e(an)m(y)g(matc)m(hing)h(text)g(found)1110 +3952 y(b)m(y)f(incremen)m(tal)i(and)e(non-incremen)m(tal)i(history)e +(searc)m(hes.)48 b(The)32 b(default)1110 4061 y(is)e(`)p +Fn(On)p Fo('.)630 4208 y Fn(enable-bracketed-paste)1110 +4317 y Fo(When)36 b(set)h(to)g(`)p Fn(On)p Fo(',)h(Readline)f +(con\014gures)f(the)h(terminal)f(to)i(insert)e(eac)m(h)1110 +4427 y(paste)27 b(in)m(to)g(the)f(editing)h(bu\013er)e(as)h(a)h(single) +g(string)f(of)g(c)m(haracters,)j(instead)1110 4536 y(of)d(treating)i +(eac)m(h)g(c)m(haracter)f(as)g(if)f(it)h(had)f(b)s(een)f(read)i(from)e +(the)i(k)m(eyb)s(oard.)1110 4646 y(This)36 b(is)h(called)h(putting)f +(the)h(terminal)f(in)m(to)h Fe(brac)m(k)m(eted)h(paste)e(mo)s(de)5 +b Fo(;)40 b(it)1110 4756 y(prev)m(en)m(ts)30 b(Readline)h(from)e +(executing)i(an)m(y)f(editing)h(commands)e(b)s(ound)f(to)1110 +4865 y(k)m(ey)j(sequences)g(app)s(earing)f(in)g(the)g(pasted)h(text.)42 +b(The)29 b(default)i(is)f(`)p Fn(On)p Fo('.)630 5011 +y Fn(enable-keypad)1110 5121 y Fo(When)23 b(set)h(to)g(`)p +Fn(on)p Fo(',)h(Readline)f(will)g(try)f(to)h(enable)g(the)f +(application)i(k)m(eypad)1110 5230 y(when)h(it)h(is)f(called.)41 +b(Some)27 b(systems)f(need)h(this)f(to)h(enable)g(the)g(arro)m(w)g(k)m +(eys.)1110 5340 y(The)j(default)g(is)h(`)p Fn(off)p Fo('.)p +eop end +%%Page: 8 11 +TeXDict begin 8 10 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(8)630 299 y Fn(enable-meta-key) +1110 408 y Fo(When)40 b(set)g(to)g(`)p Fn(on)p Fo(',)j(Readline)d(will) +g(try)g(to)g(enable)g(an)m(y)g(meta)h(mo)s(di\014er)1110 +518 y(k)m(ey)i(the)e(terminal)i(claims)f(to)h(supp)s(ort)d(when)h(it)h +(is)g(called.)76 b(On)41 b(man)m(y)1110 628 y(terminals,)c(the)e(meta)h +(k)m(ey)g(is)f(used)g(to)h(send)e(eigh)m(t-bit)j(c)m(haracters.)56 +b(The)1110 737 y(default)31 b(is)f(`)p Fn(on)p Fo('.)630 +894 y Fn(expand-tilde)1110 1003 y Fo(If)d(set)h(to)h(`)p +Fn(on)p Fo(',)f(tilde)g(expansion)g(is)f(p)s(erformed)f(when)h +(Readline)h(attempts)1110 1113 y(w)m(ord)i(completion.)42 +b(The)30 b(default)g(is)h(`)p Fn(off)p Fo('.)630 1270 +y Fn(history-preserve-point)1110 1379 y Fo(If)41 b(set)h(to)h(`)p +Fn(on)p Fo(',)i(the)c(history)h(co)s(de)g(attempts)h(to)f(place)h(the)f +(p)s(oin)m(t)f(\(the)1110 1489 y(curren)m(t)35 b(cursor)g(p)s +(osition\))g(at)h(the)g(same)f(lo)s(cation)i(on)e(eac)m(h)h(history)g +(line)1110 1598 y(retriev)m(ed)h(with)f Fn(previous-history)c +Fo(or)37 b Fn(next-history)p Fo(.)55 b(The)36 b(default)1110 +1708 y(is)30 b(`)p Fn(off)p Fo('.)630 1864 y Fn(history-size)1110 +1974 y Fo(Set)39 b(the)g(maxim)m(um)g(n)m(um)m(b)s(er)f(of)h(history)g +(en)m(tries)h(sa)m(v)m(ed)g(in)f(the)g(history)1110 2084 +y(list.)51 b(If)34 b(set)g(to)h(zero,)g(an)m(y)f(existing)h(history)f +(en)m(tries)g(are)g(deleted)h(and)e(no)1110 2193 y(new)e(en)m(tries)i +(are)f(sa)m(v)m(ed.)46 b(If)31 b(set)h(to)h(a)f(v)-5 +b(alue)32 b(less)g(than)f(zero,)i(the)f(n)m(um)m(b)s(er)1110 +2303 y(of)f(history)f(en)m(tries)h(is)g(not)g(limited.)42 +b(By)30 b(default,)h(the)g(n)m(um)m(b)s(er)e(of)i(history)1110 +2412 y(en)m(tries)j(is)f(not)g(limited.)49 b(If)32 b(an)h(attempt)h(is) +f(made)g(to)h(set)f Fe(history-size)39 b Fo(to)1110 2522 +y(a)34 b(non-n)m(umeric)f(v)-5 b(alue,)34 b(the)g(maxim)m(um)f(n)m(um)m +(b)s(er)f(of)h(history)h(en)m(tries)g(will)1110 2632 +y(b)s(e)c(set)h(to)g(500.)630 2788 y Fn(horizontal-scroll-mode)1110 +2898 y Fo(This)k(v)-5 b(ariable)37 b(can)f(b)s(e)f(set)h(to)h(either)f +(`)p Fn(on)p Fo(')g(or)g(`)p Fn(off)p Fo('.)57 b(Setting)36 +b(it)g(to)h(`)p Fn(on)p Fo(')1110 3007 y(means)26 b(that)h(the)f(text)h +(of)g(the)f(lines)g(b)s(eing)g(edited)h(will)f(scroll)h(horizon)m +(tally)1110 3117 y(on)32 b(a)g(single)g(screen)g(line)g(when)e(they)i +(are)g(longer)h(than)e(the)h(width)f(of)h(the)1110 3226 +y(screen,)c(instead)g(of)f(wrapping)f(on)m(to)i(a)g(new)e(screen)i +(line.)40 b(This)26 b(v)-5 b(ariable)28 b(is)1110 3336 +y(automatically)k(set)e(to)g(`)p Fn(on)p Fo(')f(for)g(terminals)g(of)h +(heigh)m(t)g(1.)41 b(By)29 b(default,)h(this)1110 3446 +y(v)-5 b(ariable)31 b(is)g(set)f(to)i(`)p Fn(off)p Fo('.)630 +3602 y Fn(input-meta)1110 3712 y Fo(If)f(set)g(to)h(`)p +Fn(on)p Fo(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it) +i(will)f(not)h(clear)1110 3821 y(the)40 b(eigh)m(th)g(bit)g(in)f(the)h +(c)m(haracters)h(it)f(reads\),)j(regardless)c(of)h(what)g(the)1110 +3931 y(terminal)k(claims)h(it)f(can)g(supp)s(ort.)79 +b(The)44 b(default)g(v)-5 b(alue)44 b(is)g(`)p Fn(off)p +Fo(',)j(but)1110 4041 y(Readline)24 b(will)h(set)f(it)g(to)h(`)p +Fn(on)p Fo(')e(if)h(the)g(lo)s(cale)i(con)m(tains)f(eigh)m(t-bit)g(c)m +(haracters.)1110 4150 y(The)k(name)g Fn(meta-flag)e Fo(is)i(a)h(synon)m +(ym)f(for)g(this)g(v)-5 b(ariable.)42 b(This)28 b(v)-5 +b(ariable)1110 4260 y(is)35 b(dep)s(enden)m(t)f(on)h(the)g +Fn(LC_CTYPE)e Fo(lo)s(cale)k(category)-8 b(,)39 b(and)34 +b(ma)m(y)i(c)m(hange)g(if)1110 4369 y(the)31 b(lo)s(cale)h(is)e(c)m +(hanged.)630 4526 y Fn(isearch-terminators)1110 4635 +y Fo(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e(terminate)j +(an)f(incremen)m(tal)1110 4745 y(searc)m(h)25 b(without)g(subsequen)m +(tly)g(executing)h(the)f(c)m(haracter)h(as)f(a)g(command)1110 +4855 y(\(see)45 b(Section)h(1.2.5)g([Searc)m(hing],)j(page)d(3\).)84 +b(If)44 b(this)g(v)-5 b(ariable)45 b(has)g(not)1110 4964 +y(b)s(een)35 b(giv)m(en)h(a)g(v)-5 b(alue,)37 b(the)f(c)m(haracters)h +Fn(ESC)d Fo(and)h Fg(C-J)g Fo(will)h(terminate)g(an)1110 +5074 y(incremen)m(tal)c(searc)m(h.)630 5230 y Fn(keymap)192 +b Fo(Sets)64 b(Readline's)i(idea)f(of)f(the)h(curren)m(t)f(k)m(eymap)h +(for)f(k)m(ey)h(binding)1110 5340 y(commands.)71 b(Built-in)41 +b Fn(keymap)e Fo(names)h(are)h Fn(emacs)p Fo(,)h Fn(emacs-standard)p +Fo(,)p eop end +%%Page: 9 12 +TeXDict begin 9 11 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2153 b(9)1110 299 y Fn(emacs-meta)p +Fo(,)99 b Fn(emacs-ctlx)p Fo(,)f Fn(vi)p Fo(,)j Fn(vi-move)p +Fo(,)f Fn(vi-command)p Fo(,)f(and)1110 408 y Fn(vi-insert)p +Fo(.)81 b Fn(vi)44 b Fo(is)h(equiv)-5 b(alen)m(t)46 b(to)g +Fn(vi-command)c Fo(\()p Fn(vi-move)h Fo(is)i(also)h(a)1110 +518 y(synon)m(ym\);)41 b Fn(emacs)c Fo(is)h(equiv)-5 +b(alen)m(t)39 b(to)f Fn(emacs-standard)p Fo(.)59 b(Applications)1110 +628 y(ma)m(y)32 b(add)e(additional)i(names.)43 b(The)30 +b(default)h(v)-5 b(alue)32 b(is)f Fn(emacs)p Fo(.)41 +b(The)30 b(v)-5 b(alue)1110 737 y(of)31 b(the)f Fn(editing-mode)d +Fo(v)-5 b(ariable)31 b(also)h(a\013ects)f(the)g(default)g(k)m(eymap.) +630 909 y Fn(keyseq-timeout)1110 1019 y Fo(Sp)s(eci\014es)25 +b(the)g(duration)g(Readline)h(will)g(w)m(ait)g(for)g(a)f(c)m(haracter)i +(when)e(read-)1110 1129 y(ing)30 b(an)g(am)m(biguous)g(k)m(ey)h +(sequence)f(\(one)g(that)h(can)f(form)g(a)g(complete)h(k)m(ey)1110 +1238 y(sequence)j(using)e(the)i(input)e(read)h(so)g(far,)h(or)g(can)f +(tak)m(e)i(additional)f(input)1110 1348 y(to)g(complete)g(a)f(longer)h +(k)m(ey)f(sequence\).)49 b(If)33 b(no)f(input)g(is)h(receiv)m(ed)h +(within)1110 1457 y(the)43 b(timeout,)48 b(Readline)43 +b(will)g(use)g(the)g(shorter)g(but)f(complete)j(k)m(ey)e(se-)1110 +1567 y(quence.)c(Readline)26 b(uses)f(this)h(v)-5 b(alue)26 +b(to)g(determine)g(whether)f(or)g(not)h(input)1110 1677 +y(is)31 b(a)m(v)-5 b(ailable)33 b(on)d(the)h(curren)m(t)f(input)g +(source)h(\()p Fn(rl_instream)d Fo(b)m(y)i(default\).)1110 +1786 y(The)25 b(v)-5 b(alue)26 b(is)f(sp)s(eci\014ed)f(in)h +(milliseconds,)j(so)d(a)h(v)-5 b(alue)26 b(of)f(1000)i(means)e(that) +1110 1896 y(Readline)e(will)g(w)m(ait)g(one)g(second)f(for)g +(additional)i(input.)37 b(If)22 b(this)g(v)-5 b(ariable)23 +b(is)1110 2005 y(set)28 b(to)h(a)f(v)-5 b(alue)29 b(less)f(than)g(or)f +(equal)i(to)f(zero,)i(or)e(to)g(a)h(non-n)m(umeric)e(v)-5 +b(alue,)1110 2115 y(Readline)30 b(will)f(w)m(ait)i(un)m(til)e(another)h +(k)m(ey)g(is)f(pressed)g(to)h(decide)f(whic)m(h)g(k)m(ey)1110 +2225 y(sequence)i(to)g(complete.)42 b(The)30 b(default)g(v)-5 +b(alue)31 b(is)g Fn(500)p Fo(.)630 2397 y Fn(mark-directories)1110 +2506 y Fo(If)38 b(set)g(to)h(`)p Fn(on)p Fo(',)i(completed)e(directory) +f(names)g(ha)m(v)m(e)i(a)e(slash)g(app)s(ended.)1110 +2616 y(The)30 b(default)g(is)h(`)p Fn(on)p Fo('.)630 +2788 y Fn(mark-modified-lines)1110 2898 y Fo(This)k(v)-5 +b(ariable,)38 b(when)d(set)h(to)h(`)p Fn(on)p Fo(',)g(causes)g +(Readline)f(to)h(displa)m(y)f(an)f(as-)1110 3007 y(terisk)f(\(`)p +Fn(*)p Fo('\))h(at)f(the)g(start)g(of)g(history)g(lines)g(whic)m(h)f +(ha)m(v)m(e)i(b)s(een)e(mo)s(di\014ed.)1110 3117 y(This)d(v)-5 +b(ariable)31 b(is)f(`)p Fn(off)p Fo(')g(b)m(y)g(default.)630 +3289 y Fn(mark-symlinked-directori)o(es)1110 3399 y Fo(If)59 +b(set)h(to)g(`)p Fn(on)p Fo(',)67 b(completed)60 b(names)f(whic)m(h)g +(are)h(sym)m(b)s(olic)g(links)f(to)1110 3508 y(directories)71 +b(ha)m(v)m(e)f(a)g(slash)f(app)s(ended)f(\(sub)5 b(ject)70 +b(to)g(the)g(v)-5 b(alue)70 b(of)1110 3618 y Fn(mark-directories)p +Fo(\).)37 b(The)30 b(default)g(is)g(`)p Fn(off)p Fo('.)630 +3790 y Fn(match-hidden-files)1110 3900 y Fo(This)21 b(v)-5 +b(ariable,)25 b(when)d(set)g(to)h(`)p Fn(on)p Fo(',)h(causes)f +(Readline)g(to)g(matc)m(h)g(\014les)f(whose)1110 4009 +y(names)44 b(b)s(egin)g(with)g(a)g(`)p Fn(.)p Fo(')g(\(hidden)f +(\014les\))i(when)e(p)s(erforming)g(\014lename)1110 4119 +y(completion.)75 b(If)41 b(set)g(to)h(`)p Fn(off)p Fo(',)i(the)e +(leading)g(`)p Fn(.)p Fo(')f(m)m(ust)g(b)s(e)g(supplied)f(b)m(y)1110 +4228 y(the)34 b(user)g(in)g(the)g(\014lename)g(to)h(b)s(e)f(completed.) +53 b(This)33 b(v)-5 b(ariable)35 b(is)f(`)p Fn(on)p Fo(')g(b)m(y)1110 +4338 y(default.)630 4510 y Fn(menu-complete-display-pr)o(efix)1110 +4620 y Fo(If)f(set)h(to)g(`)p Fn(on)p Fo(',)h(men)m(u)e(completion)i +(displa)m(ys)e(the)h(common)g(pre\014x)e(of)i(the)1110 +4729 y(list)k(of)g(p)s(ossible)f(completions)i(\(whic)m(h)e(ma)m(y)h(b) +s(e)f(empt)m(y\))i(b)s(efore)e(cycling)1110 4839 y(through)30 +b(the)g(list.)42 b(The)29 b(default)i(is)f(`)p Fn(off)p +Fo('.)630 5011 y Fn(output-meta)1110 5121 y Fo(If)35 +b(set)h(to)g(`)p Fn(on)p Fo(',)h(Readline)f(will)g(displa)m(y)f(c)m +(haracters)i(with)e(the)h(eigh)m(th)g(bit)1110 5230 y(set)h(directly)g +(rather)f(than)g(as)h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59 +b(The)1110 5340 y(default)26 b(is)f(`)p Fn(off)p Fo(',)i(but)e +(Readline)h(will)g(set)g(it)g(to)h(`)p Fn(on)p Fo(')e(if)h(the)f(lo)s +(cale)j(con)m(tains)p eop end +%%Page: 10 13 +TeXDict begin 10 12 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(10)1110 299 y(eigh)m(t-bit)38 +b(c)m(haracters.)61 b(This)36 b(v)-5 b(ariable)37 b(is)g(dep)s(enden)m +(t)e(on)h(the)h Fn(LC_CTYPE)1110 408 y Fo(lo)s(cale)32 +b(category)-8 b(,)33 b(and)d(ma)m(y)h(c)m(hange)g(if)g(the)f(lo)s(cale) +i(is)f(c)m(hanged.)630 581 y Fn(page-completions)1110 +690 y Fo(If)i(set)i(to)f(`)p Fn(on)p Fo(',)h(Readline)g(uses)e(an)h(in) +m(ternal)h Fn(more)p Fo(-lik)m(e)f(pager)g(to)h(displa)m(y)1110 +800 y(a)e(screenful)f(of)g(p)s(ossible)g(completions)i(at)f(a)g(time.) +47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Fn(on)p Fo(')1110 +909 y(b)m(y)e(default.)630 1082 y Fn(print-completions-horizo)o(ntal)o +(ly)1110 1191 y Fo(If)23 b(set)i(to)g(`)p Fn(on)p Fo(',)g(Readline)g +(will)f(displa)m(y)g(completions)h(with)f(matc)m(hes)h(sorted)1110 +1301 y(horizon)m(tally)45 b(in)e(alphab)s(etical)i(order,)i(rather)c +(than)g(do)m(wn)g(the)h(screen.)1110 1410 y(The)30 b(default)g(is)h(`)p +Fn(off)p Fo('.)630 1583 y Fn(revert-all-at-newline)1110 +1692 y Fo(If)e(set)h(to)g(`)p Fn(on)p Fo(',)g(Readline)g(will)g(undo)f +(all)h(c)m(hanges)h(to)f(history)g(lines)f(b)s(efore)1110 +1802 y(returning)f(when)f Fn(accept-line)f Fo(is)j(executed.)41 +b(By)29 b(default,)g(history)g(lines)1110 1911 y(ma)m(y)42 +b(b)s(e)g(mo)s(di\014ed)e(and)h(retain)i(individual)e(undo)g(lists)h +(across)g(calls)h(to)1110 2021 y Fn(readline\(\))p Fo(.)38 +b(The)30 b(default)g(is)h(`)p Fn(off)p Fo('.)630 2193 +y Fn(show-all-if-ambiguous)1110 2303 y Fo(This)e(alters)i(the)f +(default)g(b)s(eha)m(vior)g(of)g(the)h(completion)g(functions.)40 +b(If)29 b(set)1110 2412 y(to)f(`)p Fn(on)p Fo(',)g(w)m(ords)f(whic)m(h) +g(ha)m(v)m(e)i(more)f(than)f(one)h(p)s(ossible)f(completion)h(cause) +1110 2522 y(the)39 b(matc)m(hes)h(to)g(b)s(e)e(listed)h(immediately)i +(instead)e(of)g(ringing)g(the)g(b)s(ell.)1110 2632 y(The)30 +b(default)g(v)-5 b(alue)31 b(is)g(`)p Fn(off)p Fo('.)630 +2804 y Fn(show-all-if-unmodified)1110 2913 y Fo(This)38 +b(alters)h(the)g(default)g(b)s(eha)m(vior)g(of)f(the)h(completion)h +(functions)e(in)h(a)1110 3023 y(fashion)25 b(similar)h(to)g +Fe(sho)m(w-all-if-am)m(biguous)p Fo(.)41 b(If)25 b(set)h(to)h(`)p +Fn(on)p Fo(',)f(w)m(ords)f(whic)m(h)1110 3133 y(ha)m(v)m(e)32 +b(more)f(than)f(one)i(p)s(ossible)e(completion)i(without)f(an)m(y)g(p)s +(ossible)f(par-)1110 3242 y(tial)43 b(completion)h(\(the)f(p)s(ossible) +f(completions)h(don't)f(share)g(a)h(common)1110 3352 +y(pre\014x\))30 b(cause)g(the)h(matc)m(hes)g(to)g(b)s(e)f(listed)g +(immediately)i(instead)e(of)h(ring-)1110 3461 y(ing)g(the)f(b)s(ell.)41 +b(The)30 b(default)g(v)-5 b(alue)31 b(is)f(`)p Fn(off)p +Fo('.)630 3634 y Fn(show-mode-in-prompt)1110 3743 y Fo(If)24 +b(set)h(to)g(`)p Fn(on)p Fo(',)g(add)f(a)h(string)f(to)h(the)f(b)s +(eginning)g(of)g(the)h(prompt)e(indicating)1110 3853 +y(the)33 b(editing)h(mo)s(de:)46 b(emacs,)35 b(vi)e(command,)h(or)f(vi) +h(insertion.)49 b(The)32 b(mo)s(de)1110 3962 y(strings)45 +b(are)h(user-settable)g(\(e.g.,)51 b Fe(emacs-mo)s(de-string)8 +b Fo(\).)87 b(The)45 b(default)1110 4072 y(v)-5 b(alue)31 +b(is)f(`)p Fn(off)p Fo('.)630 4244 y Fn(skip-completed-text)1110 +4354 y Fo(If)i(set)i(to)f(`)p Fn(on)p Fo(',)h(this)f(alters)g(the)g +(default)g(completion)h(b)s(eha)m(vior)f(when)f(in-)1110 +4463 y(serting)d(a)h(single)g(matc)m(h)f(in)m(to)h(the)g(line.)40 +b(It's)30 b(only)f(activ)m(e)i(when)d(p)s(erform-)1110 +4573 y(ing)k(completion)i(in)e(the)g(middle)g(of)g(a)h(w)m(ord.)46 +b(If)32 b(enabled,)g(Readline)h(do)s(es)1110 4682 y(not)41 +b(insert)f(c)m(haracters)i(from)e(the)h(completion)h(that)f(matc)m(h)g +(c)m(haracters)1110 4792 y(after)c(p)s(oin)m(t)g(in)g(the)g(w)m(ord)f +(b)s(eing)g(completed,)k(so)d(p)s(ortions)f(of)h(the)g(w)m(ord)1110 +4902 y(follo)m(wing)c(the)f(cursor)f(are)h(not)g(duplicated.)45 +b(F)-8 b(or)32 b(instance,)h(if)f(this)f(is)h(en-)1110 +5011 y(abled,)43 b(attempting)f(completion)g(when)d(the)i(cursor)f(is)g +(after)h(the)g(`)p Fn(e)p Fo(')f(in)1110 5121 y(`)p Fn(Makefile)p +Fo(')c(will)i(result)f(in)g(`)p Fn(Makefile)p Fo(')f(rather)h(than)h(`) +p Fn(Makefilefile)p Fo(',)1110 5230 y(assuming)d(there)g(is)h(a)f +(single)h(p)s(ossible)f(completion.)56 b(The)35 b(default)g(v)-5 +b(alue)1110 5340 y(is)30 b(`)p Fn(off)p Fo('.)p eop end +%%Page: 11 14 +TeXDict begin 11 13 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(11)630 299 y Fn +(vi-cmd-mode-string)1110 408 y Fo(If)33 b(the)h Fe(sho)m(w-mo)s +(de-in-prompt)h Fo(v)-5 b(ariable)35 b(is)e(enabled,)i(this)f(string)f +(is)h(dis-)1110 518 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g +(last)h(line)f(of)h(the)f(primary)f(prompt)g(when)1110 +628 y(vi)32 b(editing)h(mo)s(de)f(is)g(activ)m(e)j(and)c(in)h(command)g +(mo)s(de.)46 b(The)31 b(v)-5 b(alue)33 b(is)f(ex-)1110 +737 y(panded)26 b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f +(standard)f(set)h(of)g(meta-)h(and)e(con)m(trol)1110 +847 y(pre\014xes)34 b(and)g(bac)m(kslash)i(escap)s(e)g(sequences)f(is)g +(a)m(v)-5 b(ailable.)57 b(Use)35 b(the)g(`)p Fn(\\1)p +Fo(')1110 956 y(and)23 b(`)p Fn(\\2)p Fo(')h(escap)s(es)h(to)f(b)s +(egin)g(and)f(end)g(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110 +1066 y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a) +h(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 1176 +y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p +Fn(\(cmd\))p Fo('.)630 1340 y Fn(vi-ins-mode-string)1110 +1450 y Fo(If)j(the)h Fe(sho)m(w-mo)s(de-in-prompt)h Fo(v)-5 +b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110 +1559 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f +(of)h(the)f(primary)f(prompt)g(when)1110 1669 y(vi)35 +b(editing)h(mo)s(de)e(is)i(activ)m(e)h(and)d(in)h(insertion)g(mo)s(de.) +54 b(The)35 b(v)-5 b(alue)35 b(is)g(ex-)1110 1778 y(panded)26 +b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f(standard)f(set)h(of)g +(meta-)h(and)e(con)m(trol)1110 1888 y(pre\014xes)34 b(and)g(bac)m +(kslash)i(escap)s(e)g(sequences)f(is)g(a)m(v)-5 b(ailable.)57 +b(Use)35 b(the)g(`)p Fn(\\1)p Fo(')1110 1998 y(and)23 +b(`)p Fn(\\2)p Fo(')h(escap)s(es)h(to)f(b)s(egin)g(and)f(end)g +(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110 2107 +y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a)h +(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 2217 +y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p +Fn(\(ins\))p Fo('.)630 2381 y Fn(visible-stats)1110 2491 +y Fo(If)h(set)i(to)f(`)p Fn(on)p Fo(',)h(a)f(c)m(haracter)i(denoting)e +(a)g(\014le's)g(t)m(yp)s(e)g(is)g(app)s(ended)e(to)j(the)1110 +2600 y(\014lename)e(when)e(listing)i(p)s(ossible)f(completions.)42 +b(The)30 b(default)g(is)h(`)p Fn(off)p Fo('.)150 2765 +y(Key)f(Bindings)630 2874 y(The)41 b(syn)m(tax)i(for)f(con)m(trolling)h +(k)m(ey)g(bindings)e(in)h(the)g(init)g(\014le)g(is)g(simple.)75 +b(First)43 b(y)m(ou)630 2984 y(need)27 b(to)i(\014nd)d(the)i(name)f(of) +h(the)g(command)f(that)i(y)m(ou)f(w)m(an)m(t)g(to)g(c)m(hange.)41 +b(The)27 b(follo)m(wing)630 3093 y(sections)37 b(con)m(tain)g(tables)g +(of)f(the)g(command)f(name,)j(the)e(default)g(k)m(eybinding,)h(if)f(an) +m(y)-8 b(,)630 3203 y(and)30 b(a)h(short)f(description)g(of)h(what)f +(the)g(command)h(do)s(es.)630 3340 y(Once)36 b(y)m(ou)g(kno)m(w)g(the)g +(name)g(of)g(the)g(command,)h(simply)f(place)h(on)e(a)i(line)f(in)g +(the)g(init)630 3450 y(\014le)e(the)g(name)f(of)h(the)g(k)m(ey)g(y)m +(ou)g(wish)f(to)h(bind)f(the)h(command)f(to,)i(a)f(colon,)i(and)d(then) +630 3559 y(the)f(name)h(of)f(the)g(command.)46 b(There)32 +b(can)g(b)s(e)g(no)g(space)g(b)s(et)m(w)m(een)h(the)f(k)m(ey)h(name)g +(and)630 3669 y(the)41 b(colon)h({)f(that)g(will)g(b)s(e)g(in)m +(terpreted)g(as)g(part)f(of)h(the)g(k)m(ey)h(name.)72 +b(The)40 b(name)h(of)630 3778 y(the)35 b(k)m(ey)g(can)g(b)s(e)f +(expressed)f(in)i(di\013eren)m(t)g(w)m(a)m(ys,)h(dep)s(ending)d(on)h +(what)h(y)m(ou)g(\014nd)e(most)630 3888 y(comfortable.)630 +4025 y(In)g(addition)h(to)g(command)g(names,)g(Readline)g(allo)m(ws)h +(k)m(eys)g(to)f(b)s(e)f(b)s(ound)f(to)i(a)g(string)630 +4134 y(that)d(is)f(inserted)h(when)e(the)i(k)m(ey)g(is)f(pressed)g(\(a) +h Fe(macro)5 b Fo(\).)630 4299 y Fe(k)m(eyname)g Fo(:)42 +b Fe(function-name)35 b Fo(or)c Fe(macro)1110 4408 y(k)m(eyname)k +Fo(is)29 b(the)f(name)h(of)g(a)g(k)m(ey)h(sp)s(elled)e(out)h(in)g +(English.)39 b(F)-8 b(or)30 b(example:)1350 4545 y Fn(Control-u:)45 +b(universal-argument)1350 4655 y(Meta-Rubout:)f(backward-kill-word)1350 +4765 y(Control-o:)h(">)i(output")1110 4902 y Fo(In)94 +b(the)g(example)h(ab)s(o)m(v)m(e,)112 b Fg(C-u)94 b Fo(is)g(b)s(ound)f +(to)i(the)f(function)1110 5011 y Fn(universal-argument)p +Fo(,)124 b Fg(M-DEL)107 b Fo(is)i(b)s(ound)e(to)j(the)f(function)1110 +5121 y Fn(backward-kill-word)p Fo(,)75 b(and)69 b Fg(C-o)g +Fo(is)h(b)s(ound)e(to)j(run)d(the)i(macro)1110 5230 y(expressed)45 +b(on)h(the)g(righ)m(t)g(hand)e(side)i(\(that)h(is,)i(to)e(insert)e(the) +h(text)h(`)p Fn(>)1110 5340 y(output)p Fo(')29 b(in)m(to)i(the)g +(line\).)p eop end +%%Page: 12 15 +TeXDict begin 12 14 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(12)1110 299 y(A)62 +b(n)m(um)m(b)s(er)e(of)i(sym)m(b)s(olic)h(c)m(haracter)g(names)f(are)g +(recognized)h(while)1110 408 y(pro)s(cessing)40 b(this)f(k)m(ey)i +(binding)e(syn)m(tax:)60 b Fe(DEL)p Fo(,)42 b Fe(ESC)p +Fo(,)g Fe(ESCAPE)p Fo(,)f Fe(LFD)p Fo(,)1110 518 y Fe(NEWLINE)p +Fo(,)31 b Fe(RET)p Fo(,)f Fe(RETURN)p Fo(,)g Fe(R)m(UBOUT)p +Fo(,)h Fe(SP)-8 b(A)m(CE)p Fo(,)31 b Fe(SPC)p Fo(,)e(and)h +Fe(T)-8 b(AB)p Fo(.)630 677 y Fn(")p Fe(k)m(eyseq)r Fn(")p +Fo(:)41 b Fe(function-name)36 b Fo(or)30 b Fe(macro)1110 +787 y(k)m(eyseq)k Fo(di\013ers)d(from)f Fe(k)m(eyname)37 +b Fo(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f(denoting)g(an)g(en-)1110 +896 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s(e)f(sp)s(eci\014ed,)h(b)m(y) +f(placing)i(the)f(k)m(ey)g(sequence)g(in)1110 1006 y(double)29 +b(quotes.)41 b(Some)29 b Fh(gnu)h Fo(Emacs)f(st)m(yle)i(k)m(ey)f(escap) +s(es)g(can)g(b)s(e)f(used,)g(as)1110 1115 y(in)k(the)h(follo)m(wing)i +(example,)f(but)e(the)h(sp)s(ecial)h(c)m(haracter)g(names)f(are)g(not) +1110 1225 y(recognized.)1350 1359 y Fn("\\C-u":)46 b +(universal-argument)1350 1469 y("\\C-x\\C-r":)f(re-read-init-file)1350 +1578 y("\\e[11~":)g("Function)h(Key)g(1")1110 1713 y +Fo(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74 b Fg(C-u)64 +b Fo(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110 +1822 y Fn(universal-argument)39 b Fo(\(just)k(as)h(it)g(w)m(as)g(in)g +(the)f(\014rst)g(example\),)49 b(`)p Fg(C-x)1110 1932 +y(C-r)p Fo(')30 b(is)g(b)s(ound)e(to)j(the)g(function)f +Fn(re-read-init-file)p Fo(,)c(and)j(`)p Fn(ESC)h([)g(1)g(1)1110 +2041 y(~)p Fo(')g(is)h(b)s(ound)d(to)j(insert)f(the)h(text)g(`)p +Fn(Function)e(Key)g(1)p Fo('.)630 2200 y(The)g(follo)m(wing)i +Fh(gnu)f Fo(Emacs)g(st)m(yle)h(escap)s(e)f(sequences)g(are)g(a)m(v)-5 +b(ailable)32 b(when)d(sp)s(ecifying)630 2310 y(k)m(ey)i(sequences:)630 +2469 y Fg(\\C-)336 b Fo(con)m(trol)32 b(pre\014x)630 +2628 y Fg(\\M-)336 b Fo(meta)31 b(pre\014x)630 2787 y +Fg(\\e)384 b Fo(an)30 b(escap)s(e)h(c)m(haracter)630 +2945 y Fg(\\\\)384 b Fo(bac)m(kslash)630 3104 y Fg(\\)p +Fn(")g(")p Fo(,)30 b(a)h(double)f(quotation)i(mark)630 +3263 y Fg(\\')384 b Fn(')p Fo(,)30 b(a)h(single)g(quote)g(or)f(ap)s +(ostrophe)630 3422 y(In)d(addition)h(to)g(the)g Fh(gnu)f +Fo(Emacs)h(st)m(yle)h(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g +(bac)m(kslash)630 3532 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)630 +3691 y Fn(\\a)384 b Fo(alert)31 b(\(b)s(ell\))630 3850 +y Fn(\\b)384 b Fo(bac)m(kspace)630 4008 y Fn(\\d)g Fo(delete)630 +4167 y Fn(\\f)g Fo(form)30 b(feed)630 4326 y Fn(\\n)384 +b Fo(newline)630 4485 y Fn(\\r)g Fo(carriage)32 b(return)630 +4644 y Fn(\\t)384 b Fo(horizon)m(tal)32 b(tab)630 4803 +y Fn(\\v)384 b Fo(v)m(ertical)32 b(tab)630 4962 y Fn(\\)p +Fg(nnn)288 b Fo(the)35 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5 +b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5 b(alue)35 b Fe(nnn)e +Fo(\(one)i(to)1110 5071 y(three)c(digits\))630 5230 y +Fn(\\x)p Fg(HH)288 b Fo(the)38 b(eigh)m(t-bit)i(c)m(haracter)g(whose)e +(v)-5 b(alue)39 b(is)f(the)h(hexadecimal)g(v)-5 b(alue)39 +b Fe(HH)1110 5340 y Fo(\(one)31 b(or)f(t)m(w)m(o)i(hex)e(digits\))p +eop end +%%Page: 13 16 +TeXDict begin 13 15 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(13)630 299 y(When)37 +b(en)m(tering)h(the)g(text)g(of)g(a)g(macro,)i(single)e(or)f(double)g +(quotes)h(m)m(ust)f(b)s(e)g(used)f(to)630 408 y(indicate)23 +b(a)e(macro)h(de\014nition.)38 b(Unquoted)21 b(text)i(is)e(assumed)g +(to)h(b)s(e)f(a)h(function)f(name.)38 b(In)630 518 y(the)22 +b(macro)f(b)s(o)s(dy)-8 b(,)23 b(the)e(bac)m(kslash)h(escap)s(es)g +(describ)s(ed)e(ab)s(o)m(v)m(e)j(are)e(expanded.)37 b(Bac)m(kslash)630 +628 y(will)j(quote)h(an)m(y)f(other)g(c)m(haracter)i(in)d(the)i(macro)f +(text,)k(including)39 b(`)p Fn(")p Fo(')h(and)g(`)p Fn(')p +Fo('.)69 b(F)-8 b(or)630 737 y(example,)28 b(the)e(follo)m(wing)h +(binding)d(will)i(mak)m(e)h(`)p Fg(C-x)j Fn(\\)p Fo(')c(insert)f(a)h +(single)h(`)p Fn(\\)p Fo(')f(in)m(to)g(the)g(line:)870 +873 y Fn("\\C-x\\\\":)45 b("\\\\")150 1073 y Fd(1.3.2)63 +b(Conditional)41 b(Init)g(Constructs)150 1220 y Fo(Readline)c(implemen) +m(ts)g(a)h(facilit)m(y)g(similar)f(in)g(spirit)f(to)i(the)f +(conditional)h(compilation)g(features)f(of)150 1330 y(the)31 +b(C)f(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)g(bindings)d(and) +h(v)-5 b(ariable)32 b(settings)f(to)h(b)s(e)e(p)s(erformed)f(as)i(the) +150 1440 y(result)f(of)h(tests.)41 b(There)30 b(are)h(four)f(parser)f +(directiv)m(es)j(used.)150 1601 y Fn($if)336 b Fo(The)31 +b Fn($if)f Fo(construct)i(allo)m(ws)h(bindings)d(to)i(b)s(e)e(made)i +(based)f(on)g(the)g(editing)h(mo)s(de,)g(the)630 1711 +y(terminal)37 b(b)s(eing)f(used,)h(or)f(the)h(application)g(using)f +(Readline.)59 b(The)36 b(text)h(of)f(the)h(test,)630 +1821 y(after)30 b(an)m(y)g(comparison)g(op)s(erator,)g(extends)f(to)h +(the)g(end)f(of)h(the)f(line;)i(unless)e(otherwise)630 +1930 y(noted,)i(no)f(c)m(haracters)i(are)f(required)e(to)i(isolate)i +(it.)630 2091 y Fn(mode)288 b Fo(The)30 b Fn(mode=)e +Fo(form)i(of)g(the)h Fn($if)e Fo(directiv)m(e)j(is)e(used)f(to)i(test)g +(whether)e(Read-)1110 2201 y(line)44 b(is)f(in)g Fn(emacs)f +Fo(or)h Fn(vi)g Fo(mo)s(de.)79 b(This)42 b(ma)m(y)i(b)s(e)e(used)h(in)g +(conjunction)1110 2311 y(with)c(the)h(`)p Fn(set)29 b(keymap)p +Fo(')38 b(command,)k(for)d(instance,)j(to)e(set)g(bindings)e(in)1110 +2420 y(the)32 b Fn(emacs-standard)c Fo(and)j Fn(emacs-ctlx)d +Fo(k)m(eymaps)k(only)g(if)g(Readline)g(is)1110 2530 y(starting)f(out)g +(in)f Fn(emacs)f Fo(mo)s(de.)630 2691 y Fn(term)288 b +Fo(The)26 b Fn(term=)g Fo(form)g(ma)m(y)i(b)s(e)e(used)g(to)i(include)f +(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110 2800 y(ings,)38 +b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f(output)g(b)m(y)g +(the)g(terminal's)1110 2910 y(function)24 b(k)m(eys.)39 +b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g(the)g(`)p +Fn(=)p Fo(')g(is)g(tested)h(against)1110 3020 y(b)s(oth)k(the)h(full)g +(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s(ortion)e(of)h(the)g +(terminal)1110 3129 y(name)k(b)s(efore)f(the)g(\014rst)g(`)p +Fn(-)p Fo('.)50 b(This)33 b(allo)m(ws)i Fn(sun)e Fo(to)h(matc)m(h)g(b)s +(oth)f Fn(sun)g Fo(and)1110 3239 y Fn(sun-cmd)p Fo(,)c(for)h(instance.) +630 3400 y Fn(version)144 b Fo(The)44 b Fn(version)f +Fo(test)i(ma)m(y)h(b)s(e)e(used)f(to)j(p)s(erform)d(comparisons)i +(against)1110 3509 y(sp)s(eci\014c)c(Readline)i(v)m(ersions.)74 +b(The)42 b Fn(version)d Fo(expands)i(to)h(the)g(curren)m(t)1110 +3619 y(Readline)25 b(v)m(ersion.)39 b(The)23 b(set)h(of)g(comparison)h +(op)s(erators)f(includes)f(`)p Fn(=)p Fo(')h(\(and)1110 +3729 y(`)p Fn(==)p Fo('\),)33 b(`)p Fn(!=)p Fo(',)f(`)p +Fn(<=)p Fo(',)h(`)p Fn(>=)p Fo(',)f(`)p Fn(<)p Fo(',)h(and)e(`)p +Fn(>)p Fo('.)46 b(The)31 b(v)m(ersion)i(n)m(um)m(b)s(er)d(supplied)h +(on)1110 3838 y(the)j(righ)m(t)h(side)f(of)g(the)g(op)s(erator)g +(consists)h(of)f(a)g(ma)5 b(jor)35 b(v)m(ersion)f(n)m(um)m(b)s(er,)1110 +3948 y(an)45 b(optional)i(decimal)f(p)s(oin)m(t,)k(and)44 +b(an)i(optional)g(minor)f(v)m(ersion)h(\(e.g.,)1110 4057 +y(`)p Fn(7.1)p Fo('\).)40 b(If)27 b(the)h(minor)f(v)m(ersion)h(is)g +(omitted,)h(it)f(is)g(assumed)f(to)h(b)s(e)f(`)p Fn(0)p +Fo('.)40 b(The)1110 4167 y(op)s(erator)34 b(ma)m(y)g(b)s(e)f(separated) +g(from)g(the)h(string)f Fn(version)f Fo(and)h(from)g(the)1110 +4276 y(v)m(ersion)39 b(n)m(um)m(b)s(er)f(argumen)m(t)h(b)m(y)f +(whitespace.)67 b(The)38 b(follo)m(wing)i(example)1110 +4386 y(sets)31 b(a)g(v)-5 b(ariable)31 b(if)f(the)h(Readline)g(v)m +(ersion)f(b)s(eing)g(used)g(is)g(7.0)i(or)e(new)m(er:)1350 +4521 y Fn($if)47 b(version)f(>=)h(7.0)1350 4631 y(set)g +(show-mode-in-prompt)42 b(on)1350 4741 y($endif)630 4902 +y(application)1110 5011 y Fo(The)21 b Fe(application)j +Fo(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h +(set-)1110 5121 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h +(Readline)g(library)g(sets)g(the)g Fe(application)1110 +5230 y(name)p Fo(,)g(and)e(y)m(ou)g(can)h(test)g(for)f(a)g(particular)h +(v)-5 b(alue.)39 b(This)22 b(could)h(b)s(e)g(used)f(to)1110 +5340 y(bind)32 b(k)m(ey)h(sequences)g(to)h(functions)e(useful)g(for)h +(a)g(sp)s(eci\014c)f(program.)48 b(F)-8 b(or)p eop end +%%Page: 14 17 +TeXDict begin 14 16 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(14)1110 299 y(instance,)35 +b(the)e(follo)m(wing)h(command)f(adds)f(a)i(k)m(ey)f(sequence)h(that)f +(quotes)1110 408 y(the)e(curren)m(t)f(or)g(previous)g(w)m(ord)g(in)g +(Bash:)1350 543 y Fn($if)47 b(Bash)1350 653 y(#)g(Quote)g(the)g +(current)f(or)h(previous)e(word)1350 762 y("\\C-xq":)h +("\\eb\\"\\ef\\"")1350 872 y($endif)630 1031 y(variable)96 +b Fo(The)33 b Fe(v)-5 b(ariable)39 b Fo(construct)33 +b(pro)m(vides)g(simple)g(equalit)m(y)i(tests)e(for)g(Readline)1110 +1141 y(v)-5 b(ariables)32 b(and)f(v)-5 b(alues.)45 b(The)32 +b(p)s(ermitted)f(comparison)h(op)s(erators)f(are)i(`)p +Fn(=)p Fo(',)1110 1250 y(`)p Fn(==)p Fo(',)49 b(and)44 +b(`)p Fn(!=)p Fo('.)85 b(The)44 b(v)-5 b(ariable)46 b(name)f(m)m(ust)g +(b)s(e)g(separated)g(from)g(the)1110 1360 y(comparison)25 +b(op)s(erator)g(b)m(y)g(whitespace;)j(the)d(op)s(erator)g(ma)m(y)g(b)s +(e)f(separated)1110 1469 y(from)33 b(the)h(v)-5 b(alue)35 +b(on)f(the)g(righ)m(t)g(hand)f(side)h(b)m(y)f(whitespace.)52 +b(Both)35 b(string)1110 1579 y(and)i(b)s(o)s(olean)g(v)-5 +b(ariables)38 b(ma)m(y)h(b)s(e)d(tested.)63 b(Bo)s(olean)39 +b(v)-5 b(ariables)38 b(m)m(ust)g(b)s(e)1110 1689 y(tested)46 +b(against)g(the)f(v)-5 b(alues)46 b Fe(on)f Fo(and)f +Fe(o\013)p Fo(.)85 b(The)45 b(follo)m(wing)h(example)g(is)1110 +1798 y(equiv)-5 b(alen)m(t)32 b(to)f(the)f Fn(mode=emacs)e +Fo(test)j(describ)s(ed)f(ab)s(o)m(v)m(e:)1350 1933 y +Fn($if)47 b(editing-mode)d(==)k(emacs)1350 2042 y(set)f +(show-mode-in-prompt)42 b(on)1350 2152 y($endif)150 2311 +y($endif)192 b Fo(This)29 b(command,)i(as)f(seen)h(in)f(the)g(previous) +g(example,)h(terminates)g(an)g Fn($if)e Fo(command.)150 +2471 y Fn($else)240 b Fo(Commands)29 b(in)h(this)h(branc)m(h)e(of)i +(the)f Fn($if)g Fo(directiv)m(e)i(are)f(executed)g(if)f(the)h(test)g +(fails.)150 2630 y Fn($include)96 b Fo(This)43 b(directiv)m(e)i(tak)m +(es)g(a)e(single)i(\014lename)e(as)h(an)f(argumen)m(t)h(and)f(reads)g +(commands)630 2740 y(and)38 b(bindings)f(from)h(that)i(\014le.)65 +b(F)-8 b(or)39 b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e +(from)630 2849 y Fn(/etc/inputrc)p Fo(:)870 2984 y Fn($include)46 +b(/etc/inputrc)150 3183 y Fd(1.3.3)63 b(Sample)41 b(Init)g(File)150 +3330 y Fo(Here)27 b(is)f(an)h(example)g(of)f(an)h Fe(inputrc)k +Fo(\014le.)39 b(This)26 b(illustrates)h(k)m(ey)h(binding,)e(v)-5 +b(ariable)27 b(assignmen)m(t,)i(and)150 3440 y(conditional)j(syn)m +(tax.)p eop end +%%Page: 15 18 +TeXDict begin 15 17 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(15)390 408 y Fn(#)47 +b(This)g(file)g(controls)e(the)i(behaviour)e(of)j(line)e(input)h +(editing)e(for)390 518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h +(Readline)f(library.)93 b(Existing)390 628 y(#)47 b(programs)f(include) +g(FTP,)g(Bash,)h(and)g(GDB.)390 737 y(#)390 847 y(#)g(You)g(can)g +(re-read)f(the)h(inputrc)f(file)g(with)h(C-x)g(C-r.)390 +956 y(#)g(Lines)g(beginning)e(with)i('#')g(are)g(comments.)390 +1066 y(#)390 1176 y(#)g(First,)g(include)e(any)i(system-wide)e +(bindings)h(and)g(variable)390 1285 y(#)h(assignments)e(from)i +(/etc/Inputrc)390 1395 y($include)f(/etc/Inputrc)390 +1614 y(#)390 1724 y(#)h(Set)g(various)f(bindings)g(for)h(emacs)f(mode.) +390 1943 y(set)h(editing-mode)d(emacs)390 2162 y($if)j(mode=emacs)390 +2381 y(Meta-Control-h:)91 b(backward-kill-word)43 b(Text)k(after)f(the) +h(function)f(name)g(is)h(ignored)p 3970 2401 42 76 v +390 2600 a(#)390 2710 y(#)g(Arrow)g(keys)f(in)i(keypad)e(mode)390 +2819 y(#)390 2929 y(#"\\M-OD":)379 b(backward-char)390 +3039 y(#"\\M-OC":)g(forward-char)390 3148 y(#"\\M-OA":)g +(previous-history)390 3258 y(#"\\M-OB":)g(next-history)390 +3367 y(#)390 3477 y(#)47 b(Arrow)g(keys)f(in)i(ANSI)e(mode)390 +3587 y(#)390 3696 y("\\M-[D":)380 b(backward-char)390 +3806 y("\\M-[C":)g(forward-char)390 3915 y("\\M-[A":)g +(previous-history)390 4025 y("\\M-[B":)g(next-history)390 +4134 y(#)390 4244 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode) +390 4354 y(#)390 4463 y(#"\\M-\\C-OD":)331 b(backward-char)390 +4573 y(#"\\M-\\C-OC":)g(forward-char)390 4682 y(#"\\M-\\C-OA":)g +(previous-history)390 4792 y(#"\\M-\\C-OB":)g(next-history)390 +4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode) +390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390 +5340 y(#"\\M-\\C-[C":)g(forward-char)p eop end +%%Page: 16 19 +TeXDict begin 16 18 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(16)390 299 y Fn(#"\\M-\\C-[A":)331 +b(previous-history)390 408 y(#"\\M-\\C-[B":)g(next-history)390 +628 y(C-q:)47 b(quoted-insert)390 847 y($endif)390 1066 +y(#)g(An)h(old-style)d(binding.)93 b(This)47 b(happens)f(to)h(be)g(the) +g(default.)390 1176 y(TAB:)g(complete)390 1395 y(#)g(Macros)g(that)f +(are)h(convenient)e(for)i(shell)f(interaction)390 1504 +y($if)h(Bash)390 1614 y(#)g(edit)g(the)g(path)390 1724 +y("\\C-xp":)f("PATH=${PATH}\\e\\C-e\\C-a)o(\\ef)o(\\C-f)o(")390 +1833 y(#)h(prepare)f(to)h(type)g(a)h(quoted)e(word)g(--)390 +1943 y(#)h(insert)g(open)f(and)h(close)f(double)h(quotes)390 +2052 y(#)g(and)g(move)g(to)g(just)g(after)f(the)h(open)g(quote)390 +2162 y("\\C-x\\"":)e("\\"\\"\\C-b")390 2271 y(#)i(insert)g(a)g +(backslash)e(\(testing)h(backslash)f(escapes)390 2381 +y(#)i(in)h(sequences)d(and)i(macros\))390 2491 y("\\C-x\\\\":)e("\\\\") +390 2600 y(#)i(Quote)g(the)g(current)f(or)h(previous)e(word)390 +2710 y("\\C-xq":)h("\\eb\\"\\ef\\"")390 2819 y(#)h(Add)g(a)h(binding)e +(to)h(refresh)f(the)h(line,)f(which)g(is)h(unbound)390 +2929 y("\\C-xr":)f(redraw-current-line)390 3039 y(#)h(Edit)g(variable)f +(on)h(current)f(line.)390 3148 y("\\M-\\C-v":)f +("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-)o(a\\C-)o(y=")390 3258 +y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h +(available)390 3587 y(set)f(bell-style)e(visible)390 +3806 y(#)i(don't)g(strip)f(characters)f(to)i(7)h(bits)e(when)h(reading) +390 3915 y(set)g(input-meta)e(on)390 4134 y(#)i(allow)g(iso-latin1)e +(characters)g(to)i(be)g(inserted)f(rather)390 4244 y(#)h(than)g +(converted)e(to)j(prefix-meta)c(sequences)390 4354 y(set)j +(convert-meta)d(off)390 4573 y(#)j(display)f(characters)f(with)i(the)g +(eighth)f(bit)h(set)g(directly)390 4682 y(#)g(rather)g(than)f(as)h +(meta-prefixed)e(characters)390 4792 y(set)i(output-meta)e(on)390 +5011 y(#)i(if)h(there)e(are)h(150)g(or)g(more)g(possible)e(completions) +g(for)i(a)g(word,)390 5121 y(#)g(ask)g(whether)f(or)h(not)g(the)g(user) +g(wants)f(to)h(see)g(all)g(of)g(them)390 5230 y(set)g +(completion-query-items)42 b(150)p eop end +%%Page: 17 20 +TeXDict begin 17 19 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(17)390 299 y Fn(#)47 +b(For)g(FTP)390 408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390 +628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390 +847 y($endif)150 1089 y Fm(1.4)68 b(Bindable)45 b(Readline)i(Commands) +150 1248 y Fo(This)25 b(section)i(describ)s(es)d(Readline)j(commands)e +(that)h(ma)m(y)g(b)s(e)f(b)s(ound)f(to)i(k)m(ey)h(sequences.)39 +b(Command)150 1358 y(names)30 b(without)h(an)f(accompan)m(ying)i(k)m +(ey)f(sequence)g(are)g(un)m(b)s(ound)c(b)m(y)k(default.)275 +1493 y(In)25 b(the)h(follo)m(wing)i(descriptions,)f Fe(p)s(oin)m(t)h +Fo(refers)e(to)h(the)f(curren)m(t)g(cursor)g(p)s(osition,)h(and)f +Fe(mark)31 b Fo(refers)150 1603 y(to)40 b(a)f(cursor)f(p)s(osition)h +(sa)m(v)m(ed)h(b)m(y)f(the)g Fn(set-mark)d Fo(command.)66 +b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f(p)s(oin)m(t)g(and)150 +1713 y(mark)30 b(is)h(referred)e(to)i(as)g(the)f Fe(region)p +Fo(.)150 1913 y Fd(1.4.1)63 b(Commands)42 b(F)-10 b(or)41 +b(Mo)m(ving)150 2085 y Fn(beginning-of-line)26 b(\(C-a\))630 +2195 y Fo(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(curren)m(t)g +(line.)150 2355 y Fn(end-of-line)d(\(C-e\))630 2464 y +Fo(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150 +2625 y Fn(forward-char)c(\(C-f\))630 2734 y Fo(Mo)m(v)m(e)32 +b(forw)m(ard)e(a)h(c)m(haracter.)150 2895 y Fn(backward-char)c(\(C-b\)) +630 3004 y Fo(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150 +3165 y Fn(forward-word)d(\(M-f\))630 3274 y Fo(Mo)m(v)m(e)32 +b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41 +b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)i(and)630 +3384 y(digits.)150 3544 y Fn(backward-word)27 b(\(M-b\))630 +3654 y Fo(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g +(curren)m(t)f(or)g(previous)g(w)m(ord.)50 b(W)-8 b(ords)34 +b(are)g(comp)s(osed)630 3763 y(of)d(letters)g(and)f(digits.)150 +3923 y Fn(previous-screen-line)25 b(\(\))630 4033 y Fo(A)m(ttempt)41 +b(to)g(mo)m(v)m(e)h(p)s(oin)m(t)e(to)h(the)f(same)h(ph)m(ysical)g +(screen)f(column)g(on)g(the)g(previous)630 4143 y(ph)m(ysical)26 +b(screen)f(line.)39 b(This)24 b(will)i(not)f(ha)m(v)m(e)h(the)f +(desired)g(e\013ect)h(if)f(the)h(curren)m(t)e(Readline)630 +4252 y(line)k(do)s(es)f(not)g(tak)m(e)i(up)d(more)i(than)f(one)g(ph)m +(ysical)h(line)g(or)f(if)g(p)s(oin)m(t)h(is)f(not)h(greater)g(than)630 +4362 y(the)j(length)f(of)h(the)f(prompt)g(plus)f(the)i(screen)f(width.) +150 4522 y Fn(next-screen-line)c(\(\))630 4632 y Fo(A)m(ttempt)g(to)f +(mo)m(v)m(e)i(p)s(oin)m(t)d(to)i(the)e(same)i(ph)m(ysical)f(screen)g +(column)f(on)h(the)f(next)h(ph)m(ysical)630 4741 y(screen)e(line.)39 +b(This)23 b(will)g(not)h(ha)m(v)m(e)h(the)e(desired)g(e\013ect)i(if)e +(the)g(curren)m(t)h(Readline)g(line)f(do)s(es)630 4851 +y(not)k(tak)m(e)i(up)e(more)g(than)g(one)g(ph)m(ysical)h(line)g(or)f +(if)g(the)h(length)f(of)h(the)f(curren)m(t)g(Readline)630 +4960 y(line)k(is)f(not)h(greater)g(than)f(the)h(length)g(of)f(the)h +(prompt)e(plus)h(the)g(screen)h(width.)150 5121 y Fn(clear-display)c +(\(M-C-l\))630 5230 y Fo(Clear)33 b(the)g(screen)g(and,)h(if)e(p)s +(ossible,)i(the)f(terminal's)g(scrollbac)m(k)i(bu\013er,)e(then)f +(redra)m(w)630 5340 y(the)f(curren)m(t)f(line,)h(lea)m(ving)h(the)e +(curren)m(t)h(line)f(at)h(the)g(top)g(of)f(the)h(screen.)p +eop end +%%Page: 18 21 +TeXDict begin 18 20 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(18)150 299 y Fn(clear-screen)27 +b(\(C-l\))630 408 y Fo(Clear)35 b(the)f(screen,)i(then)e(redra)m(w)g +(the)h(curren)m(t)f(line,)i(lea)m(ving)g(the)f(curren)m(t)f(line)h(at)g +(the)630 518 y(top)c(of)f(the)h(screen.)150 665 y Fn +(redraw-current-line)25 b(\(\))630 775 y Fo(Refresh)30 +b(the)g(curren)m(t)h(line.)41 b(By)30 b(default,)h(this)f(is)h(un)m(b)s +(ound.)150 962 y Fd(1.4.2)63 b(Commands)42 b(F)-10 b(or)41 +b(Manipulating)h(The)f(History)150 1128 y Fn(accept-line)27 +b(\(Newline)h(or)i(Return\))630 1237 y Fo(Accept)36 b(the)g(line)f +(regardless)h(of)f(where)g(the)g(cursor)g(is.)55 b(If)34 +b(this)h(line)h(is)f(non-empt)m(y)-8 b(,)37 b(it)630 +1347 y(ma)m(y)32 b(b)s(e)g(added)f(to)h(the)g(history)g(list)h(for)e +(future)g(recall)j(with)d Fn(add_history\(\))p Fo(.)42 +b(If)31 b(this)630 1457 y(line)g(is)f(a)h(mo)s(di\014ed)e(history)h +(line,)h(the)g(history)f(line)h(is)f(restored)h(to)g(its)g(original)g +(state.)150 1604 y Fn(previous-history)26 b(\(C-p\))630 +1713 y Fo(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g(history)h(list,)g +(fetc)m(hing)g(the)g(previous)f(command.)150 1861 y Fn(next-history)d +(\(C-n\))630 1970 y Fo(Mo)m(v)m(e)32 b(`forw)m(ard')f(through)e(the)i +(history)f(list,)i(fetc)m(hing)f(the)g(next)f(command.)150 +2117 y Fn(beginning-of-history)25 b(\(M-<\))630 2227 +y Fo(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h(the)f(history)-8 +b(.)150 2374 y Fn(end-of-history)26 b(\(M->\))630 2484 +y Fo(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(input)e(history)-8 +b(,)31 b(i.e.,)h(the)f(line)f(curren)m(tly)h(b)s(eing)f(en)m(tered.)150 +2631 y Fn(reverse-search-history)24 b(\(C-r\))630 2741 +y Fo(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g(the)f(curren)m(t)g +(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g(his-)630 +2850 y(tory)26 b(as)h(necessary)-8 b(.)40 b(This)25 b(is)i(an)f +(incremen)m(tal)h(searc)m(h.)40 b(This)25 b(command)h(sets)h(the)f +(region)630 2960 y(to)31 b(the)g(matc)m(hed)g(text)g(and)f(activ)-5 +b(ates)33 b(the)d(mark.)150 3107 y Fn(forward-search-history)24 +b(\(C-s\))630 3217 y Fo(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h +(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the) +630 3326 y(history)38 b(as)g(necessary)-8 b(.)65 b(This)38 +b(is)g(an)g(incremen)m(tal)h(searc)m(h.)65 b(This)37 +b(command)h(sets)h(the)630 3436 y(region)31 b(to)g(the)g(matc)m(hed)g +(text)g(and)f(activ)-5 b(ates)33 b(the)d(mark.)150 3583 +y Fn(non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24 +b(\(M-p\))630 3693 y Fo(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g +(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g +(his-)630 3802 y(tory)36 b(as)g(necessary)h(using)e(a)i(non-incremen)m +(tal)g(searc)m(h)f(for)g(a)g(string)g(supplied)f(b)m(y)h(the)630 +3912 y(user.)k(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an)m +(ywhere)g(in)f(a)h(history)f(line.)150 4059 y Fn +(non-incremental-forward-)o(sear)o(ch-h)o(ist)o(ory)24 +b(\(M-n\))630 4169 y Fo(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h +(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the) +630 4278 y(history)27 b(as)f(necessary)i(using)e(a)h(non-incremen)m +(tal)g(searc)m(h)h(for)e(a)h(string)g(supplied)e(b)m(y)i(the)630 +4388 y(user.)40 b(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an) +m(ywhere)g(in)f(a)h(history)f(line.)150 4535 y Fn +(history-search-forward)24 b(\(\))630 4645 y Fo(Searc)m(h)42 +b(forw)m(ard)f(through)f(the)i(history)f(for)g(the)h(string)f(of)h(c)m +(haracters)h(b)s(et)m(w)m(een)f(the)630 4754 y(start)36 +b(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.)58 +b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)630 +4864 y(b)s(eginning)32 b(of)g(a)h(history)g(line.)47 +b(This)32 b(is)h(a)f(non-incremen)m(tal)i(searc)m(h.)48 +b(By)33 b(default,)g(this)630 4974 y(command)d(is)h(un)m(b)s(ound.)150 +5121 y Fn(history-search-backward)24 b(\(\))630 5230 +y Fo(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g +(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630 +5340 y(start)g(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.) +58 b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)p +eop end +%%Page: 19 22 +TeXDict begin 19 21 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(19)630 299 y(b)s(eginning)32 +b(of)g(a)h(history)g(line.)47 b(This)32 b(is)h(a)f(non-incremen)m(tal)i +(searc)m(h.)48 b(By)33 b(default,)g(this)630 408 y(command)d(is)h(un)m +(b)s(ound.)150 566 y Fn(history-substring-search)o(-for)o(ward)24 +b(\(\))630 676 y Fo(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i +(history)f(for)g(the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f +(the)630 785 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h(p) +s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h(an)m +(ywhere)630 895 y(in)i(a)h(history)g(line.)47 b(This)32 +b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33 +b(default,)h(this)e(command)630 1005 y(is)e(un)m(b)s(ound.)150 +1162 y Fn(history-substring-search)o(-bac)o(kwar)o(d)24 +b(\(\))630 1272 y Fo(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h +(history)g(for)g(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g +(the)630 1381 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h +(p)s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h +(an)m(ywhere)630 1491 y(in)i(a)h(history)g(line.)47 b(This)32 +b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33 +b(default,)h(this)e(command)630 1601 y(is)e(un)m(b)s(ound.)150 +1758 y Fn(yank-nth-arg)d(\(M-C-y\))630 1868 y Fo(Insert)37 +b(the)g(\014rst)f(argumen)m(t)i(to)f(the)h(previous)e(command)h +(\(usually)g(the)g(second)g(w)m(ord)630 1978 y(on)32 +b(the)g(previous)f(line\))i(at)f(p)s(oin)m(t.)46 b(With)32 +b(an)g(argumen)m(t)g Fe(n)p Fo(,)g(insert)g(the)g Fe(n)p +Fo(th)f(w)m(ord)g(from)630 2087 y(the)k(previous)f(command)h(\(the)g(w) +m(ords)g(in)f(the)h(previous)g(command)f(b)s(egin)h(with)f(w)m(ord)630 +2197 y(0\).)69 b(A)40 b(negativ)m(e)h(argumen)m(t)f(inserts)g(the)f +Fe(n)p Fo(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630 +2306 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fe(n)e +Fo(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630 +2416 y(the)e(`)p Fn(!)p Fg(n)p Fo(')f(history)g(expansion)g(had)g(b)s +(een)g(sp)s(eci\014ed.)150 2574 y Fn(yank-last-arg)d(\(M-.)i(or)h +(M-_\))630 2683 y Fo(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous) +f(command)h(\(the)h(last)f(w)m(ord)g(of)g(the)g(previous)630 +2793 y(history)e(en)m(try\).)51 b(With)34 b(a)g(n)m(umeric)g(argumen)m +(t,)h(b)s(eha)m(v)m(e)f(exactly)h(lik)m(e)g Fn(yank-nth-arg)p +Fo(.)630 2902 y(Successiv)m(e)26 b(calls)g(to)f Fn(yank-last-arg)c +Fo(mo)m(v)m(e)27 b(bac)m(k)e(through)f(the)h(history)g(list,)i +(inserting)630 3012 y(the)c(last)g(w)m(ord)f(\(or)h(the)g(w)m(ord)f(sp) +s(eci\014ed)g(b)m(y)g(the)h(argumen)m(t)g(to)g(the)g(\014rst)f(call\))i +(of)f(eac)m(h)h(line)630 3122 y(in)36 b(turn.)58 b(An)m(y)36 +b(n)m(umeric)h(argumen)m(t)f(supplied)g(to)h(these)g(successiv)m(e)g +(calls)h(determines)630 3231 y(the)d(direction)g(to)h(mo)m(v)m(e)g +(through)e(the)h(history)-8 b(.)54 b(A)35 b(negativ)m(e)i(argumen)m(t)e +(switc)m(hes)h(the)630 3341 y(direction)23 b(through)g(the)g(history)f +(\(bac)m(k)i(or)f(forw)m(ard\).)38 b(The)22 b(history)h(expansion)g +(facilities)630 3450 y(are)28 b(used)f(to)h(extract)h(the)f(last)g +(argumen)m(t,)h(as)e(if)h(the)g(`)p Fn(!$)p Fo(')f(history)g(expansion) +h(had)f(b)s(een)630 3560 y(sp)s(eci\014ed.)150 3718 y +Fn(operate-and-get-next)e(\(C-o\))630 3827 y Fo(Accept)30 +b(the)g(curren)m(t)e(line)i(for)f(return)f(to)h(the)h(calling)g +(application)h(as)e(if)g(a)h(newline)f(had)630 3937 y(b)s(een)22 +b(en)m(tered,)k(and)d(fetc)m(h)h(the)f(next)g(line)h(relativ)m(e)h(to)f +(the)f(curren)m(t)g(line)h(from)f(the)g(history)630 4046 +y(for)31 b(editing.)43 b(A)31 b(n)m(umeric)f(argumen)m(t,)i(if)f +(supplied,)f(sp)s(eci\014es)h(the)g(history)f(en)m(try)i(to)f(use)630 +4156 y(instead)g(of)f(the)h(curren)m(t)f(line.)150 4314 +y Fn(fetch-history)d(\(\))630 4423 y Fo(With)e(a)f(n)m(umeric)g +(argumen)m(t,)i(fetc)m(h)f(that)g(en)m(try)f(from)g(the)g(history)g +(list)h(and)e(mak)m(e)i(it)g(the)630 4533 y(curren)m(t)30 +b(line.)41 b(Without)30 b(an)g(argumen)m(t,)h(mo)m(v)m(e)g(bac)m(k)g +(to)f(the)g(\014rst)f(en)m(try)h(in)g(the)g(history)630 +4643 y(list.)150 4840 y Fd(1.4.3)63 b(Commands)42 b(F)-10 +b(or)41 b(Changing)g(T)-10 b(ext)150 5011 y Fg(end-of-file)27 +b Fn(\(usually)h(C-d\))630 5121 y Fo(The)e(c)m(haracter)h(indicating)h +(end-of-\014le)e(as)h(set,)g(for)f(example,)i(b)m(y)e +Fn(stty)p Fo(.)39 b(If)25 b(this)h(c)m(harac-)630 5230 +y(ter)c(is)g(read)g(when)e(there)i(are)h(no)e(c)m(haracters)j(on)d(the) +h(line,)i(and)d(p)s(oin)m(t)h(is)g(at)h(the)f(b)s(eginning)630 +5340 y(of)31 b(the)f(line,)h(Readline)g(in)m(terprets)g(it)g(as)f(the)h +(end)f(of)g(input)f(and)h(returns)f Fh(eof)p Fo(.)p eop +end +%%Page: 20 23 +TeXDict begin 20 22 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(20)150 299 y Fn(delete-char)27 +b(\(C-d\))630 408 y Fo(Delete)35 b(the)f(c)m(haracter)h(at)f(p)s(oin)m +(t.)49 b(If)33 b(this)g(function)g(is)g(b)s(ound)e(to)j(the)g(same)f(c) +m(haracter)630 518 y(as)e(the)f(tt)m(y)i Fh(eof)d Fo(c)m(haracter,)j +(as)f Fg(C-d)e Fo(commonly)i(is,)g(see)g(ab)s(o)m(v)m(e)h(for)e(the)g +(e\013ects.)150 669 y Fn(backward-delete-char)25 b(\(Rubout\))630 +779 y Fo(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40 +b(A)30 b(n)m(umeric)g(argumen)m(t)h(means)f(to)h(kill)g(the)630 +889 y(c)m(haracters)h(instead)e(of)h(deleting)g(them.)150 +1040 y Fn(forward-backward-delete-)o(char)24 b(\(\))630 +1149 y Fo(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h +(unless)d(the)i(cursor)e(is)h(at)h(the)g(end)e(of)i(the)630 +1259 y(line,)33 b(in)e(whic)m(h)g(case)i(the)f(c)m(haracter)h(b)s +(ehind)d(the)i(cursor)f(is)g(deleted.)46 b(By)32 b(default,)g(this)630 +1369 y(is)e(not)h(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 +1520 y Fn(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 1630 +y Fo(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h +(v)m(erbatim.)53 b(This)33 b(is)i(ho)m(w)f(to)h(insert)f(k)m(ey)630 +1739 y(sequences)d(lik)m(e)g Fg(C-q)p Fo(,)f(for)g(example.)150 +1891 y Fn(tab-insert)e(\(M-TAB\))630 2000 y Fo(Insert)i(a)h(tab)f(c)m +(haracter.)150 2151 y Fn(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o +(\))630 2261 y Fo(Insert)g(y)m(ourself.)150 2412 y Fn +(bracketed-paste-begin)25 b(\(\))630 2522 y Fo(This)f(function)h(is)f +(in)m(tended)h(to)h(b)s(e)e(b)s(ound)f(to)i(the)g Fn(")p +Fo(brac)m(k)m(eted)h(paste)p Fn(")f Fo(escap)s(e)h(sequence)630 +2632 y(sen)m(t)38 b(b)m(y)f(some)h(terminals,)i(and)d(suc)m(h)g(a)h +(binding)e(is)i(assigned)f(b)m(y)h(default.)62 b(It)38 +b(allo)m(ws)630 2741 y(Readline)33 b(to)g(insert)g(the)f(pasted)h(text) +g(as)g(a)g(single)g(unit)f(without)h(treating)h(eac)m(h)f(c)m(har-)630 +2851 y(acter)40 b(as)f(if)g(it)g(had)f(b)s(een)g(read)h(from)f(the)h(k) +m(eyb)s(oard.)66 b(The)39 b(c)m(haracters)h(are)f(inserted)630 +2960 y(as)44 b(if)g(eac)m(h)i(one)e(w)m(as)g(b)s(ound)e(to)j +Fn(self-insert)c Fo(instead)j(of)h(executing)g(an)m(y)f(editing)630 +3070 y(commands.)630 3200 y(Brac)m(k)m(eted)38 b(paste)f(sets)f(the)h +(region)f(\(the)h(c)m(haracters)g(b)s(et)m(w)m(een)g(p)s(oin)m(t)f(and) +g(the)g(mark\))630 3310 y(to)j(the)g(inserted)f(text.)65 +b(It)39 b(uses)f(the)g(concept)h(of)g(an)f Ff(active)i(mark)10 +b Fo(:)57 b(when)38 b(the)g(mark)630 3420 y(is)d(activ)m(e,)k(Readline) +c(redispla)m(y)h(uses)e(the)h(terminal's)h(standout)f(mo)s(de)f(to)i +(denote)g(the)630 3529 y(region.)150 3680 y Fn(transpose-chars)26 +b(\(C-t\))630 3790 y Fo(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f(the) +g(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e(the)g +(cursor,)630 3900 y(mo)m(ving)k(the)g(cursor)f(forw)m(ard)g(as)g(w)m +(ell.)57 b(If)35 b(the)h(insertion)g(p)s(oin)m(t)f(is)g(at)i(the)e(end) +g(of)h(the)630 4009 y(line,)24 b(then)e(this)g(transp)s(oses)f(the)h +(last)h(t)m(w)m(o)g(c)m(haracters)g(of)f(the)h(line.)38 +b(Negativ)m(e)25 b(argumen)m(ts)630 4119 y(ha)m(v)m(e)32 +b(no)e(e\013ect.)150 4270 y Fn(transpose-words)c(\(M-t\))630 +4380 y Fo(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g +(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s(oin)m(t)f(past) +g(that)630 4489 y(w)m(ord)c(as)h(w)m(ell.)41 b(If)27 +b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i(the)f +(line,)i(this)e(transp)s(oses)g(the)630 4599 y(last)j(t)m(w)m(o)h(w)m +(ords)e(on)g(the)h(line.)150 4750 y Fn(upcase-word)c(\(M-u\))630 +4860 y Fo(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i +(w)m(ord.)45 b(With)32 b(a)g(negativ)m(e)j(argumen)m(t,)e(upp)s(er-)630 +4969 y(case)e(the)g(previous)f(w)m(ord,)g(but)g(do)g(not)h(mo)m(v)m(e)h +(the)e(cursor.)150 5121 y Fn(downcase-word)d(\(M-l\))630 +5230 y Fo(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i +(w)m(ord.)37 b(With)22 b(a)g(negativ)m(e)i(argumen)m(t,)g(lo)m(w)m +(ercase)630 5340 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f(mo)m +(v)m(e)i(the)f(cursor.)p eop end +%%Page: 21 24 +TeXDict begin 21 23 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(21)150 299 y Fn(capitalize-word)26 +b(\(M-c\))630 408 y Fo(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m +(wing\))i(w)m(ord.)38 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h +(capitalize)630 518 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f +(mo)m(v)m(e)i(the)f(cursor.)150 678 y Fn(overwrite-mode)26 +b(\(\))630 788 y Fo(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48 +b(With)33 b(an)g(explicit)h(p)s(ositiv)m(e)g(n)m(umeric)f(argumen)m(t,) +h(switc)m(hes)630 897 y(to)22 b(o)m(v)m(erwrite)i(mo)s(de.)37 +b(With)22 b(an)g(explicit)h(non-p)s(ositiv)m(e)f(n)m(umeric)g(argumen)m +(t,)i(switc)m(hes)e(to)630 1007 y(insert)30 b(mo)s(de.)41 +b(This)30 b(command)h(a\013ects)h(only)e Fn(emacs)f Fo(mo)s(de;)i +Fn(vi)f Fo(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 1116 +y(di\013eren)m(tly)-8 b(.)42 b(Eac)m(h)31 b(call)h(to)f +Fn(readline\(\))c Fo(starts)k(in)f(insert)g(mo)s(de.)630 +1251 y(In)52 b(o)m(v)m(erwrite)h(mo)s(de,)58 b(c)m(haracters)c(b)s +(ound)c(to)j Fn(self-insert)c Fo(replace)k(the)g(text)g(at)630 +1361 y(p)s(oin)m(t)59 b(rather)f(than)h(pushing)e(the)i(text)g(to)h +(the)f(righ)m(t.)126 b(Characters)59 b(b)s(ound)d(to)630 +1470 y Fn(backward-delete-char)25 b Fo(replace)31 b(the)g(c)m(haracter) +h(b)s(efore)e(p)s(oin)m(t)g(with)g(a)h(space.)630 1605 +y(By)g(default,)f(this)h(command)f(is)g(un)m(b)s(ound.)150 +1805 y Fd(1.4.4)63 b(Killing)42 b(And)e(Y)-10 b(anking)150 +1977 y Fn(kill-line)28 b(\(C-k\))630 2087 y Fo(Kill)k(the)f(text)i +(from)d(p)s(oin)m(t)i(to)g(the)f(end)g(of)g(the)h(line.)44 +b(With)31 b(a)h(negativ)m(e)i(n)m(umeric)d(argu-)630 +2197 y(men)m(t,)g(kill)g(bac)m(kw)m(ard)g(from)f(the)g(cursor)g(to)h +(the)g(b)s(eginning)e(of)i(the)g(curren)m(t)f(line.)150 +2357 y Fn(backward-kill-line)25 b(\(C-x)30 b(Rubout\))630 +2466 y Fo(Kill)40 b(bac)m(kw)m(ard)h(from)e(the)h(cursor)g(to)g(the)g +(b)s(eginning)g(of)g(the)g(curren)m(t)f(line.)70 b(With)41 +b(a)630 2576 y(negativ)m(e)47 b(n)m(umeric)e(argumen)m(t,)50 +b(kill)c(forw)m(ard)e(from)h(the)g(cursor)g(to)h(the)f(end)f(of)i(the) +630 2685 y(curren)m(t)30 b(line.)150 2845 y Fn(unix-line-discard)c +(\(C-u\))630 2955 y Fo(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor)f +(to)h(the)f(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150 +3115 y Fn(kill-whole-line)c(\(\))630 3225 y Fo(Kill)37 +b(all)g(c)m(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g +(where)f(p)s(oin)m(t)h(is.)59 b(By)36 b(default,)630 +3334 y(this)30 b(is)h(un)m(b)s(ound.)150 3494 y Fn(kill-word)d(\(M-d\)) +630 3604 y Fo(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f +(curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)h +(the)g(end)630 3713 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8 +b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Fn(forward-word)p +Fo(.)150 3874 y Fn(backward-kill-word)25 b(\(M-DEL\))630 +3983 y Fo(Kill)k(the)g(w)m(ord)g(b)s(ehind)e(p)s(oin)m(t.)40 +b(W)-8 b(ord)29 b(b)s(oundaries)f(are)h(the)g(same)g(as)g +Fn(backward-word)p Fo(.)150 4143 y Fn(shell-transpose-words)c +(\(M-C-t\))630 4253 y Fo(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin) +m(t)g(past)g(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s +(oin)m(t)f(past)g(that)630 4362 y(w)m(ord)c(as)h(w)m(ell.)41 +b(If)27 b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i +(the)f(line,)i(this)e(transp)s(oses)g(the)630 4472 y(last)j(t)m(w)m(o)h +(w)m(ords)d(on)i(the)f(line.)41 b(W)-8 b(ord)31 b(b)s(oundaries)e(are)h +(the)h(same)f(as)h Fn(shell-forward-)630 4582 y(word)e +Fo(and)h Fn(shell-backward-word)p Fo(.)150 4742 y Fn(unix-word-rubout)c +(\(C-w\))630 4851 y Fo(Kill)32 b(the)g(w)m(ord)f(b)s(ehind)f(p)s(oin)m +(t,)i(using)f(white)h(space)g(as)g(a)g(w)m(ord)f(b)s(oundary)-8 +b(.)43 b(The)31 b(killed)630 4961 y(text)g(is)g(sa)m(v)m(ed)g(on)g(the) +f(kill-ring.)150 5121 y Fn(unix-filename-rubout)25 b(\(\))630 +5230 y Fo(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m(t,)j(using)e +(white)g(space)h(and)f(the)g(slash)g(c)m(haracter)i(as)f(the)630 +5340 y(w)m(ord)30 b(b)s(oundaries.)39 b(The)30 b(killed)h(text)g(is)g +(sa)m(v)m(ed)g(on)g(the)f(kill-ring.)p eop end +%%Page: 22 25 +TeXDict begin 22 24 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(22)150 299 y Fn +(delete-horizontal-space)24 b(\(\))630 408 y Fo(Delete)33 +b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41 +b(By)31 b(default,)f(this)h(is)f(un)m(b)s(ound.)150 564 +y Fn(kill-region)d(\(\))630 673 y Fo(Kill)k(the)f(text)i(in)e(the)g +(curren)m(t)h(region.)41 b(By)31 b(default,)f(this)h(command)f(is)g(un) +m(b)s(ound.)150 829 y Fn(copy-region-as-kill)25 b(\(\))630 +938 y Fo(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f(kill) +h(bu\013er,)f(so)g(it)h(can)f(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)f(a)m(w)m +(a)m(y)-8 b(.)630 1048 y(By)31 b(default,)f(this)h(command)f(is)g(un)m +(b)s(ound.)150 1203 y Fn(copy-backward-word)25 b(\(\))630 +1313 y Fo(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(to)i +(the)e(kill)h(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries)f(are)i +(the)630 1422 y(same)31 b(as)f Fn(backward-word)p Fo(.)38 +b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150 +1578 y Fn(copy-forward-word)26 b(\(\))630 1687 y Fo(Cop)m(y)31 +b(the)g(w)m(ord)g(follo)m(wing)h(p)s(oin)m(t)f(to)h(the)f(kill)h +(bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)e(are)j(the)630 +1797 y(same)f(as)f Fn(forward-word)p Fo(.)38 b(By)30 +b(default,)h(this)g(command)f(is)g(un)m(b)s(ound.)150 +1952 y Fn(yank)f(\(C-y\))630 2062 y Fo(Y)-8 b(ank)31 +b(the)f(top)h(of)g(the)f(kill)h(ring)f(in)m(to)i(the)e(bu\013er)g(at)h +(p)s(oin)m(t.)150 2217 y Fn(yank-pop)d(\(M-y\))630 2327 +y Fo(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h(the)f(new)g(top.)54 +b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h(the)g(prior)630 +2436 y(command)30 b(is)h Fn(yank)e Fo(or)h Fn(yank-pop)p +Fo(.)150 2631 y Fd(1.4.5)63 b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m +(ts)150 2801 y Fn(digit-argument)26 b(\()p Fg(M-0)p Fn(,)j +Fg(M-1)p Fn(,)h(...)f Fg(M--)p Fn(\))630 2911 y Fo(Add)d(this)h(digit)g +(to)h(the)f(argumen)m(t)g(already)h(accum)m(ulating,)h(or)e(start)h(a)f +(new)f(argumen)m(t.)630 3020 y Fg(M--)j Fo(starts)i(a)g(negativ)m(e)i +(argumen)m(t.)150 3176 y Fn(universal-argument)25 b(\(\))630 +3285 y Fo(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g +(argumen)m(t.)40 b(If)25 b(this)g(command)h(is)f(follo)m(w)m(ed)i(b)m +(y)f(one)630 3395 y(or)k(more)f(digits,)i(optionally)g(with)e(a)h +(leading)h(min)m(us)e(sign,)h(those)g(digits)g(de\014ne)f(the)h(ar-)630 +3505 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)g(follo)m(w)m(ed)h(b) +m(y)f(digits,)i(executing)f Fn(universal-argument)630 +3614 y Fo(again)j(ends)e(the)h(n)m(umeric)f(argumen)m(t,)i(but)e(is)h +(otherwise)g(ignored.)45 b(As)32 b(a)g(sp)s(ecial)h(case,)630 +3724 y(if)g(this)g(command)f(is)h(immediately)h(follo)m(w)m(ed)h(b)m(y) +d(a)h(c)m(haracter)i(that)e(is)g(neither)g(a)g(digit)630 +3833 y(nor)41 b(min)m(us)f(sign,)k(the)e(argumen)m(t)f(coun)m(t)h(for)f +(the)h(next)f(command)g(is)g(m)m(ultiplied)h(b)m(y)630 +3943 y(four.)54 b(The)35 b(argumen)m(t)g(coun)m(t)h(is)f(initially)h +(one,)h(so)e(executing)i(this)e(function)f(the)i(\014rst)630 +4053 y(time)29 b(mak)m(es)h(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)h +(second)g(time)g(mak)m(es)h(the)e(argumen)m(t)h(coun)m(t)630 +4162 y(sixteen,)i(and)f(so)h(on.)40 b(By)31 b(default,)g(this)f(is)g +(not)h(b)s(ound)d(to)k(a)e(k)m(ey)-8 b(.)150 4357 y Fd(1.4.6)63 +b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42 +b(Y)-10 b(ou)150 4527 y Fn(complete)28 b(\(TAB\))630 +4637 y Fo(A)m(ttempt)c(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g +(b)s(efore)f(p)s(oin)m(t.)39 b(The)22 b(actual)i(completion)630 +4746 y(p)s(erformed)29 b(is)h(application-sp)s(eci\014c.)42 +b(The)30 b(default)h(is)f(\014lename)h(completion.)150 +4902 y Fn(possible-completions)25 b(\(M-?\))630 5011 +y Fo(List)35 b(the)g(p)s(ossible)f(completions)i(of)e(the)h(text)h(b)s +(efore)e(p)s(oin)m(t.)54 b(When)34 b(displa)m(ying)h(com-)630 +5121 y(pletions,)f(Readline)f(sets)f(the)h(n)m(um)m(b)s(er)e(of)i +(columns)f(used)f(for)i(displa)m(y)f(to)h(the)g(v)-5 +b(alue)33 b(of)630 5230 y Fn(completion-display-width)o +Fo(,)g(the)j(v)-5 b(alue)37 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5 +b(ariable)38 b Fn(COLUMNS)p Fo(,)630 5340 y(or)30 b(the)h(screen)f +(width,)g(in)g(that)h(order.)p eop end +%%Page: 23 26 +TeXDict begin 23 25 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(23)150 299 y Fn +(insert-completions)25 b(\(M-*\))630 408 y Fo(Insert)30 +b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f(p)s(oin)m(t)h(that) +g(w)m(ould)f(ha)m(v)m(e)i(b)s(een)e(generated)630 518 +y(b)m(y)g Fn(possible-completions)p Fo(.)150 673 y Fn(menu-complete)d +(\(\))630 783 y Fo(Similar)d(to)g Fn(complete)p Fo(,)f(but)h(replaces)g +(the)g(w)m(ord)g(to)g(b)s(e)f(completed)i(with)e(a)i(single)f(matc)m(h) +630 893 y(from)37 b(the)h(list)h(of)f(p)s(ossible)f(completions.)64 +b(Rep)s(eated)39 b(execution)g(of)f Fn(menu-complete)630 +1002 y Fo(steps)i(through)g(the)g(list)h(of)f(p)s(ossible)g +(completions,)k(inserting)c(eac)m(h)i(matc)m(h)f(in)f(turn.)630 +1112 y(A)m(t)e(the)f(end)f(of)h(the)g(list)g(of)g(completions,)i(the)e +(b)s(ell)g(is)g(rung)f(\(sub)5 b(ject)36 b(to)i(the)f(setting)630 +1221 y(of)f Fn(bell-style)p Fo(\))e(and)h(the)h(original)i(text)f(is)f +(restored.)57 b(An)36 b(argumen)m(t)h(of)f Fe(n)f Fo(mo)m(v)m(es)i +Fe(n)630 1331 y Fo(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e +(matc)m(hes;)39 b(a)c(negativ)m(e)i(argumen)m(t)e(ma)m(y)g(b)s(e)f +(used)g(to)630 1441 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g +(list.)65 b(This)38 b(command)g(is)g(in)m(tended)g(to)h(b)s(e)f(b)s +(ound)e(to)630 1550 y Fn(TAB)p Fo(,)30 b(but)f(is)i(un)m(b)s(ound)d(b)m +(y)i(default.)150 1705 y Fn(menu-complete-backward)24 +b(\(\))630 1815 y Fo(Iden)m(tical)36 b(to)g Fn(menu-complete)p +Fo(,)d(but)h(mo)m(v)m(es)j(bac)m(kw)m(ard)e(through)f(the)i(list)f(of)g +(p)s(ossible)630 1925 y(completions,)d(as)e(if)h Fn(menu-complete)26 +b Fo(had)k(b)s(een)g(giv)m(en)h(a)g(negativ)m(e)i(argumen)m(t.)150 +2080 y Fn(delete-char-or-list)25 b(\(\))630 2190 y Fo(Deletes)41 +b(the)e(c)m(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)h(b)s +(eginning)e(or)h(end)f(of)h(the)630 2299 y(line)50 b(\(lik)m(e)h +Fn(delete-char)p Fo(\).)96 b(If)49 b(at)h(the)g(end)f(of)h(the)f(line,) +55 b(b)s(eha)m(v)m(es)c(iden)m(tically)g(to)630 2409 +y Fn(possible-completions)p Fo(.)35 b(This)30 b(command)g(is)g(un)m(b)s +(ound)e(b)m(y)i(default.)150 2604 y Fd(1.4.7)63 b(Keyb)s(oard)41 +b(Macros)150 2774 y Fn(start-kbd-macro)26 b(\(C-x)j(\(\))630 +2883 y Fo(Begin)i(sa)m(ving)h(the)e(c)m(haracters)i(t)m(yp)s(ed)e(in)m +(to)h(the)g(curren)m(t)f(k)m(eyb)s(oard)g(macro.)150 +3039 y Fn(end-kbd-macro)d(\(C-x)i(\)\))630 3148 y Fo(Stop)e(sa)m(ving)h +(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m(to)i(the)e(curren)m(t)g(k)m +(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i(the)630 3258 +y(de\014nition.)150 3413 y Fn(call-last-kbd-macro)c(\(C-x)k(e\))630 +3523 y Fo(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard)f(macro)h +(de\014ned,)f(b)m(y)h(making)f(the)g(c)m(haracters)i(in)e(the)630 +3632 y(macro)c(app)s(ear)f(as)g(if)h(t)m(yp)s(ed)f(at)h(the)f(k)m(eyb)s +(oard.)150 3788 y Fn(print-last-kbd-macro)25 b(\(\))630 +3897 y Fo(Prin)m(t)30 b(the)g(last)h(k)m(eyb)s(oard)f(macro)h +(de\014ned)e(in)h(a)g(format)h(suitable)g(for)f(the)g +Fe(inputrc)35 b Fo(\014le.)150 4092 y Fd(1.4.8)63 b(Some)41 +b(Miscellaneous)i(Commands)150 4262 y Fn(re-read-init-file)26 +b(\(C-x)j(C-r\))630 4372 y Fo(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of) +f(the)g Fe(inputrc)27 b Fo(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h +(bindings)d(or)i(v)-5 b(ariable)630 4481 y(assignmen)m(ts)31 +b(found)e(there.)150 4637 y Fn(abort)g(\(C-g\))630 4746 +y Fo(Ab)s(ort)d(the)h(curren)m(t)f(editing)h(command)f(and)g(ring)h +(the)f(terminal's)h(b)s(ell)g(\(sub)5 b(ject)26 b(to)i(the)630 +4856 y(setting)j(of)g Fn(bell-style)p Fo(\).)150 5011 +y Fn(do-lowercase-version)25 b(\(M-A,)k(M-B,)g(M-)p Fg(x)p +Fn(,)g(...)o(\))630 5121 y Fo(If)35 b(the)g(meta\014ed)g(c)m(haracter)i +Fe(x)k Fo(is)35 b(upp)s(er)e(case,)k(run)d(the)h(command)g(that)g(is)g +(b)s(ound)e(to)630 5230 y(the)g(corresp)s(onding)f(meta\014ed)h(lo)m(w) +m(er)i(case)f(c)m(haracter.)50 b(The)32 b(b)s(eha)m(vior)h(is)g +(unde\014ned)e(if)630 5340 y Fe(x)37 b Fo(is)30 b(already)h(lo)m(w)m +(er)h(case.)p eop end +%%Page: 24 27 +TeXDict begin 24 26 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(24)150 299 y Fn(prefix-meta)27 +b(\(ESC\))630 408 y Fo(Metafy)39 b(the)e(next)h(c)m(haracter)h(t)m(yp)s +(ed.)62 b(This)37 b(is)g(for)h(k)m(eyb)s(oards)f(without)g(a)h(meta)g +(k)m(ey)-8 b(.)630 518 y(T)m(yping)30 b(`)p Fn(ESC)g(f)p +Fo(')g(is)h(equiv)-5 b(alen)m(t)31 b(to)g(t)m(yping)g +Fg(M-f)p Fo(.)150 704 y Fn(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630 +814 y Fo(Incremen)m(tal)h(undo,)f(separately)h(remem)m(b)s(ered)f(for)g +(eac)m(h)i(line.)150 1000 y Fn(revert-line)27 b(\(M-r\))630 +1110 y Fo(Undo)33 b(all)h(c)m(hanges)g(made)f(to)h(this)f(line.)49 +b(This)32 b(is)h(lik)m(e)i(executing)f(the)f Fn(undo)f +Fo(command)630 1219 y(enough)e(times)h(to)g(get)h(bac)m(k)f(to)g(the)f +(b)s(eginning.)150 1406 y Fn(tilde-expand)d(\(M-~\))630 +1515 y Fo(P)m(erform)j(tilde)h(expansion)g(on)f(the)g(curren)m(t)h(w)m +(ord.)150 1702 y Fn(set-mark)d(\(C-@\))630 1811 y Fo(Set)33 +b(the)g(mark)f(to)i(the)f(p)s(oin)m(t.)48 b(If)32 b(a)h(n)m(umeric)g +(argumen)m(t)g(is)g(supplied,)f(the)h(mark)g(is)f(set)630 +1921 y(to)f(that)g(p)s(osition.)150 2107 y Fn(exchange-point-and-mark) +24 b(\(C-x)29 b(C-x\))630 2217 y Fo(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with) +g(the)g(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)i(is)f +(set)h(to)f(the)h(sa)m(v)m(ed)630 2326 y(p)s(osition,)f(and)e(the)i +(old)g(cursor)e(p)s(osition)i(is)f(sa)m(v)m(ed)i(as)e(the)h(mark.)150 +2513 y Fn(character-search)26 b(\(C-]\))630 2622 y Fo(A)f(c)m(haracter) +h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)g(the)f(next)g +(o)s(ccurrence)g(of)g(that)g(c)m(haracter.)630 2732 y(A)30 +b(negativ)m(e)j(argumen)m(t)e(searc)m(hes)g(for)f(previous)g(o)s +(ccurrences.)150 2918 y Fn(character-search-backwar)o(d)24 +b(\(M-C-]\))630 3028 y Fo(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s +(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)f(the)g(previous)f(o)s(ccurrence)h(of) +g(that)630 3137 y(c)m(haracter.)d(A)31 b(negativ)m(e)h(argumen)m(t)f +(searc)m(hes)g(for)g(subsequen)m(t)e(o)s(ccurrences.)150 +3324 y Fn(skip-csi-sequence)d(\(\))630 3433 y Fo(Read)i(enough)f(c)m +(haracters)h(to)g(consume)f(a)h(m)m(ulti-k)m(ey)h(sequence)f(suc)m(h)f +(as)g(those)h(de\014ned)630 3543 y(for)37 b(k)m(eys)h(lik)m(e)g(Home)g +(and)f(End.)60 b(Suc)m(h)37 b(sequences)g(b)s(egin)g(with)g(a)h(Con)m +(trol)g(Sequence)630 3652 y(Indicator)f(\(CSI\),)f(usually)h(ESC-[.)59 +b(If)36 b(this)g(sequence)h(is)g(b)s(ound)d(to)k Fn("\\)p +Fo(e[)p Fn(")p Fo(,)g(k)m(eys)f(pro-)630 3762 y(ducing)29 +b(suc)m(h)g(sequences)g(will)h(ha)m(v)m(e)h(no)e(e\013ect)i(unless)d +(explicitly)j(b)s(ound)d(to)i(a)f(Readline)630 3871 y(command,)j +(instead)g(of)g(inserting)g(stra)m(y)h(c)m(haracters)g(in)m(to)g(the)f +(editing)h(bu\013er.)44 b(This)31 b(is)630 3981 y(un)m(b)s(ound)d(b)m +(y)i(default,)h(but)f(usually)g(b)s(ound)e(to)j(ESC-[.)150 +4167 y Fn(insert-comment)26 b(\(M-#\))630 4277 y Fo(Without)36 +b(a)g(n)m(umeric)g(argumen)m(t,)h(the)f(v)-5 b(alue)36 +b(of)g(the)g Fn(comment-begin)c Fo(v)-5 b(ariable)36 +b(is)g(in-)630 4387 y(serted)c(at)g(the)g(b)s(eginning)f(of)h(the)f +(curren)m(t)h(line.)45 b(If)31 b(a)h(n)m(umeric)f(argumen)m(t)h(is)g +(supplied,)630 4496 y(this)k(command)h(acts)g(as)g(a)g(toggle:)55 +b(if)37 b(the)f(c)m(haracters)i(at)g(the)e(b)s(eginning)g(of)h(the)g +(line)630 4606 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5 +b(alue)31 b(of)f Fn(comment-begin)p Fo(,)e(the)i(v)-5 +b(alue)31 b(is)g(inserted,)g(otherwise)g(the)630 4715 +y(c)m(haracters)42 b(in)d Fn(comment-begin)e Fo(are)j(deleted)h(from)f +(the)g(b)s(eginning)g(of)g(the)g(line.)71 b(In)630 4825 +y(either)31 b(case,)h(the)e(line)h(is)f(accepted)i(as)f(if)f(a)h +(newline)f(had)g(b)s(een)f(t)m(yp)s(ed.)150 5011 y Fn(dump-functions)d +(\(\))630 5121 y Fo(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g +(their)g(k)m(ey)h(bindings)e(to)j(the)e(Readline)h(output)f(stream.)630 +5230 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g(supplied,)f(the)h +(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m(y)g(that)630 +5340 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fe(inputrc)k +Fo(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k +(default.)p eop end +%%Page: 25 28 +TeXDict begin 25 27 bop 150 -116 a Fo(Chapter)30 b(1:)41 +b(Command)29 b(Line)i(Editing)2107 b(25)150 299 y Fn(dump-variables)26 +b(\(\))630 408 y Fo(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5 +b(ariables)22 b(and)f(their)g(v)-5 b(alues)22 b(to)g(the)f(Readline)h +(output)f(stream.)630 518 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g +(supplied,)f(the)h(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m +(y)g(that)630 628 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h +Fe(inputrc)k Fo(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c +(b)m(y)k(default.)150 787 y Fn(dump-macros)c(\(\))630 +897 y Fo(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences)f +(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)g(they)630 +1006 y(output.)53 b(If)35 b(a)g(n)m(umeric)f(argumen)m(t)i(is)e +(supplied,)h(the)g(output)g(is)f(formatted)i(in)e(suc)m(h)h(a)630 +1116 y(w)m(a)m(y)c(that)g(it)f(can)g(b)s(e)g(made)g(part)f(of)i(an)e +Fe(inputrc)35 b Fo(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound) +d(b)m(y)630 1225 y(default.)150 1385 y Fn(emacs-editing-mode)e(\(C-e\)) +630 1494 y Fo(When)30 b(in)g Fn(vi)g Fo(command)g(mo)s(de,)g(this)h +(causes)f(a)h(switc)m(h)g(to)g Fn(emacs)e Fo(editing)i(mo)s(de.)150 +1654 y Fn(vi-editing-mode)26 b(\(M-C-j\))630 1763 y Fo(When)k(in)g +Fn(emacs)f Fo(editing)i(mo)s(de,)f(this)h(causes)f(a)h(switc)m(h)g(to)g +Fn(vi)f Fo(editing)h(mo)s(de.)150 2004 y Fm(1.5)68 b(Readline)47 +b(vi)e(Mo)t(de)150 2164 y Fo(While)32 b(the)g(Readline)g(library)f(do)s +(es)g(not)h(ha)m(v)m(e)h(a)f(full)f(set)h(of)g Fn(vi)f +Fo(editing)h(functions,)f(it)h(do)s(es)g(con)m(tain)150 +2273 y(enough)i(to)h(allo)m(w)g(simple)f(editing)h(of)f(the)g(line.)52 +b(The)34 b(Readline)g Fn(vi)g Fo(mo)s(de)f(b)s(eha)m(v)m(es)i(as)f(sp)s +(eci\014ed)f(in)150 2383 y(the)e Fh(posix)e Fo(standard.)275 +2517 y(In)f(order)g(to)i(switc)m(h)g(in)m(teractiv)m(ely)i(b)s(et)m(w)m +(een)d Fn(emacs)f Fo(and)g Fn(vi)h Fo(editing)g(mo)s(des,)g(use)g(the)g +(command)150 2627 y Fg(M-C-j)36 b Fo(\(b)s(ound)h(to)h +(emacs-editing-mo)s(de)i(when)d(in)g Fn(vi)h Fo(mo)s(de)f(and)g(to)i +(vi-editing-mo)s(de)g(in)e Fn(emacs)150 2736 y Fo(mo)s(de\).)k(The)30 +b(Readline)h(default)f(is)g Fn(emacs)f Fo(mo)s(de.)275 +2871 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f(in)g Fn(vi)f +Fo(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g(`insertion')g(mo)s +(de,)g(as)h(if)f(y)m(ou)150 2980 y(had)f(t)m(yp)s(ed)g(an)g(`)p +Fn(i)p Fo('.)41 b(Pressing)29 b Fn(ESC)f Fo(switc)m(hes)i(y)m(ou)g(in)m +(to)h(`command')e(mo)s(de,)h(where)e(y)m(ou)i(can)g(edit)g(the)150 +3090 y(text)35 b(of)f(the)g(line)g(with)f(the)h(standard)f +Fn(vi)g Fo(mo)m(v)m(emen)m(t)j(k)m(eys,)g(mo)m(v)m(e)f(to)f(previous)g +(history)f(lines)h(with)150 3200 y(`)p Fn(k)p Fo(')d(and)e(subsequen)m +(t)h(lines)h(with)f(`)p Fn(j)p Fo(',)g(and)g(so)h(forth.)p +eop end +%%Page: 26 29 +TeXDict begin 26 28 bop 3659 -116 a Fo(26)150 299 y Fk(App)t(endix)52 +b(A)81 b(GNU)54 b(F)-13 b(ree)53 b(Do)t(cumen)l(tation)e(License)1359 +502 y Fo(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390 +635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fl(\015)e +Fo(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31 +b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745 +y Fn(http://fsf.org/)390 964 y Fo(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f +(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390 +1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f +(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330 +1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g +(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330 +1450 y(useful)29 b(do)s(cumen)m(t)h Fe(free)36 b Fo(in)29 +b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j +(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f +(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i +(either)f(commercially)h(or)e(non-)330 1669 y(commercially)-8 +b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f +(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 1778 +y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g +(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330 +1888 y(made)30 b(b)m(y)h(others.)330 2021 y(This)22 b(License)i(is)f(a) +h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5 +b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330 +2131 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g +(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330 +2240 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed) +e(for)g(free)h(soft)m(w)m(are.)330 2373 y(W)-8 b(e)31 +b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h +(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330 +2483 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:) +65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330 +2592 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w) +m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g +(to)330 2702 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g +(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5 +b(ject)30 b(matter)i(or)330 2812 y(whether)f(it)h(is)f(published)f(as)i +(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h +(License)g(principally)f(for)330 2921 y(w)m(orks)f(whose)h(purp)s(ose)d +(is)j(instruction)f(or)g(reference.)199 3054 y(1.)61 +b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3187 y(This)39 +b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i +(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3297 +y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying) +h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330 +3407 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f +(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d +(in)330 3516 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j +(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330 +3626 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h +(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g +(a)h(licensee,)i(and)330 3735 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40 +b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8 +b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330 +3845 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop) +m(yrigh)m(t)j(la)m(w.)330 3978 y(A)i(\\Mo)s(di\014ed)f(V)-8 +b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f +(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4088 y(a)k(p)s(ortion)f +(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s +(di\014cations)f(and/or)h(translated)g(in)m(to)330 4197 +y(another)31 b(language.)330 4330 y(A)26 b(\\Secondary)g(Section")h(is) +f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f +(the)g(Do)s(cumen)m(t)330 4440 y(that)c(deals)g(exclusiv)m(ely)h(with)e +(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f +(Do)s(cumen)m(t)330 4549 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m +(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con) +m(tains)h(nothing)f(that)330 4659 y(could)j(fall)h(directly)g(within)f +(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42 +b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330 +4769 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section) +h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40 +b(The)330 4878 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e +(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27 +b(or)g(with)g(related)330 4988 y(matters,)38 b(or)d(of)h(legal,)i +(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s +(osition)f(regarding)330 5097 y(them.)330 5230 y(The)25 +b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g +(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330 +5340 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27 +b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s +(cumen)m(t)g(is)g(released)p eop end +%%Page: 27 30 +TeXDict begin 27 29 bop 150 -116 a Fo(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(27)330 299 y(under)26 b(this)i(License.)40 b(If)27 +b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h +(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 408 +y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5 +b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero) +e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25 +b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v) +-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330 +669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short) +g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8 +b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er) +j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f +(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40 +b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26 +b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m +(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m +(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g +(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8 +b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s +(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g +(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s +(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors) +f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g +(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g +(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587 +y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g +(formatters)f(or)g(for)g(automatic)i(translation)f(to)330 +1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input) +g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g +(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g +(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f +(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g +(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8 +b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35 +b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g +(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g +(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i +(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T) +-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fh(asci)r(i)g +Fo(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j +(LaT)1759 2414 y(E)1810 2395 y(X)e(input)f(format,)j +Fc(SGML)f Fo(or)f Fc(XML)g Fo(using)g(a)g(publicly)330 +2504 y(a)m(v)-5 b(ailable)42 b Fc(DTD)p Fo(,)h(and)c +(standard-conforming)g(simple)h Fc(HTML)p Fo(,)i(P)m(ostScript)e(or)f +Fc(PDF)h Fo(designed)330 2614 y(for)e(h)m(uman)f(mo)s(di\014cation.)65 +b(Examples)38 b(of)h(transparen)m(t)f(image)h(formats)g(include)f +Fc(PNG)p Fo(,)i Fc(X)n(CF)330 2724 y Fo(and)e Fc(JPG)p +Fo(.)64 b(Opaque)38 b(formats)h(include)f(proprietary)h(formats)f(that) +h(can)g(b)s(e)f(read)h(and)f(edited)330 2833 y(only)54 +b(b)m(y)f(proprietary)h(w)m(ord)f(pro)s(cessors,)59 b +Fc(SGML)54 b Fo(or)f Fc(XML)h Fo(for)g(whic)m(h)f(the)h +Fc(DTD)g Fo(and/or)330 2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g +(generally)i(a)m(v)-5 b(ailable,)71 b(and)60 b(the)h(mac)m +(hine-generated)j Fc(HTML)p Fo(,)330 3052 y(P)m(ostScript)31 +b(or)f Fc(PDF)h Fo(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s +(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330 +3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m(ted)f(b) +s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f(follo)m +(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8 +b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f +(in)h(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28 +b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e +(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330 +3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s +(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330 +3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330 +3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit) +m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330 +3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g +(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h +(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m +(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f +(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40 +b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f +(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m +(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f +(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491 +y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s +(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330 +4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g +(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W) +-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m +(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f +(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36 +b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m +(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f +(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g +(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39 +b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330 +5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199 +5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end +%%Page: 28 31 +TeXDict begin 28 30 bop 150 -116 a Fo(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(28)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h +(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h +(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 +b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j +(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e +(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e +(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h +(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f +(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 +737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h +(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330 +847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28 +b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d +(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f +(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g +(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200 +y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g +(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g +(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443 +y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25 +b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g +(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330 +1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f +(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330 +1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i +(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36 +b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m +(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41 +b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44 +b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330 +2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m) +m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f +(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34 +b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i +(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e +(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g +(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330 +2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v) +m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the) +330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d +(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330 +2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e +(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g +(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f +(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the) +g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330 +2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051 +y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f +(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330 +3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g +(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque) +330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h +(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d +(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e +(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m +(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8 +b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g +(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h +(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e +(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g +(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38 +b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330 +3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s +(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h +(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i +(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h +(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330 +4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g +(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330 +4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s +(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m +(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g +(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8 +b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a) +h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under) +e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v) +m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f +(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29 +b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30 +b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f +(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h +(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s +(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30 +b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s +(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33 +b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e +(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510 +5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m +(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8 +b(,)p eop end +%%Page: 29 32 +TeXDict begin 29 31 bop 150 -116 a Fo(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(29)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g +(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same) +h(title)h(as)510 408 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original) +i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 +545 y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h +(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c +(for)510 655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g +(Mo)s(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h +(\014v)m(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s +(cumen)m(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g +(few)m(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g +(y)m(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60 +b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g +(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32 +b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31 +b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.) +363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i +(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g +(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641 +y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g +(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510 +1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8 +b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g +(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353 +1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f +(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e +(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f +(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244 +y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.) +392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g +(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g +(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d +(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8 +b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45 +b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e +(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f +(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s +(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i +(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8 +b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m +(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s +(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m +(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30 +b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net) +m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m +(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45 +b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395 +y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net) +m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h +(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e +(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher) +d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s +(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m +(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k +(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d +(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone) +h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m +(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368 +4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5 +b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f +(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58 +b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5 +b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510 +4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33 +b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42 +b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510 +4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357 +4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f +(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g +(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31 +b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8 +b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g +(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f +(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g +(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h +(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h +(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5 +b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p +eop end +%%Page: 30 33 +TeXDict begin 30 32 bop 150 -116 a Fo(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(30)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 +b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8 +b(ersion's)36 b(license)g(notice.)57 b(These)330 408 +y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g +(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section) +i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g +(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s +(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30 +b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770 +y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro) +m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330 +880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8 +b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m +(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8 +b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e +(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i +(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s +(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f +(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m +(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351 +y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\)) +g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t) +g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g +(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m +(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m +(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g +(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the) +f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e +(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330 +1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s +(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s +(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g +(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g +(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61 +b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m +(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h +(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g +(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f +(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655 +y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5 +b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s +(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g +(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined) +g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32 +b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8 +b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m +(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,) +i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5 +b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h +(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m +(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g +(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f +(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f +(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g +(the)g(original)h(author)f(or)330 3455 y(publisher)23 +b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m +(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330 +3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5 +b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h +(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m +(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g +(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330 +3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h +(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330 +4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31 +b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47 +b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m +(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28 +b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f +(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g +(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k +(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f +(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single) +g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48 +b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38 +b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g +(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330 +4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32 +b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h +(collection,)i(and)d(distribute)g(it)h(individu-)330 +5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g +(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330 +5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g +(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330 +5340 y(that)d(do)s(cumen)m(t.)p eop end +%%Page: 31 34 +TeXDict begin 31 33 bop 150 -116 a Fo(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(31)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h +(W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f +(its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep) +s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h +(on)f(a)g(v)m(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g +(is)h(called)330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i +(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g +(the)330 770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e +(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39 +b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g +(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g +(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h +(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h +(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8 +b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f +(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241 +y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f +(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m +(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m +(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h +(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5 +b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f +(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330 +1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f +(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61 +b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a) +i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e +(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h +(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5 +b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f +(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i +(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24 +b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25 +b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330 +2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44 +b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f +(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the) +h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42 +b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513 +y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g +(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330 +2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33 +b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f +(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f +(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m +(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28 +b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m +(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330 +3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m +(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330 +3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61 +b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8 +b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h +(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38 +b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g +(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330 +3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically) +i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330 +3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i +(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h +(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h +(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g +(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h +(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8 +b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34 +b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h +(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288 +y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d +(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h +(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h +(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g +(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m +(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f +(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330 +4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g +(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h +(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28 +b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h +(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38 +b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g +(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e) +330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g +(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f +(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f +(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end +%%Page: 32 35 +TeXDict begin 32 34 bop 150 -116 a Fo(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(32)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 +433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8 +b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g +(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34 +b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31 +b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330 +653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f +(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330 +762 y(See)c Fn(http://www.gnu.org/copy)o(left)o(/)p Fo(.)330 +897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g +(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29 +b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g +(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h +(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33 +b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i +(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330 +1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m +(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g +(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8 +b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s +(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445 +y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m +(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the) +h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46 +b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f +(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f +(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen) +m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m +(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g +(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330 +2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or) +e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330 +2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m +(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h +(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g +(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i +(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33 +b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s +(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330 +2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m +(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330 +2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m +(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330 +2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a) +g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330 +2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29 +b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions) +f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g +(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e +(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h +(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330 +3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h +(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330 +3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h +(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330 +3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f +(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts) +330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j +(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s +(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h +(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site) +g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g +(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is) +330 4005 y(eligible)h(for)e(relicensing.)p eop end +%%Page: 33 36 +TeXDict begin 33 35 bop 150 -116 a Fo(App)s(endix)29 +b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603 +b(33)150 299 y Fm(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f +(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Fo(T)-8 b(o)35 +b(use)f(this)h(License)g(in)f(a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e) +i(written,)g(include)f(a)f(cop)m(y)i(of)f(the)f(License)h(in)g(the)150 +568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh) +m(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468 +680 y Fb(Copyright)42 b(\(C\))79 b Fa(year)g(your)40 +b(name)p Fb(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h +(distribute)g(and/or)g(modify)f(this)g(document)468 854 +y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i +(License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h +(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468 +1029 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g +(and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f +(license)i(is)f(included)h(in)f(the)g(section)g(entitled)h(``GNU)468 +1203 y(Free)g(Documentation)h(License''.)275 1337 y Fo(If)d(y)m(ou)h +(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8 +b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k +(T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6 +b(.)22 b(.)g(.)12 b(T)-8 b(exts.")41 b(line)31 b(with)f(this:)547 +1559 y Fb(with)40 b(the)g(Invariant)h(Sections)g(being)g +Fa(list)f(their)g(titles)p Fb(,)h(with)547 1646 y(the)f(Front-Cover)i +(Texts)e(being)g Fa(list)p Fb(,)h(and)f(with)g(the)g(Back-Cover)h +(Texts)547 1733 y(being)f Fa(list)p Fb(.)275 1868 y Fo(If)34 +b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f +(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g +(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g +(alternativ)m(es)i(to)e(suit)f(the)h(situation.)275 2112 +y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g +(examples)g(of)f(program)f(co)s(de,)j(w)m(e)e(recommend)g(releasing)150 +2222 y(these)44 b(examples)f(in)g(parallel)h(under)e(y)m(our)h(c)m +(hoice)i(of)e(free)g(soft)m(w)m(are)h(license,)k(suc)m(h)43 +b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s +(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p +eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/doc/rluserman.texi b/doc/rluserman.texi new file mode 100644 index 0000000..ae9ec6e --- /dev/null +++ b/doc/rluserman.texi @@ -0,0 +1,70 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header (This is for running Texinfo on a region.) +@setfilename rluserman.info +@settitle GNU Readline Library +@include version.texi + +@comment %**end of header (This is for running Texinfo on a region.) + +@copying +This manual describes the end user interface of the GNU Readline Library +(version @value{VERSION}, @value{UPDATED}), a library which aids in the +consistency of user interface across discrete programs which provide +a command line interface. + +Copyright @copyright{} 1988--2022 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled +``GNU Free Documentation License''. + +@end quotation +@end copying + +@dircategory Libraries +@direntry +* RLuserman: (rluserman). The GNU readline library User's Manual. +@end direntry + +@titlepage +@title GNU Readline Library User Interface +@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}. +@subtitle @value{UPDATED-MONTH} +@author Chet Ramey, Case Western Reserve University +@author Brian Fox, Free Software Foundation + +@page +@vskip 0pt plus 1filll +@insertcopying + +@end titlepage + +@contents + +@ifnottex +@node Top +@top GNU Readline Library + +This document describes the end user interface of the GNU Readline Library, +a utility which aids in the consistency of user interface across discrete +programs which provide a command line interface. +The Readline home page is @url{http://www.gnu.org/software/readline/}. + +@menu +* Command Line Editing:: GNU Readline User's Manual. +* GNU Free Documentation License:: License for copying this manual. +@end menu +@end ifnottex + +@include rluser.texi + +@node GNU Free Documentation License +@appendix GNU Free Documentation License + +@include fdl.texi + +@bye diff --git a/doc/texi2dvi b/doc/texi2dvi new file mode 100644 index 0000000..17f4355 --- /dev/null +++ b/doc/texi2dvi @@ -0,0 +1,1996 @@ +#! /bin/sh +# texi2dvi --- produce DVI (or PDF) files from Texinfo (or (La)TeX) sources. +# +# Copyright 1992-2019 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 3 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, see . +# +# Originally written by Noah Friedman. +# +# 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. + +test -f /bin/ksh && test -z "$RUNNING_KSH" \ + && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \ + && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; } +unset RUNNING_KSH + +# No failure shall remain unpunished. +set -e + +# In case the default sed doesn't suffice. +: ${SED=sed} + +program=`echo $0 | $SED -e 's!.*/!!'` + +build_mode=${TEXI2DVI_BUILD_MODE:-local} +build_dir=${TEXI2DVI_BUILD_DIRECTORY:-.} + +orig_pwd=`pwd` + +# Initialize variables for option overriding and otherwise. +# Don't use `unset' since old bourne shells don't have this command. +# Instead, assign them an empty value. +action=compile +debug=false +escape="\\" +expand=false # true for expansion via makeinfo +includes= +line_error=true # pass --file-line-error to TeX +max_iters=7 # when to quit +oname= # --output +out_lang=dvi +quiet=false # let the tools' message be displayed +set_language= +src_specials= +shell_escape= +latex2html=hevea # or set to tex4ht +textra= # Extra TeX commands to insert in the input file. +txiprereq=19990129 # minimum texinfo.tex version with macro expansion +verb=false # true for verbose mode +translate_file= # name of charset translation file + +# We have to initialize IFS to space tab newline since we save and +# restore IFS and apparently POSIX allows stupid/broken behavior with +# empty-but-set IFS. +# http://lists.gnu.org/archive/html/automake-patches/2006-05/msg00008.html +# We need space, tab and newline, in precisely that order. And don't leave +# trailing blanks. +space=' ' +tab=' ' +newline=' +' +IFS="$space$tab$newline" + +: ${EGREP=egrep} + +# Systems which define $COMSPEC or $ComSpec use semicolons to separate +# directories in TEXINPUTS -- except for Cygwin and Msys, where COMSPEC +# might be inherited, but : is used. + +# In the case of Msys, uname returns a value derived from MSYSTEM, as +# MSYSTEM is user configurable, it is not so safe to use it to detect +# Msys. It is safer to use OSTYPE, this is why we set MSYSTEM to +# $OSTYPE before calling uname +if test -n "$COMSPEC$ComSpec" \ + && MSYSTEM=$OSTYPE uname | $EGREP -iv 'cygwin|msys' >/dev/null; then + path_sep=";" +else + path_sep=":" +fi + + +# Pacify verbose cds. +CDPATH=${ZSH_VERSION+.}$path_sep + + +# Now we define numerous functions, with no other executable code. +# The main program is at the end of the file. + + +# Standard help and version functions. +# +# usage - display usage and exit successfully. +usage () +{ + cat < +General help using GNU software: +EOF + exit 0 +} + + +# version - Display version info and exit successfully. +version () +{ + cat < +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +EOF + exit 0 +} + + +# Generic auxiliary functions. + +# Used to access files and directories after we have changed directory +# (for --tidy). +rel= + +# Change directory, updating some relative paths. +cd_dir () +{ + cd "$1" + + # Check if argument or input file is absolute, and if so, make all the path + # variables absolute. + use_absolute=false + case $1 in + [\\/]* | ?:[\\/]*) # absolute path + use_absolute=true ;; + esac + case $in_input in + [\\/]* | ?:[\\/]*) + use_absolute=true ;; + esac + + if $use_absolute ; then + for cdd_dir in work_build workdir t2ddir work_bak in_input in_dir; do + eval "$cdd_dir=\`absolute \$$cdd_dir\`" + done + return + fi + + # Replace each path component with ".." and add a single trailing slash. + rel=`echo "$1" | \$SED -e 's/[^/\\][^/\\]*/../g' -e 's/[/\\]*$/\//'` +} + +# cd_orig - Return to the original directory. +cd_orig () +{ + # In case $orig_pwd is on a different drive (for DOS). + cd / + + # Return to the original directory so that + # - the next file is processed in correct conditions + # - the temporary file can be removed + cd "$orig_pwd" || exit 1 + + rel= +} + + +# func_dirname FILE - Return the directory part of FILE. +func_dirname () +{ + dirname "$1" 2>/dev/null \ + || { echo "$1" | $SED 's!/[^/]*$!!;s!^$!.!'; } +} + + +# noext FILE - Return FILE with one extension removed: +# foo.bar.baz -> foo.bar +noext () +{ + echo "$1" | $SED -e 's/\.[^/.][^/.]*$//' +} + + +# absolute NAME - Return an absolute path to NAME. +absolute () +{ + case $1 in + [\\/]* | ?:[\\/]*) + # Absolute paths don't need to be expanded. + echo "$1" + ;; + *) absolute_slashes=`echo "$1" | $SED -n 's,.*[^/]\(/*\)$,\1,p'` + absolute_rel=$orig_pwd/`func_dirname "$1"` + if test -d "$absolute_rel"; then + (cd "$absolute_rel" 2>/dev/null \ + && absolute_name=`pwd`/`basename "$1"`"$absolute_slashes" + echo "$absolute_name") + else + error 1 "not a directory: $absolute_rel" + fi + ;; + esac +} + + +# ensure_dir DIR1 DIR2... - Make sure given directories exist. +ensure_dir () +{ + for dir + do + # Beware that in parallel builds we may have several concurrent + # attempts to create the directory. So fail only if "mkdir" + # failed *and* the directory still does not exist. + test -d "$dir" \ + || mkdir "$dir" \ + || test -d "$dir" \ + || error 1 "cannot create directory: $dir" + done +} + + +# error EXIT_STATUS LINE1 LINE2... - Report an error and exit with +# failure if EXIT_STATUS is non-null. +error () +{ + error_status="$1" + shift + report "$@" + if test "$error_status" != 0; then + exit $error_status + fi +} + + +# findprog PROG - Return true if PROG is somewhere in PATH, else false. +findprog () +{ + saveIFS="$IFS" + IFS=$path_sep # break path components at the path separator + for dir in $PATH; do + IFS=$saveIFS + # The basic test for an executable is `test -f $f && test -x $f'. + # (`test -x' is not enough, because it can also be true for directories.) + # We have to try this both for $1 and $1.exe. + # + # Note: On Cygwin and DJGPP, `test -x' also looks for .exe. On Cygwin, + # also `test -f' has this enhancement, but not on DJGPP. (Both are + # design decisions, so there is little chance to make them consistent.) + # Thusly, it seems to be difficult to make use of these enhancements. + # + if { test -f "$dir/$1" && test -x "$dir/$1"; } \ + || { test -f "$dir/$1.exe" && test -x "$dir/$1.exe"; }; then + return 0 + fi + done + return 1 +} + +# report LINE1 LINE2... - Echo each argument to stderr. +report () +{ + for i in "$@" + do + echo >&2 "$0: $i" + done +} + + +# run COMMAND-LINE - Run COMMAND-LINE verbosely, catching errors as failures. +run () +{ + verbose "Running $@" + "$@" 2>&5 1>&2 \ + || error 1 "$1 failed" +} + + +# verbose WORD1 WORD2... - Echo concatenated WORDs to stderr, if $verb. +verbose () +{ + if $verb; then + echo >&2 "$0: $@" + fi +} + + +# Handling lists. +# +# list_append LIST-NAME ELEM - Append ELEM to (the contents of) LIST-NAME. +list_append () +{ + list_name="$1" + shift + eval set X \$$list_name "$@" + shift + eval $list_name=\""$@"\" +} + + +# list_concat_dirs LIST-NAME DIR-LIST - Append to LIST-NAME all the +# components (including empty ones) from the $path_sep-separated list +# DIR-LIST. Make the paths absolute. +list_concat_dirs () +{ + lcd_list="$1" + # Empty path components are meaningful to tex. We rewrite them as + # `EMPTY' so they don't get lost when we split on $path_sep. + # Hopefully no one will have an actual directory named EMPTY. + lcd_replace_EMPTY="-e 's/^$path_sep/EMPTY$path_sep/g' \ + -e 's/$path_sep\$/${path_sep}EMPTY/g' \ + -e 's/$path_sep$path_sep/${path_sep}EMPTY${path_sep}/g'" + save_IFS=$IFS + IFS=$path_sep + set x `echo "$2" | eval $SED $lcd_replace_EMPTY`; shift + IFS=$save_IFS + for lcd_dir + do + case $lcd_dir in + EMPTY) + list_append $lcd_list "" + ;; + *) + if test -d $lcd_dir; then + dir=`absolute "$lcd_dir"` + list_append $lcd_list "$lcd_dir" + fi + ;; + esac + done +} + + +# list_prefix LIST-NAME SEP -> STRING - Return string with each element +# of LIST-NAME preceded by SEP. +list_prefix () +{ + lp_separator="$2" + eval set X \$$1 + shift + lp_result='' + for i + do + lp_result="$lp_result \"$lp_separator\" \"$i\"" + done + echo "$lp_result" +} + +# list_infix LIST-NAME SEP -> STRING - Same as list_prefix, but a separator. +list_infix () +{ + eval set X \$$1 + shift + save_IFS="$IFS" + IFS=$path_sep + echo "$*" + IFS=$save_IFS +} + +# list_dir_to_abs LIST-NAME - Convert list to using only absolute dir names. +# Currently unused, but should replace absolute_filenames some day. +list_dir_to_abs () +{ + ldta_list="$1" + eval set X \$$ldta_list + shift + ldta_result='' + for dir + do + dir=`absolute "$dir"` + test -d "$dir" || continue + ldta_result="$ldata_result \"$dir\"" + done + set X $ldta_result; shift + eval $ldta_list=\"$@\" +} + + +# Language auxiliary functions. +# +# out_lang_set LANG - set $out_lang to LANG (dvi, pdf, etc.), or error. +out_lang_set () +{ + case $1 in + dvi|dvipdf|html|info|pdf|ps|text) out_lang=$1;; + *) error 1 "invalid output format: $1";; + esac +} + +# out_lang_tex - Return the tex output language (DVI or PDF) for $out_lang. +out_lang_tex () +{ + case $out_lang in + dvi | ps | dvipdf ) echo dvi;; + pdf ) echo $out_lang;; + html | info | text ) echo $out_lang;; + *) error 1 "invalid out_lang: $1";; + esac +} + +# out_lang_ext - Return the extension for $out_lang (pdf, dvi, etc.). +out_lang_ext () +{ + case $out_lang in + dvipdf ) echo pdf;; + dvi | html | info | pdf | ps | text ) echo $out_lang;; + *) error 1 "invalid out_lang: $1";; + esac +} + + +# TeX file auxiliary functions. +# +# absolute_filenames TEX-PATH -> TEX-PATH - Convert relative paths to +# absolute, so we can run in another directory (e.g., in tidy build +# mode, or during the macro-support detection). +absolute_filenames () +{ + # Empty path components are meaningful to tex. We rewrite them as + # `EMPTY' so they don't get lost when we split on $path_sep. + # Hopefully no one will have an actual directory named EMPTY. + af_replace_empty="-e 's/^$path_sep/EMPTY$path_sep/g' \ + -e 's/$path_sep\$/${path_sep}EMPTY/g' \ + -e 's/$path_sep$path_sep/${path_sep}EMPTY${path_sep}/g'" + af_result=`echo "$1" | eval $SED $af_replace_empty` + save_IFS=$IFS + IFS=$path_sep + set x $af_result; shift + af_result= + af_path_sep= + for dir + do + case $dir in + EMPTY) + af_result=$af_result$af_path_sep + ;; + *) + if test -d "$dir"; then + af_result=$af_result$af_path_sep`absolute "$dir"` + else + # Even if $dir is not a directory, preserve it in the path. + # It might contain metacharacters that TeX will expand in + # turn, e.g., /some/path/{a,b,c}. This will not get the + # implicit absolutification of the path, but we can't help that. + af_result=$af_result$af_path_sep$dir + fi + ;; + esac + af_path_sep=$path_sep + done + echo "$af_result" +} + + +# output_base_name FILE - Return the name of FILE, possibly renamed to +# satisfy --output. FILE is local, i.e., without any directory part. +output_base_name () +{ + case $oname in + '') echo "$1";; + *) obn_out_noext=`noext "$oname"` + obn_file_ext=`echo "$1" | $SED 's/^.*\.//'` + echo "$obn_out_noext.$obn_file_ext" + ;; + esac +} + + +# destdir - Return the directory where the output is expected. +destdir () +{ + case $oname in + '') echo "$orig_pwd";; + *) dirname "$oname";; + esac +} + + +# move_to_dest FILE... - Move FILE(s) to the place where the user expects. +# Truly move it, that is, it must not remain in its build location +# unless that is also the output location. (Otherwise it might appear +# as an extra file in make distcheck.) +# +# FILE can be the principal output (in which case -o directly applies), +# or an auxiliary file with the same base name. +move_to_dest () +{ +# echo "move_to_dest $*, tidy=$tidy, oname=$oname" + + # If we built in place and have no output name, there is nothing to + # do, so just return. + case $tidy:$oname in + false:) return;; + esac + + for file + do + test -f "$file" \ + || error 1 "no such file or directory: $file" + case $tidy:$oname in + true:) mtd_destdir=$orig_pwd + mtd_destfile=$mtd_destdir/$file;; + true:*) mtd_destfile=`output_base_name "$file"` + mtd_destdir=`dirname "$mtd_destfile"`;; + false:*) mtd_destfile=$oname + mtd_destdir=`dirname "$mtd_destfile"`;; + esac + + # We want to compare the source location and the output location, + # and if they are different, do the move. But if they are the + # same, we must preserve the source. Since we can't assume + # stat(1) or test -ef is available, resort to comparing the + # directory names, canonicalized with pwd. We can't use cmp -s + # since the output file might not actually change from run to run; + # e.g., TeX DVI output is timestamped to only the nearest minute. + mtd_destdir=`cd "$mtd_destdir" && pwd` + mtd_destbase=`basename "$mtd_destfile"` + + mtd_sourcedir=`dirname "$file"` + mtd_sourcedir=`cd "$mtd_sourcedir" && pwd` + mtd_sourcebase=`basename "$file"` + + if test "$mtd_sourcedir/$mtd_sourcebase" != "$mtd_destdir/$mtd_destbase" + then + verbose "Moving $file to $mtd_destfile" + rm -f "$mtd_destfile" + mv "$file" "$mtd_destfile" + fi + done +} + + +# Managing xref files. +# +# aux_file_p FILE - Echo FILE if FILE is an aux file. +aux_file_p () +{ + test -f "$1" || return 0 + case $1 in + *.aux) echo "$1";; + *) return 0;; + esac +} + +# bibaux_file_p FILE - Echo FILE if FILE contains citation requests. +bibaux_file_p () +{ + test -s "$1" || return 0 + if (grep '^\\bibstyle[{]' "$1" \ + && grep '^\\bibdata[{]' "$1" \ + ## The following line is suspicious: fails when there + ## are citations in sub aux files. We need to be + ## smarter in this case. + ## && grep '^\\citation[{]' "$f" + ) >&6 2>&1; + then + echo "$1" + fi + return 0 +} + +# index_file_p FILE - Echo FILE if FILE is an index file. +index_file_p () +{ + test -f "$1" || return 0 + case $in_lang:$latex2html:`out_lang_tex`:`$SED '1q' "$1"` in + # When working with TeX4HT, *.idx are created by LaTeX. They must + # be processed to produce *.4ix, *.4dx files. The *.4dx file is + # passed to makeindex to produce the *.ind file. This sequence is + # handled by run_index, so we are only interested in the *.idx + # files, which have each "\indexentry" preceded by a + # "\beforeentry". + latex:tex4ht:html:"\\beforeentry {"*) echo $1;; + + # When index.sty is used, there is a space before the brace. + latex:*:*:"\\indexentry{"*|latex:*:*:"\\indexentry {"*) echo $1;; + + texinfo:*:*:"\\entry{"*) echo $1;; + texinfo:*:*:"@entry{"*) echo $1;; + # @entry is output from newer versions of texinfo.tex + esac + return 0 +} + +########### not used currently +# xref_file_p FILE - Return success if FILE is an xref file (indexes, +# tables and lists). +xref_file_p () +{ + test -f "$1" || return 1 + # If the file is not suitable to be an index or xref file, don't + # process it. It's suitable if the first character is a + # backslash or right quote or at, as long as the first line isn't + # \input texinfo. + case `$SED '1q' "$1"` in + "\\input texinfo"*) return 1;; + [\\''@]*) return 0;; + *) return 1;; + esac +} + + +# Used in generated_files_get +generated_files_get_from_log () +{ + if test -f "$1.log"; then + # Usually the output is like: \openout1 = `foobar.tex'. + # (including the final period) + # but luatex outputs: \openout1 = foobar.tex + # (no quotes, no period). + # So we have to make the punctuation optional. + grep '^\\openout[0-9]' "$1.log" \ + | $SED -e "s/\\\\openout[^=]*= *[\`']*//" \ + -e "s/'\.$//" + fi +} + +# Used in generated_files_get +generated_files_get_from_fls () +{ + if test -f "$1.fls"; then + grep '^OUTPUT ' "$1.fls" | cut -b 8- \ + | grep -v '\.dvi$' | grep -v '\.log$' | grep -v '\.pdf$' || true + fi +} + +# generated_files_get - Output the list of files generated by the TeX +# compilation. +generated_files_get () +{ + $generated_files_get_method "$in_noext" + if test $generated_files_get_method = generated_files_get_from_fls; then + if test -r "$in_noext.fl"; then + report 'WARNING!! The fl index may typeset as garbage!' # goes to stderr + report 'Try upgrading your version of texinfo.tex, or else try setting' + report 'the environment variable TEXI2DVI_USE_RECORDER to '\''no'\''.' +report 'Once you'\''ve done that, delete the file with an '\''fl'\'' extension.' + fi + fi +} + + +# xref_files_save - set xref_files_orig from xref_files_new, and save xref +# files in $work_bak. +xref_files_save () +{ + # Save copies of auxiliary files for later comparison. + xref_files_orig=$xref_files_new + if test -n "$xref_files_orig"; then + verbose "Backing up xref files: $xref_files_orig" + # The following line improves `cp $xref_files_orig "$work_bak"' + # by preserving the directory parts. Think of + # cp chap1/main.aux chap2/main.aux $work_bak. + # + # Users may have, e.g., --keep-old-files. Don't let this interfere. + # (Don't use unset for the sake of ancient shells.) + TAR_OPTIONS=; export TAR_OPTIONS + tar cf - $xref_files_orig | (cd "$rel$work_bak" && tar xf -) + fi + + # Remove auxiliary files in same directory as main input file. Otherwise, + # these will likely be read instead of those in the build dir. + if $tidy ; then + secondary_xref_files=`sorted_index_files` + for f in $xref_files_new $secondary_xref_files ; do + if test -f "$rel$in_dir/$f" ; then + remove $rel$in_dir/$f + fi + done + fi +} + + +# xref_files_changed - Return success if the xref files have changed +# since the previous run. +xref_files_changed () +{ + # LaTeX (and the package changebar) report in the LOG file if it + # should be rerun. This is needed for files included from + # subdirs, since texi2dvi does not try to compare xref files in + # subdirs. Performing xref files test is still good since LaTeX + # does not report changes in xref files. + if grep "Rerun to get" "$in_noext.log" >&6 2>&1; then + return 0 + fi + # Similarly, check for biblatex report of whether rerunning is needed. + if grep "biblatex.*(re)run" "$in_noext.log" >&6 2>&1; then + return 0 + fi + + # If old and new lists don't have the same file list, + # then something has definitely changed. + xref_files_new=`generated_files_get` + verbose "Original xref files = $xref_files_orig" + verbose "New xref files = $xref_files_new" + if test "x$xref_files_orig" != "x$xref_files_new"; then + return 0 + fi + + # Compare each file until we find a difference. + for this_file in $xref_files_new; do + verbose "Comparing xref file `echo $this_file | $SED 's|\./||g'` ..." + # cmp -s returns nonzero exit status if files differ. + if cmp -s "$this_file" "$rel$work_bak/$this_file"; then :; else + verbose "xref file `echo $this_file | $SED 's|\./||g'` differed ..." + if $debug; then + diff -u "$rel$work_bak/$this_file" "$this_file" + fi + return 0 + fi + done + + secondary_xref_files=`sorted_index_files` + verbose "Secondary xref files = $secondary_xref_files" + for this_file in $secondary_xref_files; do + if test -f $this_file; then :; else + verbose "$this_file missing ..." + return 0 + fi + done + + # No change. + return 1 +} + +# Running the TeX suite. +# +# Set tex_cmd variable, for running TeX. +make_tex_cmd () +{ + case $in_lang:$latex2html:`out_lang_tex` in + latex:*:dvi|latex:tex4ht:html) + tex=${LATEX:-latex};; + latex:*:pdf) + tex=${PDFLATEX:-pdflatex};; + texinfo:*:dvi) + # MetaPost also uses the TEX environment variable. If the user + # has set TEX=latex for that reason, don't bomb out. + case $TEX in + *latex) tex=tex;; # don't bother trying to find etex + *) tex=$TEX + esac;; + texinfo:*:pdf) tex=$PDFTEX;; + *) error 1 "$out_lang not supported for $in_lang";; + esac + + # Beware of aux files in subdirectories that require the + # subdirectory to exist. + case $in_lang:$tidy in + latex:true) + $SED -n 's|^[ ]*\\include{\(.*\)/.*}.*|\1|p' "$in_input" | + sort -u | + while read d + do + ensure_dir "$work_build/$d" + done + ;; + esac + + # Note that this will be used via an eval: quote properly. + tex_cmd="$tex" + + # If possible, make TeX report error locations in GNU format. + if $line_error; then + if test "${tex_help:+set}" != set; then + # Go to a temporary directory to try --help, since old versions that + # don't accept --help will generate a texput.log. + tex_help_dir=$t2ddir/tex_help + ensure_dir "$tex_help_dir" + tex_help=`cd "$tex_help_dir" >&6 && $tex --help &1 || true` + fi + # The mk program and perhaps others want to parse TeX's + # original error messages. + case $tex_help in + *file-line-error*) tex_cmd="$tex_cmd --file-line-error";; + esac + fi + + # Tell TeX about -recorder option, if specified + # recorder_option_maybe is in { " -recorder", "" } + tex_cmd="$tex_cmd$recorder_option_maybe" + + + # Tell TeX about TCX file, if specified. + test -n "$translate_file" \ + && tex_cmd="$tex_cmd --translate-file=$translate_file" + + # Tell TeX to make source specials (for backtracking from output to + # source, given a sufficiently smart editor), if specified. + test -n "$src_specials" && tex_cmd="$tex_cmd $src_specials" + + # Tell TeX to allow running external executables + test -n "$shell_escape" && tex_cmd="$tex_cmd $shell_escape" + + # Run without interaction. + # \batchmode does not show terminal output at all, so we don't + # want that. And even in batch mode, TeX insists on having input + # from the user. Close its stdin to make it impossible. + tex_cmd="$tex_cmd , \ and any whitespace characters are not supported + # filenames. + in_input_funnies=`echo "$in_input" \ + | $SED -e 's![^}#$%&^_{~]!!g' -e 's!\(.\)!\1\'' +!g' | uniq` + + if test -n "$in_input_funnies" ; then + # Make > an end group character, as it's unlikely to appear in + # a filename. + tex_cmd="$tex_cmd '${escape}bgroup${escape}catcode62=2${escape}relax'" + + # If the filename has funny characters, change the TeX category codes of + # some characters within a group, and use \expandafter to input the file + # outside of the group. + for w in $in_input_funnies ; do + tex_cmd="$tex_cmd '${escape}catcode\`${escape}$w=12${escape}relax'" + done + + # Set \toks0 to "\input FILENAME\relax" + tex_cmd="$tex_cmd '${escape}toks0${escape}bgroup${escape}input' '$rel$in_input' '${escape}relax>" + + # Expand \toks0 after the end of the group + tex_cmd="$tex_cmd${escape}expandafter${escape}egroup" + tex_cmd="$tex_cmd${escape}the${escape}toks0${escape}relax'" + else + # In the case of a simple filename, just pass the filename + # with no funny tricks. + tex_cmd="$tex_cmd '${escape}input' '$rel$in_input'" + fi + + verbose "$0: Running $tex_cmd ..." + if (eval "$tex_cmd" >&5); then + case $out_lang in + dvi | pdf ) move_to_dest "$in_noext.$out_lang";; + esac + else + tex_failed=true + fi +} + + +# run_bibtex - Run bibtex (or biber) on current file +# - if its input (AUX) exists, +# - or if some citations are missing (LOG contains `Citation'), +# - or if the LOG complains of a missing .bbl. +# +# Don't try to be too smart: +# 1. Running bibtex only if the bbl file exists and is older than +# the LaTeX file is wrong, since the document might include files +# that have changed. +# +# 2. Because there can be several AUX (if there are \include's), +# but a single LOG, looking for missing citations in LOG is +# easier, though we take the risk of matching false messages. +run_bibtex () +{ + case $in_lang in + latex) bibtex=${BIBTEX:-bibtex};; + texinfo) return;; + esac + + # "Citation undefined" is for LaTeX, "Undefined citation" for btxmac.tex. + # The no .aux && \bibdata test is also for btxmac, in case it was the + # first run of a bibtex-using document. Otherwise, it's possible that + # bibtex would never be run. + if test -r "$in_noext.aux" \ + && test -r "$in_noext.log" \ + && ( (grep 'Warning:.*Citation.*undefined' "$in_noext.log" \ + || grep '.*Undefined citation' "$in_noext.log" \ + || grep 'No file .*\.bbl\.' "$in_noext.log") \ + || (grep 'No \.aux file' "$in_noext.log" \ + && grep '^\\bibdata' "$in_noext.aux") ) \ + >&6 2>&1; \ + then + bibtex_aux=`filter_files bibaux_file_p` + for f in $bibtex_aux; do + run $bibtex "$f" + done + fi + + # biber(+biblatex) check. + if test -r "$in_noext.bcf" \ + && grep '' "$in_noext.bcf" >/dev/null; then + run ${BIBER:-biber} "$in_noext" + fi +} + + +# filter_file PREDICATE - Go through the list of files in xref_files_new +# and use PREDICATE on each one to optionally print it or print other files +# based on the filename. +filter_files () +{ + test -n "$xref_files_new" || return 0 + echo "$xref_files_new" | + # Filter existing files matching the criterion. + # + while read file; do + $1 "$file" + done | + sort | + # Some files are opened several times, e.g., listings.sty's *.vrb. + uniq +} + +# run_index - Run texindex (or makeindex or texindy) 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. +run_index () +{ + index_files=`filter_files index_file_p` + test -n "$index_files" \ + || return 0 + + : ${MAKEINDEX:=makeindex} + : ${TEXINDEX:=texindex} + : ${TEXINDY:=texindy} + + case $in_lang:$latex2html:`out_lang_tex` in + latex:tex4ht:html) + for index_file in $index_files + do + index_noext=`noext "$index_file"` + run tex \ + '\def\filename{{'"$index_noext"'}{idx}{4dx}{ind}} + \input idxmake.4ht' + run $MAKEINDEX -o $index_noext.ind $index_noext.4dx + done + ;; + + latex:*) + if $TEXINDY --version >&6 2>&1; then + run $TEXINDY $index_files + else + run $MAKEINDEX $index_files + fi + ;; + + texinfo:*) + run $TEXINDEX $index_files + ;; + esac +} + + +# run_tex4ht - Run the last two phases of TeX4HT: tex4ht extracts the +# HTML from the instrumented DVI file, and t4ht converts the figures and +# installs the files when given -d. +# +# Because knowing exactly which files are created is complex (in +# addition the names are not simple to compute), which makes it +# difficult to install the output files in a second step, we +# tell t4ht to install the output files. +run_tex4ht () +{ + case $in_lang:$latex2html:`out_lang_tex` in + latex:tex4ht:html) + : ${TEX4HT:=tex4ht} ${T4HT:=t4ht} + run "$TEX4HT" "-f/$in_noext" + # Do not remove the / after the destdir. + run "$T4HT" "-d`destdir`/" "-f/$in_noext" + ;; + esac +} + + +# run_thumbpdf - Run thumbpdf. +run_thumbpdf () +{ + if test `out_lang_tex` = pdf \ + && test -r "$in_noext.log" \ + && grep 'thumbpdf\.sty' "$in_noext.log" >&6 2>&1; \ + then + thumbpdf=${THUMBPDF_CMD:-thumbpdf} + thumbcmd="$thumbpdf $in_dir/$in_noext" + verbose "Running $thumbcmd ..." + if $thumbcmd >&5; then + run_tex + else + report "$thumbpdf exited with bad status." \ + "Ignoring its output." + fi + fi +} + + +# run_dvipdf FILE.dvi - Convert FILE.dvi to FILE.pdf. +run_dvipdf () +{ + # Find which dvi->pdf program is available. + if test -n "$DVIPDF"; then + dvipdf=$DVIPDF # user envvar, use it without checking + + elif test -z "$dvipdf"; then + for i in dvipdfmx dvipdfm dvipdf dvi2pdf dvitopdf; do + if findprog $i; then + dvipdf=$i + fi + done + fi + # These tools have varying interfaces, some 'input output', others + # 'input -o output'. They all seem to accept 'input' only, + # outputting using the expected file name. + run $dvipdf "$1" + if test ! -f `echo "$1" | $SED -e 's/\.dvi$/.pdf/'`; then + error 1 "cannot find output file" + fi +} + +# run_tex_suite - Run the TeX tools until a stable point is reached. +run_tex_suite () +{ + make_tex_cmd + + # Move to the working directory. + if $tidy; then + verbose "cd $work_build" + cd_dir "$work_build" || exit 1 + fi + + # Count the number of cycles. + suite_cycle=0 + + # Start by checking the log files for what files were created last + # time. This will mean that if they don't change, we finish in 1 cycle. + xref_files_new=`generated_files_get` + xref_files_save + + while :; do + # check for (probably) LaTeX loop (e.g. varioref) + if test $suite_cycle -eq "$max_iters"; then + error 0 "Maximum of $max_iters cycles exceeded" + break + fi + + # report progress + suite_cycle=`expr $suite_cycle + 1` + verbose "Cycle $suite_cycle for $command_line_filename" + + tex_failed=false + run_core_conversion + xref_files_changed || break + xref_files_save + + # We run bibtex first, because it's more likely for the indexes + # to change after bibtex is run than the reverse, though either + # would be rare. + run_bibtex + run_index + done + + if $tex_failed ; then + # TeX failed, and the xref files did not change. + error 1 "$tex exited with bad status, quitting." + fi + + # If we were using thumbpdf and producing PDF, then run thumbpdf + # and TeX one last time. + run_thumbpdf + + # If we are using tex4ht, call it. + run_tex4ht + + # Install the result if we didn't already (i.e., if the output is + # dvipdf or ps). + case $latex2html:$out_lang in + *:dvipdf) + run_dvipdf "$in_noext.`out_lang_tex`" + move_to_dest "$in_noext.`out_lang_ext`" + ;; + *:ps) + : ${DVIPS:=dvips} + run $DVIPS -o "$in_noext.`out_lang_ext`" "$in_noext.`out_lang_tex`" + move_to_dest "$in_noext.`out_lang_ext`" + ;; + esac + + cd_orig +} + + +# TeX processing auxiliary tools. +# +# run_makeinfo - Expand macro commands in the original source file using +# Makeinfo. Always use `end' footnote style, since the `separate' style +# generates different output (arguably this is a bug in -E). Discard +# main info output, the user asked to run TeX, not makeinfo. +run_makeinfo () +{ + test $in_lang = texinfo \ + || return 0 + + # Unless required by the user, makeinfo expansion is wanted only + # if texinfo.tex is too old. + if $expand; then + makeinfo=${MAKEINFO:-makeinfo} + else + # Check if texinfo.tex performs macro expansion by looking for + # its version. The version is a date of the form YEAR-MO-DA. + # We don't need to use [0-9] to match the digits since anyway + # the comparison with $txiprereq, a number, will fail with non-digits. + # Run in a temporary directory to avoid leaving files. + version_test_dir=$t2ddir/version_test + ensure_dir "$version_test_dir" + if ( + cd "$version_test_dir" + echo '\input texinfo.tex @bye' >txiversion.tex + # Be sure that if tex wants to fail, it is not interactive: + # close stdin. + $TEX txiversion.tex txiversion.out 2>txiversion.err + ); then :; else + report "texinfo.tex appears to be broken. +This may be due to the environment variable TEX set to something +other than (plain) tex, a corrupt texinfo.tex file, or +to tex itself simply not working." + cat "$version_test_dir/txiversion.out" + cat "$version_test_dir/txiversion.err" >&2 + error 1 "quitting." + fi + eval `$SED -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p' "$version_test_dir/txiversion.out"` + verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..." + if test "$txiprereq" -le "$txiversion" >&6 2>&1; then + makeinfo= + else + makeinfo=${MAKEINFO:-makeinfo} + fi + # If TeX is preloaded, offer the user this convenience: + if test "$txiformat" = Texinfo; then + escape=@ + fi + fi + + if test -n "$makeinfo"; then + # in_src: the file with macros expanded. + # Use the same basename to generate the same aux file names. + work_src=$workdir/src + ensure_dir "$work_src" + in_src=$work_src/$in_base + run_mi_includes=`list_prefix includes -I` + verbose "Macro-expanding $command_line_filename to $in_src ..." + # eval $makeinfo because it might be defined as something complex + # (running missing) and then we end up with things like '"-I"', + # and "-I" (including the quotes) is not an option name. This + # happens with gettext 0.14.5, at least. + $SED "$comment_iftex" "$command_line_filename" \ + | eval $makeinfo --footnote-style=end -I "$in_dir" $run_mi_includes \ + -o /dev/null --macro-expand=- \ + | $SED "$uncomment_iftex" >"$in_src" + # Continue only if everything succeeded. + if test $? -ne 0 \ + || test ! -r "$in_src"; then + verbose "Expansion failed, ignored..."; + else + in_input=$in_src + fi + fi +} + +# Unfortunately, makeinfo --iftex --no-ifinfo doesn't work well enough +# in versions before 5.0, as makeinfo can't parse the TeX commands +# inside @tex blocks, so work around with sed. +# +# This sed script preprocesses Texinfo sources in order to keep the +# iftex sections only. We want to remove non-TeX sections, and comment +# (with `@c _texi2dvi') TeX sections so that makeinfo does not try to +# parse them. Nevertheless, while commenting TeX sections, don't +# comment @macro/@end macro so that makeinfo does propagate them. +# Similarly, preserve the @top node to avoid makeinfo complaining about +# it being missed. Comment it out after preprocessing, so that it does +# not appear in the generated document. +# +# We assume that `@c _texi2dvi' or `@c (_texi2dvi)' starting a line is +# not present in the document. Additionally, conditionally defined +# macros inside the @top node may end up with the wrong value, although +# this is unlikely in practice. +# +comment_iftex=\ +'/^@tex/,/^@end tex/{ + s/^/@c _texi2dvi/ +} +/^@iftex/,/^@end iftex/{ + s/^/@c _texi2dvi/ + /^@c _texi2dvi@macro/,/^@c _texi2dvi@end macro/{ + s/^@c _texi2dvi// + } +} +/^@ifnottex/,/^@end ifnottex/{ + s/^/@c (_texi2dvi)/ + /^@c (_texi2dvi)@node Top/,/^@c (_texi2dvi)@end ifnottex/ { + /^@c (_texi2dvi)@end ifnottex/b + s/^@c (_texi2dvi)// + } +} +/^@ifinfo/,/^@end ifinfo/{ + /^@node/p + /^@menu/,/^@end menu/p + t + s/^/@c (_texi2dvi)/ +} +s/^@ifnotinfo/@c _texi2dvi@ifnotinfo/ +s/^@end ifnotinfo/@c _texi2dvi@end ifnotinfo/' + +# Uncomment @iftex blocks by removing any leading `@c texi2dvi' (repeated +# copies can sneak in via macro invocations). Likewise, comment out +# the @top node inside a @ifnottex block. +uncomment_iftex=\ +'s/^@c _texi2dvi\(@c _texi2dvi\)*// +/^@c (_texi2dvi)@ifnottex/,/^@c (_texi2dvi)@end ifnottex/{ + s/^/@c (_texi2dvi)/ +}' + + +# insert_commands - Insert $textra commands at the beginning of the file. +# Recommended to be used for @finalout, @smallbook, etc. +insert_commands () +{ + if test -n "$textra"; then + # _xtr. The file with the user's extra commands. + work_xtr=$workdir/xtr + in_xtr=$work_xtr/$in_base + ensure_dir "$work_xtr" + verbose "Inserting extra commands: $textra" + case $in_lang in + latex) textra_cmd=1i;; + texinfo) + textra_cmd='/^\\input texinfo/a' + # insert after @setfilename line if present + if head -n 10 $in_input | grep '^@setfilename' ; then + textra_cmd='/^@setfilename/a' + fi + ;; + *) error 1 "internal error, unknown language: $in_lang";; + esac + $SED "$textra_cmd\\ +$textra" "$in_input" >"$in_xtr" + in_input=$in_xtr + fi + + case $in_lang:$latex2html:`out_lang_tex` in + latex:tex4ht:html) + # _tex4ht. The file with the added \usepackage{tex4ht}. + work_tex4ht=$workdir/tex4ht + in_tex4ht=$work_tex4ht/$in_base + ensure_dir "$work_tex4ht" + verbose "Inserting \\usepackage{tex4ht}" + perl -pe 's<\\documentclass(?:\[.*\])?{.*}> + <$&\\usepackage[xhtml]{tex4ht}>' \ + "$in_input" >"$in_tex4ht" + in_input=$in_tex4ht + ;; + esac +} + + +# compute_language FILENAME - Return the short string for the language +# in which FILENAME is written: `texinfo' or `latex'. +compute_language () +{ + # If the user explicitly specified the language, use that. + # Otherwise, if the first line is \input texinfo, assume it's texinfo. + # Otherwise, guess from the file extension. + if test -n "$set_language"; then + echo $set_language + elif $SED 1q "$1" | grep 'input texinfo' >&6; then + echo texinfo + else + # Get the type of the file (latex or texinfo) from the given language + # we just guessed, or from the file extension if not set yet. + case $1 in + *.ltx | *.tex | *.drv | *.dtx) echo latex;; + *) echo texinfo;; + esac + fi +} + + +# run_hevea (MODE) - Convert to HTML/INFO/TEXT. +# +# Don't pass `-noiso' to hevea: it's useless in HTML since anyway the +# charset is set to latin1, and troublesome in other modes since +# accented characters loose their accents. +# +# Don't pass `-o DEST' to hevea because in that case it leaves all its +# auxiliary files there too... Too bad, because it means we will need +# to handle images some day. +run_hevea () +{ + run_hevea_name="${HEVEA:-hevea}" + run_hevea_cmd="$run_hevea_name" + + case $1 in + html) ;; + text|info) run_hevea_cmd="$run_hevea_cmd -$1";; + *) error 1 "run_hevea_cmd: invalid argument: $1";; + esac + + # Compiling to the tmp directory enables to preserve a previous + # successful compilation. + run_hevea_cmd="$run_hevea_cmd -fix -O -o '$out_base'" + run_hevea_cmd="$run_hevea_cmd `list_prefix includes -I` -I '$orig_pwd' " + run_hevea_cmd="$run_hevea_cmd '$rel$in_input'" + + if $debug; then + run_hevea_cmd="$run_hevea_cmd -v -v" + fi + + verbose "running $run_hevea_cmd" + if eval "$run_hevea_cmd" >&5; then + # hevea leaves trailing white spaces, this is annoying. + case $1 in text|info) + perl -pi -e 's/[ \t]+$//g' "$out_base"*;; + esac + case $1 in + html|text) move_to_dest "$out_base";; + info) # There can be foo.info-1, foo.info-2 etc. + move_to_dest "$out_base"*;; + esac + else + error 1 "$run_hevea_name exited with bad status, quitting." + fi +} + + +# run_core_conversion - Run TeX (or HeVeA). +run_core_conversion () +{ + case $in_lang:$latex2html:`out_lang_tex` in + *:dvi|*:pdf|latex:tex4ht:html) + run_tex;; + latex:*:html|latex:*:text|latex:*:info) + run_hevea $out_lang;; + *) + error 1 "invalid input/output combination: $in_lang/$out_lang";; + esac +} + + +# compile - Run the full compilation chain, from pre-processing to +# installation of the output at its expected location. +compile () +{ + # Set include path for tools: + # . Include current directory in case there are files there already, so + # we don't have more TeX runs than necessary. orig_pwd is used in case + # we are in clean build mode, where we have cd'd to a temp directory. + # . Include directory containing file, in case there are other + # files @include'd. + # . Keep a final path_sep to get the default (system) TeX + # directories included. + # . If we have any includes, put those at the end. + + common="$orig_pwd$path_sep$in_dir$path_sep" + # + txincludes=`list_infix includes $path_sep` + test -n "$txincludes" && common="$common$txincludes$path_sep" + # + for var in $tex_envvars; do + eval val="\$common\$${var}_orig" + # Convert relative paths to absolute paths, so we can run in another + # directory (e.g., in clean build mode, or during the macro-support + # detection). + val=`absolute_filenames "$val"` + eval $var="\"$val\"" + export $var + eval verbose \"$var=\'\$${var}\'\" + done + + # --expand + run_makeinfo + + # --command, --texinfo + insert_commands + + # Run until a fixed point is reached. + run_tex_suite +} + +# make_openout_test FLAGS EXTENSION +# - Run TeX with an input file that performs an \openout. Pass FLAGS to TeX. +# +make_openout_test () +{ + recorder_option_maybe="$1" + make_tex_cmd + + ensure_dir "$workdir"/check_recorder + cd_dir "$workdir"/check_recorder + + cat > openout.tex </dev/null 2>&1) +} + +# Check tex supports -recorder option +check_recorder_support () +{ + verbose "Checking TeX recorder support..." + make_openout_test " -recorder" fls + if test -f openout.fls && grep '^OUTPUT dum.dum$' openout.fls > /dev/null + then + cd_orig + verbose "Checking TeX recorder support... yes" + return 0 + else + cd_orig + verbose "Checking TeX recorder support... no" + return 1 + fi +} + +# Check tex supports \openout traces in log +check_openout_in_log_support () +{ + verbose "Checking TeX \openout in log support..." + make_openout_test "" log + if test -f openout.log \ + && grep '^\\openout..\? *= *`\?dum\.dum'\''\?' openout.log >/dev/null + then + cd_orig + verbose "Checking TeX \openout in log support... yes" + return 0 + else + cd_orig + verbose "Checking TeX \openout in log support... no" + return 1 + fi +} + +# Set that output auxiliary files are detected with the -recorder option, +# which creates a file JOBNAME.fls which is a machine-readable listing of +# files read and written during the job. +set_aux_files_from_fls () +{ + recorder_option_maybe=" -recorder" + generated_files_get_method=generated_files_get_from_fls +} + +# Set that output auxiliary files are detected with searching for \openout +# in the log file. +set_aux_files_from_log () +{ + recorder_option_maybe='' + generated_files_get_method=generated_files_get_from_log +} + +# Decide whether output auxiliary files are detected with the -recorder +# option, or by searching for \openout in the log file. +decide_aux_files_method () +{ + # Select output file detection method + # Valid values of TEXI2DVI_USE_RECORDER are: + # yes use the -recorder option, no checks. + # no scan for \openout in the log file, no checks. + # yesmaybe check whether -recorder option is supported, and if yes + # use it, otherwise check for tracing \openout in the + # log file is supported, and if yes use it, else it is an + # error. + # nomaybe same as `yesmaybe', except that the \openout trace in + # log file is checked first. + # + # The default behaviour is `nomaybe'. + + test -n "$TEXI2DVI_USE_RECORDER" || TEXI2DVI_USE_RECORDER=nomaybe + + case $TEXI2DVI_USE_RECORDER in + yes) set_aux_files_from_fls;; + + no) set_aux_files_from_log;; + + yesmaybe) + if check_recorder_support; then + set_aux_files_from_fls + elif check_openout_in_log_support; then + set_aux_files_from_log + else + error 1 "TeX neither supports -recorder nor outputs \\openout lines in its log file" + fi + ;; + + nomaybe) + if check_openout_in_log_support; then + set_aux_files_from_log + elif check_recorder_support; then + set_aux_files_from_fls + else + error 1 "TeX neither supports -recorder nor outputs \\openout lines in its log file" + fi + ;; + + *) error 1 "Invalid value of TEXI2DVI_USE_RECORDER environment variable : $TEXI2DVI_USE_RECORDER.";; + + esac +} + +# remove FILE... +remove () +{ + verbose "Removing" "$@" + rm -rf "$@" +} + + +# all_files - Echo the names of all files generated, including those by +# auxiliary tools like texindex. +all_files () +{ + echo $in_noext.log + echo $in_noext.fls + echo $xref_files_new + echo `sorted_index_files` +} + +sorted_index_files () +{ + filter_files sorted_index_filter +} + +# Print the name of a generated file based on FILE if there is one. +sorted_index_filter () +{ + case $in_lang in + texinfo) + # texindex: texinfo.cp -> texinfo.cps + if test -n "`index_file_p $1`" ; then + echo $1s + fi + ;; + esac +} + + +# Not currently used - use with filter_files to add secondary files created by +# bibtex +bibtex_secondary_files () +{ + case $in_lang in + latex) + if test -n "`aux_file_p $1`"; then + # bibtex: *.aux -> *.bbl and *.blg. + echo $1 | $SED 's/^\(.*\)\.aux$/\1.bbl/' + echo $1 | $SED 's/^\(.*\)\.aux$/\1.blg/' + fi + ;; + esac +} + +# mostly_clean - Remove auxiliary files and directories. Changes back to +# the original directory. +mostly_clean () +{ + cd_orig + set X "$t2ddir" + shift + $tidy || { + set X ${1+"$@"} `all_files` + shift + } + remove ${1+"$@"} +} + + +# cleanup - Remove what should be removed according to options. +# Called at the end of each compilation cycle, and at the end of +# the script. Changes the current directory. +cleanup () +{ + case $clean:$tidy in + true:true) mostly_clean ;; # build mode is "clean" + false:false) cd_orig; remove "$t2ddir";; # build mode is "local" + esac +} + + +# input_file_name_decode - Decode COMMAND_LINE_FILENAME, and set the +# following shell variables: +# +# - COMMAND_LINE_FILENAME +# The filename given on the commmand line, but cleaned of TeX commands. +# - IN_DIR +# The directory containing the input file. +# - IN_BASE +# The input file base name (no directory part). +# - IN_NOEXT +# The input file name with neither file extensions nor directory part. +# - IN_INPUT +# The path to the input file for passing as a command-line argument +# to TeX. Defaults to COMMAND_LINE_FILENAME, but might change if the +# input is preprocessed. +input_file_name_decode () +{ + case $command_line_filename in + *\\input{*}*) + # Let AUC-TeX error parser deal with line numbers. + line_error=false + command_line_filename=`\ + expr X"$command_line_filename" : X'.*input{\([^}]*\)}'` + ;; + esac + + # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex), + # prepend `./' in order to avoid that the tools take it as an option. + echo "$command_line_filename" | LC_ALL=C $EGREP '^(/|[A-Za-z]:/)' >&6 \ + || command_line_filename="./$command_line_filename" + + # See if the file exists. If it doesn't we're in trouble since, even + # though the user may be able to reenter a valid filename at the tex + # prompt (assuming they're attending the terminal), this script won't + # be able to find the right xref files and so forth. + test -r "$command_line_filename" \ + || error 1 "cannot read $command_line_filename, skipping." + + # Get the name of the current directory. + in_dir=`func_dirname "$command_line_filename"` + + # Strip directory part but leave extension. + in_base=`basename "$command_line_filename"` + # Strip extension. + in_noext=`noext "$in_base"` + + # The normalized file name to compile. Must always point to the + # file to actually compile (in case of recoding, macro-expansion etc.). + in_input=$in_dir/$in_base + + + # Compute the output file name. + if test x"$oname" != x; then + out_name=$oname + else + out_name=$in_noext.`out_lang_ext` + fi + out_dir=`func_dirname "$out_name"` + out_dir_abs=`absolute "$out_dir"` + out_base=`basename "$out_name"` + out_noext=`noext "$out_base"` +} + + +# +#################### Main program starts ########################## + +# Initialize more variables. +# +# Save TEXINPUTS so we can construct a new TEXINPUTS path for each file. +# Likewise for bibtex and makeindex. +tex_envvars="BIBINPUTS BSTINPUTS DVIPSHEADERS INDEXSTYLE MFINPUTS MPINPUTS \ +TEXINPUTS TFMFONTS" +for var in $tex_envvars; do + eval ${var}_orig=\$$var + export $var +done + +# Push a token among the arguments that will be used to notice when we +# ended options/arguments parsing. +# Use "set dummy ...; shift" rather than 'set - ..." because on +# Solaris set - turns off set -x (but keeps set -e). +# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3 +# still expand "$@" to a single argument (the empty string) rather +# than nothing at all. +arg_sep="$$--$$" +set dummy ${1+"$@"} "$arg_sep"; shift + +while test x"$1" != x"$arg_sep"; do + # Handle --option=value by splitting apart and putting back on argv. + case "$1" in + --*=*) + opt=`echo "$1" | $SED -e 's/=.*//'` + val=`echo "$1" | $SED -e 's/[^=]*=//'` + shift + set dummy "$opt" "$val" ${1+"$@"}; shift + ;; + esac + + case "$1" in + -@ ) escape=@;; + -~ ) verbose "Option -~ is obsolete: texi2dvi ignores it.";; + -b | --batch) ;; # Obsolete + --build) shift; build_mode=$1;; + --build-dir) shift; build_dir=$1; build_mode=tidy;; + -c | --clean) build_mode=clean;; + -D | --debug) debug=true;; + -e | -E | --expand) expand=true;; + -h | --help) usage;; + -I) shift; list_concat_dirs includes "$1";; + -l | --lang | --language) shift; set_language=$1;; + --mostly-clean) action=mostly-clean;; + --no-line-error) line_error=false;; + --max-iterations) shift; max_iters=$1;; + -o | --out | --output) + shift + # Make it absolute, just in case we also have --clean, or whatever. + oname=`absolute "$1"`;; + + # Output formats. + -O|--output-format) shift; out_lang_set "$1";; + --dvi|--dvipdf|--html|--info|--pdf|--ps|--text) + out_lang_set `echo "x$1" | $SED 's/^x--//'`;; + + -p) out_lang_set pdf;; + -q | -s | --quiet | --silent) quiet=true;; + --src-specials) src_specials=--src-specials;; + --shell-escape) shell_escape=--shell-escape;; + --tex4ht) latex2html=tex4ht;; + -t | --texinfo | --command ) shift; textra="$textra\\ +"`echo "$1" | $SED 's/\\\\/\\\\\\\\/g'`;; + --translate-file ) shift; translate_file="$1";; + --tidy) build_mode=tidy;; + -v | --vers*) version;; + -V | --verb*) verb=true;; + --) # What remains are not options. + shift + while test x"$1" != x"$arg_sep"; do + set dummy ${1+"$@"} "$1"; shift + shift + done + break;; + -*) + error 1 "Unknown or ambiguous option \`$1'." \ + "Try \`--help' for more information." + ;; + *) set dummy ${1+"$@"} "$1"; shift;; + esac + shift +done +# Pop the token +shift + +# $tidy: compile in a t2d directory. +# $clean: remove all the aux files. +case $build_mode in + local) clean=false; tidy=false;; + tidy) clean=false; tidy=true;; + clean) clean=true; tidy=true;; + *) error 1 "invalid build mode: $build_mode";; +esac + +# Interpret remaining command line args as filenames. +case $# in + 0) + error 2 "Missing file arguments." "Try \`--help' for more information." + ;; + 1) ;; + *) + if test -n "$oname"; then + error 2 "Can't use option \`--output' with more than one argument." + fi + ;; +esac + + +# We can't do much without tex. +# End up with the TEX and PDFTEX variables set to what we are going to use. +# +# If $TEX is set to a directory, don't use it. +test -n "$TEX" && test -d "$TEX" && unset TEX + +# But otherwise, use $TEX if it is set. +if test -z "$TEX"; then + if findprog tex; then :; else cat <&2 +You don't have a working TeX binary (tex) installed anywhere in +your PATH, and texi2dvi cannot proceed without one. If you want to use +this script, you'll need to install TeX (if you don't have it) or change +your PATH or TEX environment variable (if you do). See the --help +output for more details. + +For information about obtaining TeX, please see http://tug.org/texlive, +or do a web search for TeX and your operating system or distro. +EOM + exit 1 + fi + + # We want to use etex (or pdftex) if they are available, and the user + # didn't explicitly specify. We don't check for elatex and pdfelatex + # because (as of 2003), the LaTeX team has asked that new distributions + # use etex by default anyway. + # + if findprog etex; then TEX=etex; else TEX=tex; fi +fi + +# For many years, the pdftex binary has included the e-tex extensions, +# but for those people with ancient TeX distributions ... +if test -z "$PDFTEX"; then + if findprog pdfetex; then PDFTEX=pdfetex; else PDFTEX=pdftex; fi +fi + + +# File descriptor usage: +# 0 standard input +# 1 standard output (--verbose messages) +# 2 standard error +# 5 tools output (turned off by --quiet) +# 6 tracing/debugging (set -x output, etc.) + +# Main tools' output (TeX, etc.) that TeX users are used to seeing. +# +# If quiet, discard, else redirect to the message flow. +if $quiet; then + exec 5>/dev/null +else + exec 5>&1 +fi + + +# Enable tracing, and auxiliary tools output. +# +# This fd should be used where you'd typically use /dev/null to throw +# output away. But sometimes it is convenient to see that output (e.g., +# from a grep) to aid debugging. Especially debugging at distance, via +# the user. +# +if $debug; then + exec 6>&1 + set -vx +else + exec 6>/dev/null +fi + + +# Main program main loop - TeXify each file in turn. +for command_line_filename +do + verbose "Processing $command_line_filename ..." + + input_file_name_decode + + # `texinfo' or `latex'? + in_lang=`compute_language "$command_line_filename"` + + # An auxiliary directory used for all the auxiliary tasks involved + # in compiling this document. + case $build_dir in + '' | . ) t2ddir=$out_noext.t2d ;; + *) # Avoid collisions between multiple occurrences of the same + # file, so depend on the output path. Remove leading `./', + # at least to avoid creating a file starting with `.!', i.e., + # an invisible file. The sed expression is fragile if the cwd + # has active characters. Transform / into ! so that we don't + # need `mkdir -p'. It might be something to reconsider. + t2ddir=$build_dir/`echo "$out_dir_abs/$out_noext.t2d" | + $SED "s,^$orig_pwd/,,;s,^\./,,;s,/,!,g"` + esac + # Remove it at exit if clean mode. + trap "cleanup" 0 1 2 15 + + ensure_dir "$build_dir" "$t2ddir" + + # Sometimes there are incompatibilities between auxiliary files for + # DVI and PDF. The contents can also change whether we work on PDF + # and/or DVI. So keep separate spaces for each. + workdir=$t2ddir/`out_lang_tex` + ensure_dir "$workdir" + + # _build. In a tidy build, where the auxiliary files are output. + if $tidy; then + work_build=$workdir/build + else + work_build=. + fi + + # _bak. Copies of the previous auxiliary files (another round is + # run if they differ from the new ones). + work_bak=$workdir/bak + + # Make those directories. + ensure_dir "$work_build" "$work_bak" + + # Decide how to find auxiliary files created by TeX. + decide_aux_files_method + + case $action in + compile) + # Compile the document. + compile + cleanup + ;; + + mostly-clean) + xref_files_new=`generated_files_get` + mostly_clean + ;; + esac +done + +verbose "done." +exit 0 # exit successfully, not however we ended the loop. +# Local Variables: +# sh-basic-offset: 2 +# sh-indentation: 2 +# End: diff --git a/doc/texi2html b/doc/texi2html new file mode 100644 index 0000000..13b5588 --- /dev/null +++ b/doc/texi2html @@ -0,0 +1,5428 @@ +#! /usr/bin/perl +'di '; +'ig 00 '; +#+############################################################################## +# +# texi2html: Program to transform Texinfo documents to HTML +# +# Copyright (C) 1999, 2000 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 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, see . +# +#-############################################################################## + +# This requires perl version 5 or higher +require 5.0; + +#++############################################################################## +# +# NOTE FOR DEBUGGING THIS SCRIPT: +# You can run 'perl texi2html.pl' directly, provided you have +# the environment variable T2H_HOME set to the directory containing +# the texi2html.init file +# +#--############################################################################## + +# CVS version: +# $Id: texi2html.pl,v 1.55 2000/07/27 14:39:41 obachman Exp $ + +# Homepage: +$T2H_HOMEPAGE = < (original author) + Karl Berry + Olaf Bachmann + and many others. +Maintained by: Olaf Bachmann +Send bugs and suggestions to +EOT + +# Version: set in configure.in +$THISVERSION = '1.64'; +$THISPROG = "texi2html $THISVERSION"; # program name and version + +# The man page for this program is included at the end of this file and can be +# viewed using the command 'nroff -man texi2html'. + +# Identity: + +$T2H_TODAY = &pretty_date; # like "20 September 1993" +# the eval prevents this from breaking on system which do not have +# a proper getpwuid implemented +eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i + +#+++############################################################################ +# # +# Initialization # +# Pasted content of File $(srcdir)/texi2html.init: Default initializations # +# # +#---############################################################################ + +# leave this within comments, and keep the require statement +# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init +# exists. + +# +# -*-perl-*- +###################################################################### +# File: texi2html.init +# +# Sets default values for command-line arguments and for various customizable +# procedures +# +# A copy of this file is pasted into the beginning of texi2html by +# 'make texi2html' +# +# Copy this file and make changes to it, if you like. +# Afterwards, either, load it with command-line option -init_file +# +# $Id: texi2html.init,v 1.34 2000/07/27 14:09:02 obachman Exp $ + +###################################################################### +# stuff which can also be set by command-line options +# +# +# Note: values set here, overwrite values set by the command-line +# options before -init_file and might still be overwritten by +# command-line arguments following the -init_file option +# + +# T2H_OPTIONS is a hash whose keys are the (long) names of valid +# command-line options and whose values are a hash with the following keys: +# type ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info) +# linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info) +# verbose ==> short description of option (displayed by -h) +# noHelp ==> if 1 -> for "not so important options": only print description on -h 1 +# 2 -> for obsolete options: only print description on -h 2 + +$T2H_DEBUG = 0; +$T2H_OPTIONS -> {debug} = +{ + type => '=i', + linkage => \$main::T2H_DEBUG, + verbose => 'output HTML with debuging information', +}; + +$T2H_DOCTYPE = ''; +$T2H_OPTIONS -> {doctype} = +{ + type => '=s', + linkage => \$main::T2H_DOCTYPE, + verbose => 'document type which is output in header of HTML files', + noHelp => 1 +}; + +$T2H_CHECK = 0; +$T2H_OPTIONS -> {check} = +{ + type => '!', + linkage => \$main::T2H_CHECK, + verbose => 'if set, only check files and output all things that may be Texinfo commands', + noHelp => 1 +}; + +# -expand +# if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections +# else, neither expand @iftex, @tex, nor @ifinfo sections +$T2H_EXPAND = "info"; +$T2H_OPTIONS -> {expand} = +{ + type => '=s', + linkage => \$T2H_EXPAND, + verbose => 'Expand info|tex|none section of texinfo source', +}; + +# - glossary +#if set, uses section named `Footnotes' for glossary +$T2H_USE_GLOSSARY = 0; +T2H_OPTIONS -> {glossary} = +{ + type => '!', + linkage => \$T2H_USE_GLOSSARY, + verbose => "if set, uses section named `Footnotes' for glossary", + noHelp => 1, +}; + + +# -invisible +# $T2H_INVISIBLE_MARK is the text used to create invisible destination +# anchors for index links (you can for instance use the invisible.xbm +# file shipped with this program). This is a workaround for a known +# bug of many WWW browsers, including netscape. +# For me, it works fine without it -- on the contrary: if there, it +# inserts space between headers and start of text (obachman 3/99) +$T2H_INVISIBLE_MARK = ''; +# $T2H_INVISIBLE_MARK = ' '; +$T2H_OPTIONS -> {invisible} = +{ + type => '=s', + linkage => \$T2H_INVISIBLE_MARK, + verbose => 'use text in invisble anchot', + noHelp => 1, +}; + +# -iso +# if set, ISO8879 characters are used for special symbols (like copyright, etc) +$T2H_USE_ISO = 0; +$T2H_OPTIONS -> {iso} = +{ + type => 'iso', + linkage => \$T2H_USE_ISO, + verbose => 'if set, ISO8879 characters are used for special symbols (like copyright, etc)', + noHelp => 1, +}; + +# -I +# list directories where @include files are searched for (besides the +# directory of the doc file) additional '-I' args add to this list +@T2H_INCLUDE_DIRS = ("."); +$T2H_OPTIONS -> {I} = +{ + type => '=s', + linkage => \@T2H_INCLUDE_DIRS, + verbose => 'append $s to the @include search path', +}; + +# -top_file +# uses file of this name for top-level file +# extension is manipulated appropriately, if necessary. +# If empty, .html is used +# Typically, you would set this to "index.html". +$T2H_TOP_FILE = ''; +$T2H_OPTIONS -> {top_file} = +{ + type => '=s', + linkage => \$T2H_TOP_FILE, + verbose => 'use $s as top file, instead of .html', +}; + + +# -toc_file +# uses file of this name for table of contents file +# extension is manipulated appropriately, if necessary. +# If empty, _toc.html is used +$T2H_TOC_FILE = ''; +$T2H_OPTIONS -> {toc_file} = +{ + type => '=s', + linkage => \$T2H_TOC_FILE, + verbose => 'use $s as ToC file, instead of _toc.html', +}; + +# -frames +# if set, output two additional files which use HTML 4.0 "frames". +$T2H_FRAMES = 0; +$T2H_OPTIONS -> {frames} = +{ + type => '!', + linkage => \$T2H_FRAMES, + verbose => 'output files which use HTML 4.0 frames (experimental)', + noHelp => 1, +}; + + +# -menu | -nomenu +# if set, show the Texinfo menus +$T2H_SHOW_MENU = 1; +$T2H_OPTIONS -> {menu} = +{ + type => '!', + linkage => \$T2H_SHOW_MENU, + verbose => 'ouput Texinfo menus', +}; + +# -number | -nonumber +# if set, number sections and show section names and numbers in references +# and menus +$T2H_NUMBER_SECTIONS = 1; +$T2H_OPTIONS -> {number} = +{ + type => '!', + linkage => \$T2H_NUMBER_SECTIONS, + verbose => 'use numbered sections' +}; + +# if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu +# entries, instead of section names +$T2H_NODE_NAME_IN_MENU = 0; + +# if set and menu entry equals menu descr, then do not print menu descr. +# Likewise, if node name equals entry name, do not print entry name. +$T2H_AVOID_MENU_REDUNDANCY = 1; + +# -split section|chapter|none +# if set to 'section' (resp. 'chapter') create one html file per (sub)section +# (resp. chapter) and separate pages for Top, ToC, Overview, Index, +# Glossary, About. +# otherwise, create monolithic html file which contains whole document +#$T2H_SPLIT = 'section'; +$T2H_SPLIT = ''; +$T2H_OPTIONS -> {split} = +{ + type => '=s', + linkage => \$T2H_SPLIT, + verbose => 'split document on section|chapter else no splitting', +}; + +# -section_navigation|-no-section_navigation +# if set, then navigation panels are printed at the beginning of each section +# and, possibly at the end (depending on whether or not there were more than +# $T2H_WORDS_IN_PAGE words on page +# This is most useful if you do not want to have section navigation +# on -split chapter +$T2H_SECTION_NAVIGATION = 1; +$T2H_OPTIONS -> {sec_nav} = +{ + type => '!', + linkage => \$T2H_SECTION_NAVIGATION, + verbose => 'output navigation panels for each section', +}; + +# -subdir +# if set put result files in this directory +# if not set result files are put into current directory +#$T2H_SUBDIR = 'html'; +$T2H_SUBDIR = ''; +$T2H_OPTIONS -> {subdir} = +{ + type => '=s', + linkage => \$T2H_SUBDIR, + verbose => 'put HTML files in directory $s, instead of $cwd', +}; + +# -short_extn +# If this is set all HTML file will have extension ".htm" instead of +# ".html". This is helpful when shipping the document to PC systems. +$T2H_SHORTEXTN = 0; +$T2H_OPTIONS -> {short_ext} = +{ + type => '!', + linkage => \$T2H_SHORTEXTN, + verbose => 'use "htm" extension for output HTML files', +}; + + +# -prefix +# Set the output file prefix, prepended to all .html, .gif and .pl files. +# By default, this is the basename of the document +$T2H_PREFIX = ''; +$T2H_OPTIONS -> {prefix} = +{ + type => '=s', + linkage => \$T2H_PREFIX, + verbose => 'use as prefix for output files, instead of ', +}; + +# -o filename +# If set, generate monolithic document output html into $filename +$T2H_OUT = ''; +$T2H_OPTIONS -> {out_file} = +{ + type => '=s', + linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';}, + verbose => 'if set, all HTML output goes into file $s', +}; + +# -short_ref +#if set cross-references are given without section numbers +$T2H_SHORT_REF = ''; +$T2H_OPTIONS -> {short_ref} = +{ + type => '!', + linkage => \$T2H_SHORT_REF, + verbose => 'if set, references are without section numbers', +}; + +# -idx_sum +# if value is set, then for each @prinindex $what +# $docu_name_$what.idx is created which contains lines of the form +# $key\t$ref sorted alphabetically (case matters) +$T2H_IDX_SUMMARY = 0; +$T2H_OPTIONS -> {idx_sum} = +{ + type => '!', + linkage => \$T2H_IDX_SUMMARY, + verbose => 'if set, also output index summary', + noHelp => 1, +}; + +# -verbose +# if set, chatter about what we are doing +$T2H_VERBOSE = ''; +$T2H_OPTIONS -> {Verbose} = +{ + type => '!', + linkage => \$T2H_VERBOSE, + verbose => 'print progress info to stdout', +}; + +# -lang +# For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title. +# To add a new language, supply list of titles (see $T2H_WORDS below). +# and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02 +# for definitions) +# Default's to 'en' if not set or no @documentlanguage is specified +$T2H_LANG = ''; +$T2H_OPTIONS -> {lang} = +{ + type => '=s', + linkage => sub {SetDocumentLanguage($_[1])}, + verbose => 'use $s as document language (ISO 639 encoding)', +}; + +# -l2h +# if set, uses latex2html for generation of math content +$T2H_L2H = ''; +$T2H_OPTIONS -> {l2h} = +{ + type => '!', + linkage => \$T2H_L2H, + verbose => 'if set, uses latex2html for @math and @tex', +}; + +###################### +# The following options are only relevant if $T2H_L2H is set +# +# -l2h_l2h +# name/location of latex2html progam +$T2H_L2H_L2H = "latex2html"; +$T2H_OPTIONS -> {l2h_l2h} = +{ + type => '=s', + linkage => \$T2H_L2H_L2H, + verbose => 'program to use for latex2html translation', + noHelp => 1, +}; + +# -l2h_skip +# if set, skips actual call to latex2html tries to reuse previously generated +# content, instead +$T2H_L2H_SKIP = ''; +$T2H_OPTIONS -> {l2h_skip} = +{ + type => '!', + linkage => \$T2H_L2H_SKIP, + verbose => 'if set, tries to reuse previously latex2html output', + noHelp => 1, +}; + +# -l2h_tmp +# if set, l2h uses this directory for temporarary files. The path +# leading to this directory may not contain a dot (i.e., a "."), +# otherwise, l2h will fail +$T2H_L2H_TMP = ''; +$T2H_OPTIONS -> {l2h_tmp} = +{ + type => '=s', + linkage => \$T2H_L2H_TMP, + verbose => 'if set, uses $s as temporary latex2html directory', + noHelp => 1, +}; + +# if set, cleans intermediate files (they all have the prefix $doc_l2h_) +# of l2h +$T2H_L2H_CLEAN = 1; +$T2H_OPTIONS -> {l2h_clean} = +{ + type => '!', + linkage => \$T2H_L2H_CLEAN, + verbose => 'if set, do not keep intermediate latex2html files for later reuse', + noHelp => 1, +}; + +$T2H_OPTIONS -> {D} = +{ + type => '=s', + linkage => sub {$main::value{@_[1]} = 1;}, + verbose => 'equivalent to Texinfo "@set $s 1"', + noHelp => 1, +}; + +$T2H_OPTIONS -> {init_file} = +{ + type => '=s', + linkage => \&LoadInitFile, + verbose => 'load init file $s' +}; + + +############################################################################## +# +# The following can only be set in the init file +# +############################################################################## + +# if set, center @image by default +# otherwise, do not center by default +$T2H_CENTER_IMAGE = 1; + +# used as identation for block enclosing command @example, etc +# If not empty, must be enclosed in +$T2H_EXAMPLE_INDENT_CELL = ' '; +# same as above, only for @small +$T2H_SMALL_EXAMPLE_INDENT_CELL = ' '; +# font size for @small +$T2H_SMALL_FONT_SIZE = '-1'; + +# if non-empty, and no @..heading appeared in Top node, then +# use this as header for top node/section, otherwise use value of +# @settitle or @shorttitle (in that order) +$T2H_TOP_HEADING = ''; + +# if set, use this chapter for 'Index' button, else +# use first chapter whose name matches 'index' (case insensitive) +$T2H_INDEX_CHAPTER = ''; + +# if set and $T2H_SPLIT is set, then split index pages at the next letter +# after they have more than that many entries +$T2H_SPLIT_INDEX = 100; + +# if set (e.g., to index.html) replace hrefs to this file +# (i.e., to index.html) by ./ +$T2H_HREF_DIR_INSTEAD_FILE = ''; + +######################################################################## +# Language dependencies: +# To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash +# To redefine one word, simply do: +# $T2H_WORDS->{}->{} = 'whatever' in your personal init file. +# +$T2H_WORDS_EN = +{ + # titles of pages + 'ToC_Title' => 'Table of Contents', + 'Overview_Title' => 'Short Table of Contents', + 'Index_Title' => 'Index', + 'About_Title' => 'About this document', + 'Footnotes_Title' => 'Footnotes', + 'See' => 'See', + 'see' => 'see', + 'section' => 'section', +# If necessary, we could extend this as follows: +# # text for buttons +# 'Top_Button' => 'Top', +# 'ToC_Button' => 'Contents', +# 'Overview_Button' => 'Overview', +# 'Index_button' => 'Index', +# 'Back_Button' => 'Back', +# 'FastBack_Button' => 'FastBack', +# 'Prev_Button' => 'Prev', +# 'Up_Button' => 'Up', +# 'Next_Button' => 'Next', +# 'Forward_Button' =>'Forward', +# 'FastWorward_Button' => 'FastForward', +# 'First_Button' => 'First', +# 'Last_Button' => 'Last', +# 'About_Button' => 'About' +}; + +$T2H_WORD_DE = +{ + 'ToC_Title' => 'Inhaltsverzeichniss', + 'Overview_Title' => 'Kurzes Inhaltsverzeichniss', + 'Index_Title' => 'Index', + 'About_Title' => 'Über dieses Dokument', + 'Footnotes_Title' => 'Fußnoten', + 'See' => 'Siehe', + 'see' => 'siehe', + 'section' => 'Abschnitt', +}; + +$T2H_WORD_NL = +{ + 'ToC_Title' => 'Inhoudsopgave', + 'Overview_Title' => 'Korte inhoudsopgave', + 'Index_Title' => 'Index', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'No translation available!', #No translation available! + 'See' => 'Zie', + 'see' => 'zie', + 'section' => 'sectie', +}; + +$T2H_WORD_ES = +{ + 'ToC_Title' => 'índice General', + 'Overview_Title' => 'Resumen del Contenido', + 'Index_Title' => 'Index', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'Fußnoten', + 'See' => 'Véase', + 'see' => 'véase', + 'section' => 'sección', +}; + +$T2H_WORD_NO = +{ + 'ToC_Title' => 'Innholdsfortegnelse', + 'Overview_Title' => 'Kort innholdsfortegnelse', + 'Index_Title' => 'Indeks', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'No translation available!', + 'See' => 'Se', + 'see' => 'se', + 'section' => 'avsnitt', +}; + +$T2H_WORD_PT = +{ + 'ToC_Title' => 'Sumário', + 'Overview_Title' => 'Breve Sumário', + 'Index_Title' => 'Índice', #Not sure ;-) + 'About_Title' => 'No translation available!', #No translation available! + 'Footnotes_Title' => 'No translation available!', + 'See' => 'Veja', + 'see' => 'veja', + 'section' => 'Seção', +}; + +$T2H_WORDS = +{ + 'en' => $T2H_WORDS_EN, + 'de' => $T2H_WORDS_DE, + 'nl' => $T2H_WORDS_NL, + 'es' => $T2H_WORDS_ES, + 'no' => $T2H_WORDS_NO, + 'pt' => $T2H_WORDS_PT +}; + +@MONTH_NAMES_EN = +( + 'January', 'February', 'March', 'April', 'May', + 'June', 'July', 'August', 'September', 'October', + 'November', 'December' +); + +@MONTH_NAMES_DE = +( + 'Januar', 'Februar', 'März', 'April', 'Mai', + 'Juni', 'Juli', 'August', 'September', 'Oktober', + 'November', 'Dezember' +); + +@MONTH_NAMES_NL = +( + 'Januari', 'Februari', 'Maart', 'April', 'Mei', + 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', + 'November', 'December' +); + +@MONTH_NAMES_ES = +( + 'enero', 'febrero', 'marzo', 'abril', 'mayo', + 'junio', 'julio', 'agosto', 'septiembre', 'octubre', + 'noviembre', 'diciembre' +); + +@MONTH_NAMES_NO = +( + + 'januar', 'februar', 'mars', 'april', 'mai', + 'juni', 'juli', 'august', 'september', 'oktober', + 'november', 'desember' +); + +@MONTH_NAMES_PT = +( + 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', + 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', + 'Novembro', 'Dezembro' +); + + +$MONTH_NAMES = +{ + 'en' => \@MONTH_NAMES_EN, + 'de' => \@MONTH_NAMES_DE, + 'es' => \@MONTH_NAMES_ES, + 'nl' => \@MONTH_NAMES_NL, + 'no' => \@MONTH_NAMES_NO, + 'pt' => \@MONTH_NAMES_PT +}; +######################################################################## +# Control of Page layout: +# You can make changes of the Page layout at two levels: +# 1.) For small changes, it is often enough to change the value of +# some global string/hash/array variables +# 2.) For larger changes, reimplement one of the T2H_DEFAULT_* routines, +# give them another name, and assign them to the respective +# $T2H_ variable. + +# As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold +# href, html-name, node-name of +# This -- current section (resp. html page) +# Top -- top page ($T2H_TOP_FILE) +# Contents -- Table of contents +# Overview -- Short table of contents +# Index -- Index page +# About -- page which explain "navigation buttons" +# First -- first node +# Last -- last node +# +# Whether or not the following hash values are set, depends on the context +# (all values are w.r.t. 'This' section) +# Next -- next node of texinfo +# Prev -- previous node of texinfo +# Up -- up node of texinfo +# Forward -- next node in reading order +# Back -- previous node in reading order +# FastForward -- if leave node, up and next, else next node +# FastBackward-- if leave node, up and prev, else prev node +# +# Furthermore, the following global variabels are set: +# $T2H_THISDOC{title} -- title as set by @setttile +# $T2H_THISDOC{fulltitle} -- full title as set by @title... +# $T2H_THISDOC{subtitle} -- subtitle as set by @subtitle +# $T2H_THISDOC{author} -- author as set by @author +# +# and pointer to arrays of lines which need to be printed by t2h_print_lines +# $T2H_OVERVIEW -- lines of short table of contents +# $T2H_TOC -- lines of table of contents +# $T2H_TOP -- lines of Top texinfo node +# $T2H_THIS_SECTION -- lines of 'This' section + +# +# There are the following subs which control the layout: +# +$T2H_print_section = \&T2H_DEFAULT_print_section; +$T2H_print_Top_header = \&T2H_DEFAULT_print_Top_header; +$T2H_print_Top_footer = \&T2H_DEFAULT_print_Top_footer; +$T2H_print_Top = \&T2H_DEFAULT_print_Top; +$T2H_print_Toc = \&T2H_DEFAULT_print_Toc; +$T2H_print_Overview = \&T2H_DEFAULT_print_Overview; +$T2H_print_Footnotes = \&T2H_DEFAULT_print_Footnotes; +$T2H_print_About = \&T2H_DEFAULT_print_About; +$T2H_print_misc_header = \&T2H_DEFAULT_print_misc_header; +$T2H_print_misc_footer = \&T2H_DEFAULT_print_misc_footer; +$T2H_print_misc = \&T2H_DEFAULT_print_misc; +$T2H_print_chapter_header = \&T2H_DEFAULT_print_chapter_header; +$T2H_print_chapter_footer = \&T2H_DEFAULT_print_chapter_footer; +$T2H_print_page_head = \&T2H_DEFAULT_print_page_head; +$T2H_print_page_foot = \&T2H_DEFAULT_print_page_foot; +$T2H_print_head_navigation = \&T2H_DEFAULT_print_head_navigation; +$T2H_print_foot_navigation = \&T2H_DEFAULT_print_foot_navigation; +$T2H_button_icon_img = \&T2H_DEFAULT_button_icon_img; +$T2H_print_navigation = \&T2H_DEFAULT_print_navigation; +$T2H_about_body = \&T2H_DEFAULT_about_body; +$T2H_print_frame = \&T2H_DEFAULT_print_frame; +$T2H_print_toc_frame = \&T2H_DEFAULT_print_toc_frame; + +######################################################################## +# Layout for html for every sections +# +sub T2H_DEFAULT_print_section +{ + my $fh = shift; + local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS; + &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION; + my $nw = t2h_print_lines($fh); + if ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION) + { + &$T2H_print_foot_navigation($fh, $nw); + } + else + { + print $fh '
' . "\n"; + } +} + +################################################################### +# Layout of top-page I recommend that you use @ifnothtml, @ifhtml, +# @html within the Top texinfo node to specify content of top-level +# page. +# +# If you enclose everything in @ifnothtml, then title, subtitle, +# author and overview is printed +# T2H_HREF of Next, Prev, Up, Forward, Back are not defined +# if $T2H_SPLIT then Top page is in its own html file +sub T2H_DEFAULT_print_Top_header +{ + &$T2H_print_page_head(@_) if $T2H_SPLIT; + t2h_print_label(@_); # this needs to be called, otherwise no label set + &$T2H_print_head_navigation(@_); +} +sub T2H_DEFAULT_print_Top_footer +{ + &$T2H_print_foot_navigation(@_); + &$T2H_print_page_foot(@_) if $T2H_SPLIT; +} +sub T2H_DEFAULT_print_Top +{ + my $fh = shift; + + # for redefining navigation buttons use: + # local $T2H_BUTTONS = [...]; + # as it is, 'Top', 'Contents', 'Index', 'About' are printed + local $T2H_BUTTONS = \@T2H_MISC_BUTTONS; + &$T2H_print_Top_header($fh); + if ($T2H_THIS_SECTION) + { + # if top-level node has content, then print it with extra header + print $fh "

$T2H_NAME{Top}

" + unless ($T2H_HAS_TOP_HEADING); + t2h_print_lines($fh, $T2H_THIS_SECTION) + } + else + { + # top-level node is fully enclosed in @ifnothtml + # print fulltitle, subtitle, author, Overview + print $fh + "
\n

" . + join("

\n

", split(/\n/, $T2H_THISDOC{fulltitle})) . + "

\n"; + print $fh "

$T2H_THISDOC{subtitle}

\n" if $T2H_THISDOC{subtitle}; + print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author}; + print $fh < +
+

+

Overview:

+
+EOT + t2h_print_lines($fh, $T2H_OVERVIEW); + print $fh "
\n"; + } + &$T2H_print_Top_footer($fh); +} + +################################################################### +# Layout of Toc, Overview, and Footnotes pages +# By default, we use "normal" layout +# T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined +# use: local $T2H_BUTTONS = [...] to redefine navigation buttons +sub T2H_DEFAULT_print_Toc +{ + return &$T2H_print_misc(@_); +} +sub T2H_DEFAULT_print_Overview +{ + return &$T2H_print_misc(@_); +} +sub T2H_DEFAULT_print_Footnotes +{ + return &$T2H_print_misc(@_); +} +sub T2H_DEFAULT_print_About +{ + return &$T2H_print_misc(@_); +} + +sub T2H_DEFAULT_print_misc_header +{ + &$T2H_print_page_head(@_) if $T2H_SPLIT; + # this needs to be called, otherwise, no labels are set + t2h_print_label(@_); + &$T2H_print_head_navigation(@_); +} +sub T2H_DEFAULT_print_misc_footer +{ + &$T2H_print_foot_navigation(@_); + &$T2H_print_page_foot(@_) if $T2H_SPLIT; +} +sub T2H_DEFAULT_print_misc +{ + my $fh = shift; + local $T2H_BUTTONS = \@T2H_MISC_BUTTONS; + &$T2H_print_misc_header($fh); + print $fh "

$T2H_NAME{This}

\n"; + t2h_print_lines($fh); + &$T2H_print_misc_footer($fh); +} + +################################################################### +# chapter_header and chapter_footer are only called if +# T2H_SPLIT eq 'chapter' +# chapter_header: after print_page_header, before print_section +# chapter_footer: after print_section of last section, before print_page_footer +# +# If you want to get rid of navigation stuff after each section, +# redefine print_section such that it does not call print_navigation, +# and put print_navigation into print_chapter_header +@T2H_CHAPTER_BUTTONS = + ( + 'FastBack', 'FastForward', ' ', + ' ', ' ', ' ', ' ', + 'Top', 'Contents', 'Index', 'About', + ); + +sub T2H_DEFAULT_print_chapter_header +{ + # nothing to do there, by default + if (! $T2H_SECTION_NAVIGATION) + { + my $fh = shift; + local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS; + &$T2H_print_navigation($fh); + print $fh "\n
\n"; + } +} + +sub T2H_DEFAULT_print_chapter_footer +{ + local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS; + &$T2H_print_navigation(@_); +} +################################################################### +$T2H_TODAY = &pretty_date; # like "20 September 1993" + +sub pretty_date { + local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); + + ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); + $year += ($year < 70) ? 2000 : 1900; + # obachman: Let's do it as the Americans do + return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year); +} + + +################################################################### +# Layout of standard header and footer +# + +# Set the default body text, inserted between +###$T2H_BODYTEXT = 'LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"'; +$T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"'; +# text inserted after +$T2H_AFTER_BODY_OPEN = ''; +#text inserted before +$T2H_PRE_BODY_CLOSE = ''; +# this is used in footer +$T2H_ADDRESS = "by $T2H_USER " if $T2H_USER; +$T2H_ADDRESS .= "on $T2H_TODAY"; +# this is added inside after and some META NAME stuff +# can be used for <style> <script>, <meta> tags +$T2H_EXTRA_HEAD = ''; + +sub T2H_DEFAULT_print_page_head +{ + my $fh = shift; + my $longtitle = "$T2H_THISDOC{title}: $T2H_NAME{This}"; + print $fh <<EOT; +<HTML> +$T2H_DOCTYPE +<!-- Created on $T2H_TODAY by $THISPROG --> +<!-- +$T2H_AUTHORS +--> +<HEAD> +<TITLE>$longtitle + + + + + + +$T2H_EXTRA_HEAD + + + +$T2H_AFTER_BODY_OPEN +EOT +} + +sub T2H_DEFAULT_print_page_foot +{ + my $fh = shift; + print $fh < + +This document was generated +$T2H_ADDRESS +using texi2html +$T2H_PRE_BODY_CLOSE + + +EOT +} + +################################################################### +# Layout of navigation panel + +# if this is set, then a vertical navigation panel is used +$T2H_VERTICAL_HEAD_NAVIGATION = 0; +sub T2H_DEFAULT_print_head_navigation +{ + my $fh = shift; + if ($T2H_VERTICAL_HEAD_NAVIGATION) + { + print $fh < + + +EOT + } + &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION); + if ($T2H_VERTICAL_HEAD_NAVIGATION) + { + print $fh < + +EOT + } + elsif ($T2H_SPLIT eq 'section') + { + print $fh "
\n"; + } +} + +# Specifies the minimum page length required before a navigation panel +# is placed at the bottom of a page (the default is that of latex2html) +# T2H_THIS_WORDS_IN_PAGE holds number of words of current page +$T2H_WORDS_IN_PAGE = 300; +sub T2H_DEFAULT_print_foot_navigation +{ + my $fh = shift; + my $nwords = shift; + if ($T2H_VERTICAL_HEAD_NAVIGATION) + { + print $fh < + + +EOT + } + print $fh "
\n"; + &$T2H_print_navigation($fh) if ($nwords >= $T2H_WORDS_IN_PAGE) +} + +###################################################################### +# navigation panel +# +# specify in this array which "buttons" should appear in which order +# in the navigation panel for sections; use ' ' for empty buttons (space) +@T2H_SECTION_BUTTONS = + ( + 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward', + ' ', ' ', ' ', ' ', + 'Top', 'Contents', 'Index', 'About', + ); + +# buttons for misc stuff +@T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About'); + +# insert here name of icon images for buttons +# Icons are used, if $T2H_ICONS and resp. value are set +%T2H_ACTIVE_ICONS = + ( + 'Top', '', + 'Contents', '', + 'Overview', '', + 'Index', '', + 'Back', '', + 'FastBack', '', + 'Prev', '', + 'Up', '', + 'Next', '', + 'Forward', '', + 'FastForward', '', + 'About' , '', + 'First', '', + 'Last', '', + ' ', '' + ); + +# insert here name of icon images for these, if button is inactive +%T2H_PASSIVE_ICONS = + ( + 'Top', '', + 'Contents', '', + 'Overview', '', + 'Index', '', + 'Back', '', + 'FastBack', '', + 'Prev', '', + 'Up', '', + 'Next', '', + 'Forward', '', + 'FastForward', '', + 'About', '', + 'First', '', + 'Last', '', + ); + +# how to create IMG tag +sub T2H_DEFAULT_button_icon_img +{ + my $button = shift; + my $icon = shift; + my $name = shift; + return qq{$button: $name}; +} + +# Names of text as alternative for icons +%T2H_NAVIGATION_TEXT = + ( + 'Top', 'Top', + 'Contents', 'Contents', + 'Overview', 'Overview', + 'Index', 'Index', + ' ', '   ', + 'Back', ' < ', + 'FastBack', ' << ', + 'Prev', 'Prev', + 'Up', ' Up ', + 'Next', 'Next', + 'Forward', ' > ', + 'FastForward', ' >> ', + 'About', ' ? ', + 'First', ' |< ', + 'Last', ' >| ' + ); + +sub T2H_DEFAULT_print_navigation +{ + my $fh = shift; + my $vertical = shift; + my $spacing = 1; + print $fh "\n"; + + print $fh "" unless $vertical; + for $button (@$T2H_BUTTONS) + { + print $fh qq{\n} if $vertical; + print $fh qq{\n"; + print $fh "\n" if $vertical; + } + print $fh "" unless $vertical; + print $fh "
}; + + if (ref($button) eq 'CODE') + { + &$button($fh, $vertical); + } + elsif ($button eq ' ') + { # handle space button + print $fh + $T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ? + &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) : + $T2H_NAVIGATION_TEXT{' '}; + next; + } + elsif ($T2H_HREF{$button}) + { # button is active + print $fh + $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ? + t2h_anchor('', $T2H_HREF{$button}, # yes + &$T2H_button_icon_img($button, + $T2H_ACTIVE_ICONS{$button}, + $T2H_NAME{$button})) + : # use text + "[" . + t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) . + "]"; + } + else + { # button is passive + print $fh + $T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ? + &$T2H_button_icon_img($button, + $T2H_PASSIVE_ICONS{$button}, + $T2H_NAME{$button}) : + + "[" . $T2H_NAVIGATION_TEXT{$button} . "]"; + } + print $fh "
\n"; +} + +###################################################################### +# Frames: this is from "Richard Y. Kim" +# Should be improved to be more conforming to other _print* functions + +sub T2H_DEFAULT_print_frame +{ + my $fh = shift; + print $fh < +$T2H_THISDOC{title} + + + + + +EOT +} + +sub T2H_DEFAULT_print_toc_frame +{ + my $fh = shift; + &$T2H_print_page_head($fh); + print $fh <Content +EOT + print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines; + print $fh "\n"; +} + +###################################################################### +# About page +# + +# T2H_PRE_ABOUT might be a function +$T2H_PRE_ABOUT = <texi2html +

+EOT +$T2H_AFTER_ABOUT = ''; + +sub T2H_DEFAULT_about_body +{ + my $about; + if (ref($T2H_PRE_ABOUT) eq 'CODE') + { + $about = &$T2H_PRE_ABOUT(); + } + else + { + $about = $T2H_PRE_ABOUT; + } + $about .= <

+ + + + + + + +EOT + + for $button (@T2H_SECTION_BUTTONS) + { + next if $button eq ' ' || ref($button) eq 'CODE'; + $about .= < + + + + +EOT + } + + $about .= < +

+where the Example assumes that the current position +is at Subsubsection One-Two-Three of a document of +the following structure: +
    +
  • 1. Section One
  • +
      +
    • 1.1 Subsection One-One
    • +
        +
      • ...
      • +
      +
    • 1.2 Subsection One-Two
    • +
        +
      • 1.2.1 Subsubsection One-Two-One +
      • 1.2.2 Subsubsection One-Two-Two +
      • 1.2.3 Subsubsection One-Two-Three     +<== Current Position +
      • 1.2.4 Subsubsection One-Two-Four +
      +
    • 1.3 Subsection One-Three
    • +
        +
      • ...
      • +
      +
    • 1.4 Subsection One-Four
    • +
    +
+$T2H_AFTER_ABOUT +EOT + return $about; +} + + +%T2H_BUTTONS_GOTO = + ( + 'Top', 'cover (top) of document', + 'Contents', 'table of contents', + 'Overview', 'short table of contents', + 'Index', 'concept index', + 'Back', 'previous section in reading order', + 'FastBack', 'previous or up-and-previous section ', + 'Prev', 'previous section same level', + 'Up', 'up section', + 'Next', 'next section same level', + 'Forward', 'next section in reading order', + 'FastForward', 'next or up-and-next section', + 'About' , 'this page', + 'First', 'first section in reading order', + 'Last', 'last section in reading order', + ); + +%T2H_BUTTONS_EXAMPLE = +( + 'Top', '   ', + 'Contents', '   ', + 'Overview', '   ', + 'Index', '   ', + 'Back', '1.2.2', + 'FastBack', '1.1', + 'Prev', '1.2.2', + 'Up', '1.2', + 'Next', '1.2.4', + 'Forward', '1.2.4', + 'FastForward', '1.3', + 'About', '   ', + 'First', '1.', + 'Last', '1.2.4', +); + + +###################################################################### +# from here on, its l2h init stuff +# + +## initialization for latex2html as for Singular manual generation +## obachman 3/99 + +# +# Options controlling Titles, File-Names, Tracing and Sectioning +# +$TITLE = ''; + +$SHORTEXTN = 0; + +$LONG_TITLES = 0; + +$DESTDIR = ''; # should be overwritten by cmd-line argument + +$NO_SUBDIR = 0;# should be overwritten by cmd-line argument + +$PREFIX = ''; # should be overwritten by cmd-line argument + +$AUTO_PREFIX = 0; # this is needed, so that prefix settings are used + +$AUTO_LINK = 0; + +$SPLIT = 0; + +$MAX_LINK_DEPTH = 0; + +$TMP = ''; # should be overwritten by cmd-line argument + +$DEBUG = 0; + +$VERBOSE = 1; + +# +# Options controlling Extensions and Special Features +# +$HTML_VERSION = "3.2"; + +$TEXDEFS = 1; # we absolutely need that + +$EXTERNAL_FILE = ''; + +$SCALABLE_FONTS = 1; + +$NO_SIMPLE_MATH = 1; + +$LOCAL_ICONS = 1; + +$SHORT_INDEX = 0; + +$NO_FOOTNODE = 1; + +$ADDRESS = ''; + +$INFO = ''; + +# +# Switches controlling Image Generation +# +$ASCII_MODE = 0; + +$NOLATEX = 0; + +$EXTERNAL_IMAGES = 0; + +$PS_IMAGES = 0; + +$NO_IMAGES = 0; + +$IMAGES_ONLY = 0; + +$REUSE = 2; + +$ANTI_ALIAS = 1; + +$ANTI_ALIAS_TEXT = 1; + +# +#Switches controlling Navigation Panels +# +$NO_NAVIGATION = 1; +$ADDRESS = ''; +$INFO = 0; # 0 = do not make a "About this document..." section + +# +#Switches for Linking to other documents +# +# actuall -- we don't care + +$MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth + +$MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth + +$NOLATEX = 0; # 1 = do not pass unknown environments to Latex + +$EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document + +$ASCII_MODE = 0; # 1 = do not use any icons or internal images + +# 1 = use links to external postscript images rather than inlined bitmap +# images. +$PS_IMAGES = 0; +$SHOW_SECTION_NUMBERS = 0; + +### Other global variables ############################################### +$CHILDLINE = ""; + +# This is the line width measured in pixels and it is used to right justify +# equations and equation arrays; +$LINE_WIDTH = 500; + +# Used in conjunction with AUTO_NAVIGATION +$WORDS_IN_PAGE = 300; + +# Affects ONLY the way accents are processed +$default_language = 'english'; + +# The value of this variable determines how many words to use in each +# title that is added to the navigation panel (see below) +# +$WORDS_IN_NAVIGATION_PANEL_TITLES = 0; + +# This number will determine the size of the equations, special characters, +# and anything which will be converted into an inlined image +# *except* "image generating environments" such as "figure", "table" +# or "minipage". +# Effective values are those greater than 0. +# Sensible values are between 0.1 - 4. +$MATH_SCALE_FACTOR = 1.5; + +# This number will determine the size of +# image generating environments such as "figure", "table" or "minipage". +# Effective values are those greater than 0. +# Sensible values are between 0.1 - 4. +$FIGURE_SCALE_FACTOR = 1.6; + + +# If both of the following two variables are set then the "Up" button +# of the navigation panel in the first node/page of a converted document +# will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set +# to some text which describes this external link. +$EXTERNAL_UP_LINK = ""; +$EXTERNAL_UP_TITLE = ""; + +# If this is set then the resulting HTML will look marginally better if viewed +# with Netscape. +$NETSCAPE_HTML = 1; + +# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0" +# Paper sizes has no effect other than in the time it takes to create inlined +# images and in whether large images can be created at all ie +# - larger paper sizes *MAY* help with large image problems +# - smaller paper sizes are quicker to handle +$PAPERSIZE = "a4"; + +# Replace "english" with another language in order to tell LaTeX2HTML that you +# want some generated section titles (eg "Table of Contents" or "References") +# to appear in a different language. Currently only "english" and "french" +# is supported but it is very easy to add your own. See the example in the +# file "latex2html.config" +$TITLES_LANGUAGE = "english"; + +1; # This must be the last non-comment line + +# End File texi2html.init +###################################################################### + + +require "$ENV{T2H_HOME}/texi2html.init" + if ($0 =~ /\.pl$/ && + -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); + +#+++############################################################################ +# # +# Initialization # +# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing # +# # +#---############################################################################ + +# leave this within comments, and keep the require statement +# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init +# exists. + +# +package Getopt::MySimple; + +# Name: +# Getopt::MySimple. +# +# Documentation: +# POD-style (incomplete) documentation is in file MySimple.pod +# +# Tabs: +# 4 spaces || die. +# +# Author: +# Ron Savage rpsavage@ozemail.com.au. +# 1.00 19-Aug-97 Initial version. +# 1.10 13-Oct-97 Add arrays of switches (eg '=s@'). +# 1.20 3-Dec-97 Add 'Help' on a per-switch basis. +# 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase. +# 1.40 10-Nov-98 Change width of help report. Restructure tests. +# 1-Jul-00 Modifications for Texi2html + +# -------------------------------------------------------------------------- +# Locally modified by obachman (Display type instead of env, order by cmp) +# $Id: MySimple.pm,v 1.1 2000/07/03 08:44:13 obachman Exp $ + +# use strict; +# no strict 'refs'; + +use vars qw(@EXPORT @EXPORT_OK @ISA); +use vars qw($fieldWidth $opt $VERSION); + +use Exporter(); +use Getopt::Long; + +@ISA = qw(Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}. + +# -------------------------------------------------------------------------- + +$fieldWidth = 20; +$VERSION = '1.41'; + +# -------------------------------------------------------------------------- + +sub byOrder +{ + my($self) = @_; + + return uc($a) cmp (uc($b)); +} + +# -------------------------------------------------------------------------- + +sub dumpOptions +{ + my($self) = @_; + + print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n"; + + for (sort byOrder keys(%{$self -> {'opt'} }) ) + { + print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n"; + } + + print "\n"; + +} # End of dumpOptions. + +# -------------------------------------------------------------------------- +# Return: +# 0 -> Error. +# 1 -> Ok. + +sub getOptions +{ + push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0. + push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1. + + my($self, $default, $helpText, $versionText, + $helpThenExit, $versionThenExit, $ignoreCase) = @_; + + $helpThenExit = 1 unless (defined($helpThenExit)); + $versionThenExit = 1 unless (defined($versionThenExit)); + $ignoreCase = 0 unless (defined($ignoreCase)); + + $self -> {'default'} = $default; + $self -> {'helpText'} = $helpText; + $self -> {'versionText'} = $versionText; + $Getopt::Long::ignorecase = $ignoreCase; + + unless (defined($self -> {'default'}{'help'})) + { + $self -> {'default'}{'help'} = + { + type => ':i', + default => '', + linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;}, + verbose => "print help and exit" + }; + } + + unless (defined($self -> {'default'}{'version'})) + { + $self -> {'default'}{'version'} = + { + type => '', + default => '', + linkage => sub {print $self->{'versionText'}; exit (0) if versionTheExit;}, + verbose => "print version and exit" + }; + } + + for (keys(%{$self -> {'default'} }) ) + { + my $type = ${$self -> {'default'} }{$_}{'type'}; + push(@{$self -> {'type'} }, "$_$type"); + $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'} + if ${$self -> {'default'} }{$_}{'linkage'}; + } + + my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} }); + + return $result unless $result; + + for (keys(%{$self -> {'default'} }) ) + { + if (! defined(${$self -> {'opt'} }{$_})) #{ + { + ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'}; + } + } + + $result; +} # End of getOptions. + +# -------------------------------------------------------------------------- + +sub helpOptions +{ + my($self) = shift; + my($noHelp) = shift; + $noHelp = 0 unless $noHelp; + my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) + = (10, 5, 9, 78, 4, 11); + + print "$self->{'helpText'}" if ($self -> {'helpText'}); + + print ' Option', ' ' x ($optwidth - length('Option') -1 ), + 'Type', ' ' x ($typewidth - length('Type') + 1), + 'Default', ' ' x ($defaultwidth - length('Default') ), + "Description\n"; + + for (sort byOrder keys(%{$self -> {'default'} }) ) + { + my($line, $help, $option, $val); + $option = $_; + next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp; + $line = " -$_ " . ' ' x ($optwidth - (2 + length) ) . + "${$self->{'default'} }{$_}{'type'} ". + ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) )); + + $val = ${$self->{'default'} }{$_}{'linkage'}; + if ($val) + { + if (ref($val) eq 'SCALAR') + { + $val = $$val; + } + else + { + $val = ''; + } + } + else + { + $val = ${$self->{'default'} }{$_}{'default'}; + } + $line .= "$val "; + $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line)); + + if (defined(${$self -> {'default'} }{$_}{'verbose'}) && + ${$self -> {'default'} }{$_}{'verbose'} ne '') + { + $help = "${$self->{'default'} }{$_}{'verbose'}"; + } + else + { + $help = ' '; + } + if ((length("$line") + length($help)) < $maxlinewidth) + { + print $line , $help, "\n"; + } + else + { + print $line, "\n", ' ' x $valind, $help, "\n"; + } + for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}})) + { + print ' ' x ($valind + 2); + print $val, ' ', ' ' x ($valwidth - length($val) - 2); + print ${$self->{'default'}}{$option}{'values'}{$val}, "\n"; + } + } + + print <| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo) + =s | :s mandatory (or, optional) string argument + =i | :i mandatory (or, optional) integer argument +EOT +} # End of helpOptions. + +#------------------------------------------------------------------- + +sub new +{ + my($class) = @_; + my($self) = {}; + $self -> {'default'} = {}; + $self -> {'helpText'} = ''; + $self -> {'opt'} = {}; + $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}. + $self -> {'type'} = (); + + return bless $self, $class; + +} # End of new. + +# -------------------------------------------------------------------------- + +1; + +# End MySimple.pm + +require "$ENV{T2H_HOME}/MySimple.pm" + if ($0 =~ /\.pl$/ && + -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); + +package main; + +#+++############################################################################ +# # +# Constants # +# # +#---############################################################################ + +$DEBUG_TOC = 1; +$DEBUG_INDEX = 2; +$DEBUG_BIB = 4; +$DEBUG_GLOSS = 8; +$DEBUG_DEF = 16; +$DEBUG_HTML = 32; +$DEBUG_USER = 64; +$DEBUG_L2H = 128; + + +$BIBRE = '\[[\w\/-]+\]'; # RE for a bibliography reference +$FILERE = '[\/\w.+-]+'; # RE for a file name +$VARRE = '[^\s\{\}]+'; # RE for a variable name +$NODERE = '[^,:]+'; # RE for a node name +$NODESRE = '[^:]+'; # RE for a list of node names + +$ERROR = "***"; # prefix for errors +$WARN = "**"; # prefix for warnings + + # program home page +$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections + +$CHAPTEREND = "\n"; # to know where a chpater ends +$SECTIONEND = "\n"; # to know where section ends +$TOPEND = "\n"; # to know where top ends + + + +# +# pre-defined indices +# +$index_properties = +{ + 'c' => { name => 'cp'}, + 'f' => { name => 'fn', code => 1}, + 'v' => { name => 'vr', code => 1}, + 'k' => { name => 'ky', code => 1}, + 'p' => { name => 'pg', code => 1}, + 't' => { name => 'tp', code => 1} +}; + + +%predefined_index = ( + 'cp', 'c', + 'fn', 'f', + 'vr', 'v', + 'ky', 'k', + 'pg', 'p', + 'tp', 't', + ); + +# +# valid indices +# +%valid_index = ( + 'c', 1, + 'f', 1, + 'v', 1, + 'k', 1, + 'p', 1, + 't', 1, + ); + +# +# texinfo section names to level +# +%sec2level = ( + 'top', 0, + 'chapter', 1, + 'unnumbered', 1, + 'majorheading', 1, + 'chapheading', 1, + 'appendix', 1, + 'section', 2, + 'unnumberedsec', 2, + 'heading', 2, + 'appendixsec', 2, + 'appendixsection', 2, + 'subsection', 3, + 'unnumberedsubsec', 3, + 'subheading', 3, + 'appendixsubsec', 3, + 'subsubsection', 4, + 'unnumberedsubsubsec', 4, + 'subsubheading', 4, + 'appendixsubsubsec', 4, + ); + +# +# accent map, TeX command to ISO name +# +%accent_map = ( + '"', 'uml', + '~', 'tilde', + '^', 'circ', + '`', 'grave', + '\'', 'acute', + ); + +# +# texinfo "simple things" (@foo) to HTML ones +# +%simple_map = ( + # cf. makeinfo.c + "*", "
", # HTML+ + " ", " ", + "\t", " ", + "-", "­", # soft hyphen + "\n", "\n", + "|", "", + 'tab', '<\/TD>
Button Name Go to From 1.2.3 go to
+EOT + $about .= + ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? + &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) : + " [" . $T2H_NAVIGATION_TEXT{$button} . "] "); + $about .= < + +$button + +$T2H_BUTTONS_GOTO{$button} + +$T2H_BUTTONS_EXAMPLE{$button} +
', + # spacing commands + ":", "", + "!", "!", + "?", "?", + ".", ".", + "-", "", + ); + +# +# texinfo "things" (@foo{}) to HTML ones +# +%things_map = ( + 'TeX', 'TeX', + 'br', '

', # paragraph break + 'bullet', '*', + 'copyright', '(C)', + 'dots', '...<\/small>', + 'enddots', '....<\/small>', + 'equiv', '==', + 'error', 'error-->', + 'expansion', '==>', + 'minus', '-', + 'point', '-!-', + 'print', '-|', + 'result', '=>', + 'today', $T2H_TODAY, + 'aa', 'å', + 'AA', 'Å', + 'ae', 'æ', + 'oe', 'œ', + 'AE', 'Æ', + 'OE', 'Œ', + 'o', 'ø', + 'O', 'Ø', + 'ss', 'ß', + 'l', '\/l', + 'L', '\/L', + 'exclamdown', '¡', + 'questiondown', '¿', + 'pounds', '£' + ); + +# +# texinfo styles (@foo{bar}) to HTML ones +# +%style_map = ( + 'acronym', '&do_acronym', + 'asis', '', + 'b', 'B', + 'cite', 'CITE', + 'code', 'CODE', + 'command', 'CODE', + 'ctrl', '&do_ctrl', # special case + 'dfn', 'EM', # DFN tag is illegal in the standard + 'dmn', '', # useless + 'email', '&do_email', # insert a clickable email address + 'emph', 'EM', + 'env', 'CODE', + 'file', '"TT', # will put quotes, cf. &apply_style + 'i', 'I', + 'kbd', 'KBD', + 'key', 'KBD', + 'math', '&do_math', + 'option', '"SAMP', # will put quotes, cf. &apply_style + 'r', '', # unsupported + 'samp', '"SAMP', # will put quotes, cf. &apply_style + 'sc', '&do_sc', # special case + 'strong', 'STRONG', + 't', 'TT', + 'titlefont', '', # useless + 'uref', '&do_uref', # insert a clickable URL + 'url', '&do_url', # insert a clickable URL + 'var', 'VAR', + 'w', '', # unsupported + 'H', '&do_accent', + 'dotaccent', '&do_accent', + 'ringaccent','&do_accent', + 'tieaccent', '&do_accent', + 'u','&do_accent', + 'ubaraccent','&do_accent', + 'udotaccent','&do_accent', + 'v', '&do_accent', + ',', '&do_accent', + 'dotless', '&do_accent' + ); + +# +# texinfo format (@foo/@end foo) to HTML ones +# +%format_map = ( + 'quotation', 'BLOCKQUOTE', + # lists + 'itemize', 'UL', + 'enumerate', 'OL', + # poorly supported + 'flushleft', 'PRE', + 'flushright', 'PRE', + ); + +# +# an eval of these $complex_format_map->{what}->[0] yields beginning +# an eval of these $complex_format_map->{what}->[1] yieleds end +$complex_format_map = +{ + example => + [ + q{"$T2H_EXAMPLE_INDENT_CELL
"},
+  q{'
'} + ], + smallexample => + [ + q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
"},
+  q{'
'} + ], + display => + [ + q{"$T2H_EXAMPLE_INDENT_CELL
'},
+  q{'
'} + ], + smalldisplay => + [ + q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
'},
+  q{'
'} + ] +}; + +$complex_format_map->{lisp} = $complex_format_map->{example}; +$complex_format_map->{smalllisp} = $complex_format_map->{smallexample}; +$complex_format_map->{format} = $complex_format_map->{display}; +$complex_format_map->{smallformat} = $complex_format_map->{smalldisplay}; + +# +# texinfo definition shortcuts to real ones +# +%def_map = ( + # basic commands + 'deffn', 0, + 'defvr', 0, + 'deftypefn', 0, + 'deftypevr', 0, + 'defcv', 0, + 'defop', 0, + 'deftp', 0, + # basic x commands + 'deffnx', 0, + 'defvrx', 0, + 'deftypefnx', 0, + 'deftypevrx', 0, + 'defcvx', 0, + 'defopx', 0, + 'deftpx', 0, + # shortcuts + 'defun', 'deffn Function', + 'defmac', 'deffn Macro', + 'defspec', 'deffn {Special Form}', + 'defvar', 'defvr Variable', + 'defopt', 'defvr {User Option}', + 'deftypefun', 'deftypefn Function', + 'deftypevar', 'deftypevr Variable', + 'defivar', 'defcv {Instance Variable}', + 'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME + 'defmethod', 'defop Method', + 'deftypemethod', 'defop Method', # NEW:FIXME + # x shortcuts + 'defunx', 'deffnx Function', + 'defmacx', 'deffnx Macro', + 'defspecx', 'deffnx {Special Form}', + 'defvarx', 'defvrx Variable', + 'defoptx', 'defvrx {User Option}', + 'deftypefunx', 'deftypefnx Function', + 'deftypevarx', 'deftypevrx Variable', + 'defivarx', 'defcvx {Instance Variable}', + 'defmethodx', 'defopx Method', + ); + +# +# things to skip +# +%to_skip = ( + # comments + 'c', 1, + 'comment', 1, + 'ifnotinfo', 1, + 'ifnottex', 1, + 'ifhtml', 1, + 'end ifhtml', 1, + 'end ifnotinfo', 1, + 'end ifnottex', 1, + # useless + 'detailmenu', 1, + 'direntry', 1, + 'contents', 1, + 'shortcontents', 1, + 'summarycontents', 1, + 'footnotestyle', 1, + 'end ifclear', 1, + 'end ifset', 1, + 'titlepage', 1, + 'end titlepage', 1, + # unsupported commands (formatting) + 'afourpaper', 1, + 'cropmarks', 1, + 'finalout', 1, + 'headings', 1, + 'sp', 1, + 'need', 1, + 'page', 1, + 'setchapternewpage', 1, + 'everyheading', 1, + 'everyfooting', 1, + 'evenheading', 1, + 'evenfooting', 1, + 'oddheading', 1, + 'oddfooting', 1, + 'smallbook', 1, + 'vskip', 1, + 'filbreak', 1, + 'paragraphindent', 1, + # unsupported formats + 'cartouche', 1, + 'end cartouche', 1, + 'group', 1, + 'end group', 1, + ); + +#+++############################################################################ +# # +# Argument parsing, initialisation # +# # +#---############################################################################ + +# +# flush stdout and stderr after every write +# +select(STDERR); +$| = 1; +select(STDOUT); +$| = 1; + + +%value = (); # hold texinfo variables, see also -D +$use_bibliography = 1; +$use_acc = 1; + +# +# called on -init-file +sub LoadInitFile +{ + my $init_file = shift; + # second argument is value of options + $init_file = shift; + if (-f $init_file) + { + print "# reading initialization file from $init_file\n" + if ($T2H_VERBOSE); + require($init_file); + } + else + { + print "$ERROR Error: can't read init file $int_file\n"; + $init_file = ''; + } +} + +# +# called on -lang +sub SetDocumentLanguage +{ + my $lang = shift; + if (! exists($T2H_WORDS->{$lang})) + { + warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" . + ($T2H_LANG ? T2H_LANG : "en") . "'\n"; + } + else + { + print "# using '$lang' as document language\n" if ($T2H_VERBOSE); + $T2H_LANG = $lang; + } +} + +## +## obsolete cmd line options +## +$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} = +{ + type => '!', + linkage => sub {$main::T2H_SECTION_NAVIGATION = 0;}, + verbose => 'obsolete, use -nosec_nav', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {use_acc} = +{ + type => '!', + linkage => \$use_acc, + verbose => 'obsolete', + noHelp => 2 +}; +$T2H_OBSOLETE_OPTIONS -> {expandinfo} = +{ + type => '!', + linkage => sub {$main::T2H_EXPAND = 'info';}, + verbose => 'obsolete, use "-expand info" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {expandtex} = +{ + type => '!', + linkage => sub {$main::T2H_EXPAND = 'tex';}, + verbose => 'obsolete, use "-expand tex" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {monolithic} = +{ + type => '!', + linkage => sub {$main::T2H_SPLIT = '';}, + verbose => 'obsolete, use "-split no" instead', + noHelp => 2 +}; +$T2H_OBSOLETE_OPTIONS -> {split_node} = +{ + type => '!', + linkage => sub{$main::T2H_SPLIT = 'section';}, + verbose => 'obsolete, use "-split section" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {split_chapter} = +{ + type => '!', + linkage => sub{$main::T2H_SPLIT = 'chapter';}, + verbose => 'obsolete, use "-split chapter" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {no_verbose} = +{ + type => '!', + linkage => sub {$main::T2H_VERBOSE = 0;}, + verbose => 'obsolete, use -noverbose instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {output_file} = +{ + type => '=s', + linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';}, + verbose => 'obsolete, use -out_file instead', + noHelp => 2 +}; + +$T2H_OBSOLETE_OPTIONS -> {section_navigation} = +{ + type => '!', + linkage => \$T2H_SECTION_NAVIGATION, + verbose => 'obsolete, use -sec_nav instead', + noHelp => 2, +}; + +$T2H_OBSOLETE_OPTIONS -> {verbose} = +{ + type => '!', + linkage => \$T2H_VERBOSE, + verbose => 'obsolete, use -Verbose instead', + noHelp => 2 +}; + +# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc +my $home = $ENV{HOME}; +defined($home) or $home = ''; +foreach $i ('/usr/local/etc/texi2htmlrc', "$home/.texi2htmlrc") { + if (-f $i) { + print "# reading initialization file from $i\n" + if ($T2H_VERBOSE); + require($i); + } +} + + +#+++############################################################################ +# # +# parse command-line options +# # +#---############################################################################ +$T2H_USAGE_TEXT = <getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) +{ + print $Configure_failed if $Configure_failed; + die $T2H_FAILURE_TEXT; +} + +if (@ARGV > 1) +{ + eval {Getopt::Long::Configure("no_pass_through");}; + if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) + { + print $Configure_failed if $Configure_failed; + die $T2H_FAILURE_TEXT; + } +} + +if ($T2H_CHECK) { + die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0; + ✓ + exit; +} + +#+++############################################################################ +# # +# evaluation of cmd line options +# # +#---############################################################################ + +if ($T2H_EXPAND eq 'info') +{ + $to_skip{'ifinfo'} = 1; + $to_skip{'end ifinfo'} = 1; +} +elsif ($T2H_EXPAND eq 'tex') +{ + $to_skip{'iftex'} = 1; + $to_skip{'end iftex'} = 1; + +} + +$T2H_INVISIBLE_MARK = '' if $T2H_INVISIBLE_MARK eq 'xbm'; + +# +# file name buisness +# +die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1; +$docu = shift(@ARGV); +if ($docu =~ /.*\//) { + chop($docu_dir = $&); + $docu_name = $'; +} else { + $docu_dir = '.'; + $docu_name = $docu; +} +unshift(@T2H_INCLUDE_DIRS, $docu_dir); +$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document +$docu_name = $T2H_PREFIX if ($T2H_PREFIX); + +# subdir +if ($T2H_SUBDIR && ! $T2H_OUT) +{ + $T2H_SUBDIR =~ s|/*$||; + unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR") + { + if ( mkdir($T2H_SUBDIR, oct(755))) + { + print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE); + } + else + { + warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n"; + $T2H_SUBDIR = ''; + } + } +} + +if ($T2H_SUBDIR && ! $T2H_OUT) +{ + $docu_rdir = "$T2H_SUBDIR/"; + print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); +} +else +{ + if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|) + { + $docu_rdir = "$1/"; + print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); + } + else + { + print "# putting result files into current directory \n" if ($T2H_VERBOSE); + $docu_rdir = ''; + } +} + +# extension +if ($T2H_SHORTEXTN) +{ + $docu_ext = "htm"; +} +else +{ + $docu_ext = "html"; +} +if ($T2H_TOP_FILE =~ /\..*$/) +{ + $T2H_TOP_FILE = $`.".$docu_ext"; +} + +# result files +if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i)) +{ + $T2H_SPLIT = 'section'; +} +elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i) +{ + $T2H_SPLIT = 'chapter' +} +else +{ + undef $T2H_SPLIT; +} + +$docu_doc = "$docu_name.$docu_ext"; # document's contents +$docu_doc_file = "$docu_rdir$docu_doc"; +if ($T2H_SPLIT) +{ + $docu_toc = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents + $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc + $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes + $docu_about = "${docu_name}_abt.$docu_ext"; # about this document + $docu_top = $T2H_TOP_FILE || $docu_doc; +} +else +{ + if ($T2H_OUT) + { + $docu_doc = $T2H_OUT; + $docu_doc =~ s|.*/||; + } + $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc; +} + +$docu_toc_file = "$docu_rdir$docu_toc"; +$docu_stoc_file = "$docu_rdir$docu_stoc"; +$docu_foot_file = "$docu_rdir$docu_foot"; +$docu_about_file = "$docu_rdir$docu_about"; +$docu_top_file = "$docu_rdir$docu_top"; + +$docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext"; +$docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext"; + +# +# variables +# +$value{'html'} = 1; # predefine html (the output format) +$value{'texi2html'} = $THISVERSION; # predefine texi2html (the translator) +# _foo: internal to track @foo +foreach ('_author', '_title', '_subtitle', + '_settitle', '_setfilename', '_shorttitle') { + $value{$_} = ''; # prevent -w warnings +} +%node2sec = (); # node to section name +%sec2node = (); # section to node name +%sec2number = (); # section to number +%number2sec = (); # number to section +%idx2node = (); # index keys to node +%node2href = (); # node to HREF +%node2next = (); # node to next +%node2prev = (); # node to prev +%node2up = (); # node to up +%bib2href = (); # bibliography reference to HREF +%gloss2href = (); # glossary term to HREF +@sections = (); # list of sections +%tag2pro = (); # protected sections + +# +# initial indexes +# +$bib_num = 0; +$foot_num = 0; +$gloss_num = 0; +$idx_num = 0; +$sec_num = 0; +$doc_num = 0; +$html_num = 0; + +# +# can I use ISO8879 characters? (HTML+) +# +if ($T2H_USE_ISO) { + $things_map{'bullet'} = "•"; + $things_map{'copyright'} = "©"; + $things_map{'dots'} = "…"; + $things_map{'equiv'} = "≡"; + $things_map{'expansion'} = "→"; + $things_map{'point'} = "∗"; + $things_map{'result'} = "⇒"; +} + +# +# read texi2html extensions (if any) +# +$extensions = 'texi2html.ext'; # extensions in working directory +if (-f $extensions) { + print "# reading extensions from $extensions\n" if $T2H_VERBOSE; + require($extensions); +} +($progdir = $0) =~ s/[^\/]+$//; +if ($progdir && ($progdir ne './')) { + $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory + if (-f $extensions) { + print "# reading extensions from $extensions\n" if $T2H_VERBOSE; + require($extensions); + } +} + + +print "# reading from $docu\n" if $T2H_VERBOSE; + +######################################################################### +# +# latex2html stuff +# +# latex2html conversions consist of three stages: +# 1) ToLatex: Put "latex" code into a latex file +# 2) ToHtml: Use latex2html to generate corresponding html code and images +# 3) FromHtml: Extract generated code and images from latex2html run +# + +########################## +# default settings +# + +# defaults for files and names + +sub l2h_Init +{ + local($root) = @_; + + return 0 unless ($root); + + $l2h_name = "${root}_l2h"; + + $l2h_latex_file = "$docu_rdir${l2h_name}.tex"; + $l2h_cache_file = "${docu_rdir}l2h_cache.pm"; + $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H); + + # destination dir -- generated images are put there, should be the same + # as dir of enclosing html document -- + $l2h_html_file = "$docu_rdir${l2h_name}.html"; + $l2h_prefix = "${l2h_name}_"; + return 1; +} + + +########################## +# +# First stage: Generation of Latex file +# Initialize with: l2h_InitToLatex +# Add content with: l2h_ToLatex($text) --> HTML placeholder comment +# Finish with: l2h_FinishToLatex +# + +$l2h_latex_preample = <$l2h_latex_file")) + { + warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n"; + return 0; + } + print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE); + print L2H_LATEX $l2h_latex_preample; + } + # open database for caching + l2h_InitCache(); + $l2h_latex_count = 0; + $l2h_to_latex_count = 0; + $l2h_cached_count = 0; + return 1; +} + +# print text (1st arg) into latex file (if not already there), return +# HTML commentary which can be later on replaced by the latex2html +# generated text +sub l2h_ToLatex +{ + my($text) = @_; + my($count); + + $l2h_to_latex_count++; + $text =~ s/(\s*)$//; + + # try whether we can cache it + my $cached_text = l2h_FromCache($text); + if ($cached_text) + { + $l2h_cached_count++; + return $cached_text; + } + + # try whether we have text already on things to do + unless ($count = $l2h_to_latex{$text}) + { + $count = $l2h_latex_count; + $l2h_latex_count++; + $l2h_to_latex{$text} = $count; + $l2h_to_latex[$count] = $text; + unless ($T2H_L2H_SKIP) + { + print L2H_LATEX "\\begin{rawhtml}\n"; + print L2H_LATEX "\n"; + print L2H_LATEX "\\end{rawhtml}\n"; + + print L2H_LATEX "$text\n"; + + print L2H_LATEX "\\begin{rawhtml}\n"; + print L2H_LATEX "\n"; + print L2H_LATEX "\\end{rawhtml}\n"; + } + } + return ""; +} + +# print closing into latex file and close it +sub l2h_FinishToLatex +{ + local ($reused); + + $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count; + unless ($T2H_L2H_SKIP) + { + print L2H_LATEX $l2h_latex_closing; + close(L2H_LATEX); + } + print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE); + unless ($l2h_latex_count) + { + l2h_Finish(); + return 0; + } + return 1; +} + +################################### +# Second stage: Use latex2html to generate corresponding html code and images +# +# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]): +# Call latex2html on $l2h_latex_file +# Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir +# Return 1, on success +# 0, otherwise +# +sub l2h_ToHtml +{ + local($call, $ext, $root, $dotbug); + + if ($T2H_L2H_SKIP) + { + print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE); + return 1; + } + + # Check for dot in directory where dvips will work + if ($T2H_L2H_TMP) + { + if ($T2H_L2H_TMP =~ /\./) + { + warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n"; + $dotbug = 1; + } + } + else + { + if (&getcwd =~ /\./) + { + warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n"; + $dotbug = 1; + } + } + # fix it, if necessary and hope that it works + $T2H_L2H_TMP = "/tmp" if ($dotbug); + + $call = $T2H_L2H_L2H; + # use init file, if specified + $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file); + # set output dir + $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir"); + # use l2h_tmp, if specified + $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP); + # options we want to be sure of + $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link"; + $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; + + print "# l2h: executing '$call'\n" if ($T2H_VERBOSE); + if (system($call)) + { + warn "l2h ***Error: '${call}' did not succeed\n"; + return 0; + } + else + { + print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE); + return 1; + } +} + +# this is directly pasted over from latex2html +sub getcwd { + local($_) = `pwd`; + + die "'pwd' failed (out of memory?)\n" + unless length; + chop; + $_; +} + + +########################## +# Third stage: Extract generated contents from latex2html run +# Initialize with: l2h_InitFromHtml +# open $l2h_html_file for reading +# reads in contents into array indexed by numbers +# return 1, on success -- 0, otherwise +# Extract Html code with: l2h_FromHtml($text) +# replaces in $text all previosuly inserted comments by generated html code +# returns (possibly changed) $text +# Finish with: l2h_FinishFromHtml +# closes $l2h_html_dir/$l2h_name.".$docu_ext" + +sub l2h_InitFromHtml +{ + local($h_line, $h_content, $count, %l2h_img); + + if (! open(L2H_HTML, "<${l2h_html_file}")) + { + print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n"; + return 0; + } + print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE); + + $l2h_html_count = 0; + + while ($h_line = ) + { + if ($h_line =~ /^/) + { + $count = $1; + $h_content = ""; + while ($h_line = ) + { + if ($h_line =~ /^/) + { + chomp $h_content; + chomp $h_content; + $l2h_html_count++; + $h_content = l2h_ToCache($count, $h_content); + $l2h_from_html[$count] = $h_content; + $h_content = ''; + last; + } + $h_content = $h_content.$h_line; + } + if ($hcontent) + { + print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" + if ($T2H_VERBOSE); + close(L2H_HTML); + return 0; + } + } + } + print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n" + if ($T2H_VERBOSE); + + close(L2H_HTML); + return 1; +} + +sub l2h_FromHtml +{ + local($text) = @_; + local($done, $to_do, $count); + + $to_do = $text; + + while ($to_do =~ /([^\000]*)([^\000]*)/) + { + $to_do = $1; + $count = $2; + $done = $3.$done; + + $done = "".$done + if ($T2H_DEBUG & $DEBUG_L2H); + + $done = &l2h_ExtractFromHtml($count) . $done; + + $done = "".$done + if ($T2H_DEBUG & $DEBUG_L2H); + } + return $to_do.$done; +} + + +sub l2h_ExtractFromHtml +{ + local($count) = @_; + + return $l2h_from_html[$count] if ($l2h_from_html[$count]); + + if ($count >= 0 && $count < $l2h_latex_count) + { + # now we are in trouble + local($l_l2h, $_); + + $l2h_extract_error++; + print "$ERROR l2h: can't extract content $count from html\n" + if ($T2H_VERBOSE); + # try simple (ordinary) substition (without l2h) + $l_l2h = $T2H_L2H; + $T2H_L2H = 0; + $_ = $l2h_to_latex{$count}; + $_ = &substitute_style($_); + &unprotect_texi; + $_ = "" . $_ + if ($T2H_DEBUG & $DEBUG_L2H); + $T2H_L2H = $l_l2h; + return $_; + } + else + { + # now we have been incorrectly called + $l2h_range_error++; + print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n"; + return "" + if ($T2H_DEBUG & $DEBUG_L2H); + return ""; + } +} + +sub l2h_FinishFromHtml +{ + if ($T2H_VERBOSE) + { + if ($l2h_extract_error + $l2h_range_error) + { + print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n"; + } + else + { + print "# l2h: finished from html (no errors)\n"; + } + } +} + +sub l2h_Finish +{ + l2h_StoreCache(); + if ($T2H_L2H_CLEAN) + { + print "# l2h: removing temporary files generated by l2h extension\n" + if $T2H_VERBOSE; + while (<"$docu_rdir$l2h_name"*>) + { + unlink $_; + } + } + print "# l2h: Finished\n" if $T2H_VERBOSE; + return 1; +} + +############################## +# stuff for l2h caching +# + +# I tried doing this with a dbm data base, but it did not store all +# keys/values. Hence, I did as latex2html does it +sub l2h_InitCache +{ + if (-r "$l2h_cache_file") + { + my $rdo = do "$l2h_cache_file"; + warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n") + unless ($rdo); + } +} + +sub l2h_StoreCache +{ + return unless $l2h_latex_count; + + my ($key, $value); + open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n"; + + + while (($key, $value) = each %l2h_cache) + { + # escape stuff + $key =~ s|/|\\/|g; + $key =~ s|\\\\/|\\/|g; + # weird, a \ at the end of the key results in an error + # maybe this also broke the dbm database stuff + $key =~ s|\\$|\\\\|; + $value =~ s/\|/\\\|/g; + $value =~ s/\\\\\|/\\\|/g; + $value =~ s|\\\\|\\\\\\\\|g; + print FH "\n\$l2h_cache_key = q/$key/;\n"; + print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n"; + } + print FH "1;"; + close(FH); +} + +# return cached html, if it exists for text, and if all pictures +# are there, as well +sub l2h_FromCache +{ + my $text = shift; + my $cached = $l2h_cache{$text}; + if ($cached) + { + while ($cached =~ m/SRC="(.*?)"/g) + { + unless (-e "$docu_rdir$1") + { + return undef; + } + } + return $cached; + } + return undef; +} + +# insert generated html into cache, move away images, +# return transformed html +$maximage = 1; +sub l2h_ToCache +{ + my $count = shift; + my $content = shift; + my @images = ($content =~ /SRC="(.*?)"/g); + my ($src, $dest); + + for $src (@images) + { + $dest = $l2h_img{$src}; + unless ($dest) + { + my $ext; + if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext) + { + $ext = $1; + } + else + { + warn "$ERROR: L2h image $src has invalid extension\n"; + next; + } + while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++;} + $dest = "${docu_name}_$maximage.$ext"; + system("cp -f $docu_rdir$src $docu_rdir$dest"); + $l2h_img{$src} = $dest; + unlink "$docu_rdir$src" unless ($DEBUG & DEBUG_L2H); + } + $content =~ s/$src/$dest/g; + } + $l2h_cache{$l2h_to_latex[$count]} = $content; + return $content; +} + + +#+++############################################################################ +# # +# Pass 1: read source, handle command, variable, simple substitution # +# # +#---############################################################################ + +@lines = (); # whole document +@toc_lines = (); # table of contents +@stoc_lines = (); # table of contents +$curlevel = 0; # current level in TOC +$node = ''; # current node name +$node_next = ''; # current node next name +$node_prev = ''; # current node prev name +$node_up = ''; # current node up name +$in_table = 0; # am I inside a table +$table_type = ''; # type of table ('', 'f', 'v', 'multi') +@tables = (); # nested table support +$in_bibliography = 0; # am I inside a bibliography +$in_glossary = 0; # am I inside a glossary +$in_top = 0; # am I inside the top node +$has_top = 0; # did I see a top node? +$has_top_command = 0; # did I see @top for automatic pointers? +$in_pre = 0; # am I inside a preformatted section +$in_list = 0; # am I inside a list +$in_html = 0; # am I inside an HTML section +$first_line = 1; # is it the first line +$dont_html = 0; # don't protect HTML on this line +$deferred_ref = ''; # deferred reference for indexes +@html_stack = (); # HTML elements stack +$html_element = ''; # current HTML element +&html_reset; +%macros = (); # macros + +# init l2h +$T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H); +$T2H_L2H = &l2h_InitToLatex if ($T2H_L2H); + +# build code for simple substitutions +# the maps used (%simple_map and %things_map) MUST be aware of this +# watch out for regexps, / and escaped characters! +$subst_code = ''; +foreach (keys(%simple_map)) { + ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars + $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n"; +} +foreach (keys(%things_map)) { + $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n"; +} +if ($use_acc) { + # accentuated characters + foreach (keys(%accent_map)) { + if ($_ eq "`") { + $subst_code .= "s/$;3"; + } elsif ($_ eq "'") { + $subst_code .= "s/$;4"; + } else { + $subst_code .= "s/\\\@\\$_"; + } + $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n"; + } +} +eval("sub simple_substitutions { $subst_code }"); + +&init_input; +INPUT_LINE: while ($_ = &next_line) { + # + # remove \input on the first lines only + # + if ($first_line) { + next if /^\\input/; + $first_line = 0; + } + # non-@ substitutions cf. texinfmt.el + # + # parse texinfo tags + # + $tag = ''; + $end_tag = ''; + if (/^\s*\@end\s+(\w+)\b/) { + $end_tag = $1; + } elsif (/^\s*\@(\w+)\b/) { + $tag = $1; + } + # + # handle @html / @end html + # + if ($in_html) { + if ($end_tag eq 'html') { + $in_html = 0; + } else { + $tag2pro{$in_html} .= $_; + } + next; + } elsif ($tag eq 'html') { + $in_html = $PROTECTTAG . ++$html_num; + push(@lines, $in_html); + next; + } + + # + # try to remove inlined comments + # syntax from tex-mode.el comment-start-skip + # + s/((^|[^\@])(\@\@)*)\@c(omment | |\{|$).*/$1/; + +# Sometimes I use @c right at the end of a line ( to suppress the line feed ) +# s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/; +# s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/; +# s/(.*)\@c{.*?}(.*)/$1$2/; +# s/(.*)\@comment{.*?}(.*)/$1$2/; +# s/^(.*)\@c /$1/; +# s/^(.*)\@comment /$1/; + + ############################################################# + # value substitution before macro expansion, so that + # it works in macro arguments + s/\@value{($VARRE)}/$value{$1}/eg; + + ############################################################# + # macro substitution + while (/\@(\w+)/g) + { + if (exists($macros->{$1})) + { + my $before = $`; + my $name = $1; + my $after = $'; + my @args; + my $args; + if ($after =~ /^\s*{(.*?[^\\])}(.*)/) + { + $args = $1; + $after = $2; + } + elsif (@{$macros->{$name}->{Args}} == 1) + { + $args = $after; + $args =~ s/^\s*//; + $args =~ s/\s*$//; + $after = ''; + } + $args =~ s|\\\\|\\|g; + $args =~ s|\\{|{|g; + $args =~ s|\\}|}|g; + if (@{$macros->{$name}->{Args}} > 1) + { + $args =~ s/(^|[^\\]),/$1$;/g ; + $args =~ s|\\,|,|g; + @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1); + } + else + { + $args =~ s|\\,|,|g; + @args = ($args); + } + my $macrobody = $macros->{$name}->{Body}; + for ($i=0; $i<=$#args; $i++) + { + $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g; + } + $macrobody =~ s|\\\\|\\|g; + $_ = $before . $macrobody . $after; + unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_); + next INPUT_LINE; + } + } # + + + # + # try to skip the line + # + if ($end_tag) { + $in_titlepage = 0 if $end_tag eq 'titlepage'; + next if $to_skip{"end $end_tag"}; + } elsif ($tag) { + $in_titlepage = 1 if $tag eq 'titlepage'; + next if $to_skip{$tag}; + last if $tag eq 'bye'; + } + if ($in_top) { + # parsing the top node + if ($tag eq 'node' || + ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/)) + { + # no more in top + $in_top = 0; + push(@lines, $TOPEND); + } + } + unless ($in_pre) { + s/``/\"/g; + s/''/\"/g; + s/([\w ])---([\w ])/$1--$2/g; + } + # + # analyze the tag + # + if ($tag) { + # skip lines + &skip_until($tag), next if $tag eq 'ignore'; + &skip_until($tag), next if $tag eq 'ifnothtml'; + if ($tag eq 'ifinfo') + { + &skip_until($tag), next unless $T2H_EXPAND eq 'info'; + } + if ($tag eq 'iftex') + { + &skip_until($tag), next unless $T2H_EXPAND eq 'tex'; + } + if ($tag eq 'tex') + { + # add to latex2html file + if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre) + { + # add space to the end -- tex(i2dvi) does this, as well + push(@lines, &l2h_ToLatex(&string_until($tag) . " ")); + } + else + { + &skip_until($tag); + } + next; + } + if ($tag eq 'titlepage') + { + next; + } + # handle special tables + if ($tag =~ /^(|f|v|multi)table$/) { + $table_type = $1; + $tag = 'table'; + } + # special cases + if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) { + $in_top = 1; + $has_top = 1; + $has_top_command = 1 if $tag eq 'top'; + @lines = (); # ignore all lines before top (title page garbage) + next; + } elsif ($tag eq 'node') { + if ($in_top) + { + $in_top = 0; + push(@lines, $TOPEND); + } + warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o; + # request of "Richard Y. Kim" + s/^\@node\s+//; + $_ = &protect_html($_); # if node contains '&' for instance + ($node, $node_next, $node_prev, $node_up) = split(/,/); + &normalise_node($node); + &normalise_node($node_next); + &normalise_node($node_prev); + &normalise_node($node_up); + $node =~ /\"/ ? + push @lines, &html_debug("\n", __LINE__) : + push @lines, &html_debug("\n", __LINE__); + next; + } elsif ($tag eq 'include') { + if (/^\@include\s+($FILERE)\s*$/o) { + $file = LocateIncludeFile($1); + if ($file && -e $file) { + &open($file); + print "# including $file\n" if $T2H_VERBOSE; + } else { + warn "$ERROR Can't find $1, skipping"; + } + } else { + warn "$ERROR Bad include line: $_"; + } + next; + } elsif ($tag eq 'ifclear') { + if (/^\@ifclear\s+($VARRE)\s*$/o) { + next unless defined($value{$1}); + &skip_until($tag); + } else { + warn "$ERROR Bad ifclear line: $_"; + } + next; + } elsif ($tag eq 'ifset') { + if (/^\@ifset\s+($VARRE)\s*$/o) { + next if defined($value{$1}); + &skip_until($tag); + } else { + warn "$ERROR Bad ifset line: $_"; + } + next; + } elsif ($tag eq 'menu') { + unless ($T2H_SHOW_MENU) { + &skip_until($tag); + next; + } + &html_push_if($tag); + push(@lines, &html_debug('', __LINE__)); + } elsif ($format_map{$tag}) { + $in_pre = 1 if $format_map{$tag} eq 'PRE'; + &html_push_if($format_map{$tag}); + push(@lines, &html_debug('', __LINE__)); + $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ; +# push(@lines, &debug("

\n", __LINE__)) +# if $tag =~ /example/i; + # sunshine@sunshineco.com:
bla
looks better than + #
\nbla
(at least on NeXTstep browser + push(@lines, &debug("<$format_map{$tag}>" . + ($in_pre ? '' : "\n"), __LINE__)); + next; + } + elsif (exists $complex_format_map->{$tag}) + { + my $start = eval $complex_format_map->{$tag}->[0]; + if ($@) + { + print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@"; + $start = '
'
+	  }
+	  $in_pre = 1 if $start =~ /
\n", __LINE__));
+		    &html_push_if('TABLE');
+		} else {
+		    push(@lines, &debug("
\n", __LINE__)); + &html_push_if('DL'); + } + push(@lines, &html_debug('', __LINE__)); + } else { + warn "$ERROR Bad table line: $_"; + } + next; + } + elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') + { + if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/) + { + my $from = $1; + my $to = $2; + my $prefix_from = IndexName2Prefix($from); + my $prefix_to = IndexName2Prefix($to); + + warn("$ERROR unknown from index name $from ind syn*index line: $_"), next + unless $prefix_from; + warn("$ERROR unknown to index name $to ind syn*index line: $_"), next + unless $prefix_to; + + if ($tag eq 'syncodeindex') + { + $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1; + } + else + { + $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1; + } + } + else + { + warn "$ERROR Bad syn*index line: $_"; + } + next; + } + elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') + { + if (/^\@$tag\s+(\w+)\s*$/) + { + my $name = $1; + $index_properties->{$name}->{name} = $name; + $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex'; + } + else + { + warn "$ERROR Bad defindex line: $_"; + } + next; + } + elsif (/^\@printindex/) + { + push (@lines, "$_"); + next; + } + elsif ($tag eq 'sp') { + push(@lines, &debug("

\n", __LINE__)); + next; + } elsif ($tag eq 'center') { + push(@lines, &debug("

\n", __LINE__)); + s/\@center//; + } elsif ($tag eq 'setref') { + &protect_html; # if setref contains '&' for instance + if (/^\@$tag\s*{($NODERE)}\s*$/) { + $setref = $1; + $setref =~ s/\s+/ /g; # normalize + $setref =~ s/ $//; + $node2sec{$setref} = $name; + $sec2node{$name} = $setref; + $node2href{$setref} = "$docu_doc#$docid"; + } else { + warn "$ERROR Bad setref line: $_"; + } + next; + } elsif ($tag eq 'lowersections') { + local ($sec, $level); + while (($sec, $level) = each %sec2level) { + $sec2level{$sec} = $level + 1; + } + next; + } elsif ($tag eq 'raisesections') { + local ($sec, $level); + while (($sec, $level) = each %sec2level) { + $sec2level{$sec} = $level - 1; + } + next; + } + elsif ($tag eq 'macro' || $tag eq 'rmacro') + { + if (/^\@$tag\s*(\w+)\s*(.*)/) + { + my $name = $1; + my @args; + @args = split(/\s*,\s*/ , $1) + if ($2 =~ /^\s*{(.*)}\s*/); + + $macros->{$name}->{Args} = \@args; + $macros->{$name}->{Body} = ''; + while (($_ = &next_line) && $_ !~ /\@end $tag/) + { + $macros->{$name}->{Body} .= $_; + } + die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n" + unless (/\@end $tag/); + chomp $macros->{$name}->{Body}; + } + else + { + warn "$ERROR: Bad macro defintion $_" + } + next; + } + elsif ($tag eq 'unmacro') + { + delete $macros->{$1} if (/^\@unmacro\s*(\w+)/); + next; + } + elsif ($tag eq 'documentlanguage') + { + SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/); + } + elsif (defined($def_map{$tag})) { + if ($def_map{$tag}) { + s/^\@$tag\s+//; + $tag = $def_map{$tag}; + $_ = "\@$tag $_"; + $tag =~ s/\s.*//; + } + } elsif (defined($user_sub{$tag})) { + s/^\@$tag\s+//; + $sub = $user_sub{$tag}; + print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER; + if (defined(&$sub)) { + chop($_); + &$sub($_); + } else { + warn "$ERROR Bad user sub for $tag: $sub\n"; + } + next; + } + if (defined($def_map{$tag})) { + s/^\@$tag\s+//; + if ($tag =~ /x$/) { + # extra definition line + $tag = $`; + $is_extra = 1; + } else { + $is_extra = 0; + } + while (/\{([^\{\}]*)\}/) { + # this is a {} construct + ($before, $contents, $after) = ($`, $1, $'); + # protect spaces + $contents =~ s/\s+/$;9/g; + # restore $_ protecting {} + $_ = "$before$;7$contents$;8$after"; + } + @args = split(/\s+/, &protect_html($_)); + foreach (@args) { + s/$;9/ /g; # unprotect spaces + s/$;7/\{/g; # ... { + s/$;8/\}/g; # ... } + } + $type = shift(@args); + $type =~ s/^\{(.*)\}$/$1/; + print "# def ($tag): {$type} ", join(', ', @args), "\n" + if $T2H_DEBUG & $DEBUG_DEF; + $type .= ':'; # it's nicer like this + my $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + if ($is_extra) { + $_ = &debug("
", __LINE__); + } else { + $_ = &debug("
\n
", __LINE__); + } + if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') { + $_ .= "$type $name"; + $_ .= " @args" if @args; + } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr' + || $tag eq 'defcv' || $tag eq 'defop') { + $ftype = $name; + $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + $_ .= "$type $ftype $name"; + $_ .= " @args" if @args; + } else { + warn "$ERROR Unknown definition type: $tag\n"; + $_ .= "$type $name"; + $_ .= " @args" if @args; + } + $_ .= &debug("\n
", __LINE__); + $name = &unprotect_html($name); + if ($tag eq 'deffn' || $tag eq 'deftypefn') { + EnterIndexEntry('f', $name, $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@findex $name\n"); + } elsif ($tag eq 'defop') { + EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@findex $name on $ftype\n"); + } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') { + EnterIndexEntry('v', $name, $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@vindex $name\n"); + } else { + EnterIndexEntry('t', $name, $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@tindex $name\n"); + } + $dont_html = 1; + } + } elsif ($end_tag) { + if ($format_map{$end_tag}) { + $in_pre = 0 if $format_map{$end_tag} eq 'PRE'; + $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ; + &html_pop_if('P'); + &html_pop_if('LI'); + &html_pop_if(); + push(@lines, &debug("\n", __LINE__)); + push(@lines, &html_debug('', __LINE__)); + } + elsif (exists $complex_format_map->{$end_tag}) + { + my $end = eval $complex_format_map->{$end_tag}->[1]; + if ($@) + { + print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@"; + $end = '
' + } + $in_pre = 0 if $end =~ m|
|; + push(@lines, html_debug($end, __LINE__)); + } elsif ($end_tag =~ /^(|f|v|multi)table$/) { + unless (@tables) { + warn "$ERROR \@end $end_tag without \@*table\n"; + next; + } + &html_pop_if('P'); + ($table_type, $in_table) = split($;, shift(@tables)); + unless ($1 eq $table_type) { + warn "$ERROR \@end $end_tag without matching \@$end_tag\n"; + next; + } + if ($table_type eq "multi") { + push(@lines, "
\n"); + &html_pop_if('TR'); + } else { + push(@lines, "\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("\n", __LINE__)); + } elsif ($end_tag eq 'menu') { + &html_pop_if(); + push(@lines, $_); # must keep it for pass 2 + } + next; + } + ############################################################# + # anchor insertion + while (/\@anchor\s*\{(.*?)\}/) + { + $_ = $`.$'; + my $anchor = $1; + $anchor = &normalise_node($anchor); + push @lines, &html_debug("\n"); + $node2href{$anchor} = "$docu_doc#$anchor"; + next INPUT_LINE if $_ =~ /^\s*$/; + } + + ############################################################# + # index entry generation, after value substitutions + if (/^\@(\w+?)index\s+/) + { + EnterIndexEntry($1, $', $docu_doc, $section, \@lines); + next; + } + # + # protect texi and HTML things + &protect_texi; + $_ = &protect_html($_) unless $dont_html; + $dont_html = 0; + # substitution (unsupported things) + s/^\@exdent\s+//g; + s/\@noindent\s+//g; + s/\@refill\s+//g; + # other substitutions + &simple_substitutions; + s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4 + # + # analyze the tag again + # + if ($tag) { + if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) { + if (/^\@$tag\s+(.+)$/) { + $name = $1; + $name = &normalise_node($name); + $level = $sec2level{$tag}; + # check for index + $first_index_chapter = $node + if ($level == 1 && !$first_index_chapter && + $name =~ /index/i); + if ($in_top && /heading/){ + $T2H_HAS_TOP_HEADING = 1; + $_ = &debug("$name\n", __LINE__); + &html_push_if('body'); + print "# top heading, section $name, level $level\n" + if $T2H_DEBUG & $DEBUG_TOC; + } + else + { + unless (/^\@\w*heading/) + { + unless (/^\@unnumbered/) + { + my $number = &update_sec_num($tag, $level); + $name = $number. ' ' . $name if $T2H_NUMBER_SECTIONS; + $sec2number{$name} = $number; + $number2sec{$number} = $name; + } + if (defined($toplevel)) + { + push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND); + } + else + { + # first time we see a "section" + unless ($level == 1) + { + warn "$WARN The first section found is not of level 1: $_"; + } + $toplevel = $level; + } + push(@sections, $name); + next_doc() if ($T2H_SPLIT eq 'section' || + $T2H_SPLIT && $level == $toplevel); + } + $sec_num++; + $docid = "SEC$sec_num"; + $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num"); + # check biblio and glossary + $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i); + $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i); + # check node + if ($node) + { + warn "$ERROR Duplicate node found: $node\n" + if ($node2sec{$node}); + } + else + { + $name .= ' ' while ($node2sec{$name}); + $node = $name; + } + $name .= ' ' while ($sec2node{$name}); + $section = $name; + $node2sec{$node} = $name; + $sec2node{$name} = $node; + $node2href{$node} = "$docu_doc#$docid"; + $node2next{$node} = $node_next; + $node2prev{$node} = $node_prev; + $node2up{$node} = $node_up; + print "# node $node, section $name, level $level\n" + if $T2H_DEBUG & $DEBUG_TOC; + + $node = ''; + $node_next = ''; + $node_prev = ''; + $node_next = ''; + if ($tocid) + { + # update TOC + while ($level > $curlevel) { + $curlevel++; + push(@toc_lines, "
    \n"); + } + while ($level < $curlevel) { + $curlevel--; + push(@toc_lines, "
\n"); + } + $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1); + $_ = &substitute_style($_); + push(@stoc_lines, "$_
\n") if ($level == 1); + if ($T2H_NUMBER_SECTIONS) + { + push(@toc_lines, $_ . "
\n") + } + else + { + push(@toc_lines, "
  • " . $_ ."
  • "); + } + } + else + { + push(@lines, &html_debug("\n", + __LINE__)); + } + # update DOC + push(@lines, &html_debug('', __LINE__)); + &html_reset; + $_ = " $name \n\n"; + $_ = &debug($_, __LINE__); + push(@lines, &html_debug('', __LINE__)); + } + # update DOC + foreach $line (split(/\n+/, $_)) { + push(@lines, "$line\n"); + } + next; + } else { + warn "$ERROR Bad section line: $_"; + } + } else { + # track variables + $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o; + delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o; + # store things + $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/; + $value{'_setfilename'} = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/; + $value{'_settitle'} = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/; + $value{'_author'} .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/; + $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/; + $value{'_title'} .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/; + + # list item + if (/^\s*\@itemx?\s+/) { + $what = $'; + $what =~ s/\s+$//; + if ($in_bibliography && $use_bibliography) { + if ($what =~ /^$BIBRE$/o) { + $id = 'BIB' . ++$bib_num; + $bib2href{$what} = "$docu_doc#$id"; + print "# found bibliography for '$what' id $id\n" + if $T2H_DEBUG & $DEBUG_BIB; + $what = &t2h_anchor($id, '', $what); + } + } elsif ($in_glossary && $T2H_USE_GLOSSARY) { + $id = 'GLOSS' . ++$gloss_num; + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $gloss2href{$entry} = "$docu_doc#$id"; + print "# found glossary for '$entry' id $id\n" + if $T2H_DEBUG & $DEBUG_GLOSS; + $what = &t2h_anchor($id, '', $what); + } + elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v')) + { + EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines); + } + &html_pop_if('P'); + if ($html_element eq 'DL' || $html_element eq 'DD') { + if ($things_map{$in_table} && !$what) { + # special case to allow @table @bullet for instance + push(@lines, &debug("
    $things_map{$in_table}\n", __LINE__)); + } else { + push(@lines, &debug("
    \@$in_table\{$what\}\n", __LINE__)); + } + push(@lines, "
    "); + &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("$what\n", __LINE__)); + &html_push('TR'); + } elsif ($html_element eq 'TR') { + push(@lines, &debug("\n", __LINE__)); + push(@lines, &debug("$what\n", __LINE__)); + } else { + push(@lines, &debug("
  • $what\n", __LINE__)); + &html_push('LI') unless $html_element eq 'LI'; + } + push(@lines, &html_debug('', __LINE__)); + if ($deferred_ref) { + push(@lines, &debug("$deferred_ref\n", __LINE__)); + $deferred_ref = ''; + } + next; + } elsif (/^\@tab\s+(.*)$/) { + push(@lines, "$1\n"); + next; + } + } + } + # paragraph separator + if ($_ eq "\n" && ! $in_pre) { + next if $#lines >= 0 && $lines[$#lines] eq "\n"; + if ($html_element eq 'P') { + push (@lines, &debug("

    \n", __LINE__)); + } +# else +# { +# push(@lines, "

    \n"); +# $_ = &debug("

    \n", __LINE__); +# } + elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI') + { + &html_push('P'); + push(@lines, &debug("

    \n", __LINE__)); + } + } + # otherwise + push(@lines, $_) unless $in_titlepage; + push(@lines, &debug("

  • \n", __LINE__)) if ($tag eq 'center'); +} + +# finish TOC +$level = 0; +while ($level < $curlevel) { + $curlevel--; + push(@toc_lines, "\n"); +} + +print "# end of pass 1\n" if $T2H_VERBOSE; + +SetDocumentLanguage('en') unless ($T2H_LANG); +#+++############################################################################ +# # +# Stuff related to Index generation # +# # +#---############################################################################ + +sub EnterIndexEntry +{ + my $prefix = shift; + my $key = shift; + my $docu_doc = shift; + my $section = shift; + my $lines = shift; + local $_; + + warn "$ERROR Undefined index command: $_", next + unless (exists ($index_properties->{$prefix})); + $key =~ s/\s+$//; + $_ = $key; + &protect_texi; + $key = $_; + $_ = &protect_html($_); + my $html_key = substitute_style($_); + my $id; + $key = remove_style($key); + $key = remove_things($key); + $_ = $key; + &unprotect_texi; + $key = $_; + while (exists $index->{$prefix}->{$key}) {$key .= ' '}; + if ($lines->[$#lines] =~ /^$/) + { + $id = $1; + } + else + { + $id = 'IDX' . ++$idx_num; + push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre)); + } + $index->{$prefix}->{$key}->{html_key} = $html_key; + $index->{$prefix}->{$key}->{section} = $section; + $index->{$prefix}->{$key}->{href} = "$docu_doc#$id"; + print "# found ${prefix}index for '$key' with id $id\n" + if $T2H_DEBUG & $DEBUG_INDEX; +} + +sub IndexName2Prefix +{ + my $name = shift; + my $prefix; + + for $prefix (keys %$index_properties) + { + return $prefix if ($index_properties->{$prefix}->{name} eq $name); + } + return undef; +} + +sub GetIndexEntries +{ + my $normal = shift; + my $code = shift; + my ($entries, $prefix, $key) = ({}); + + for $prefix (keys %$normal) + { + for $key (keys %{$index->{$prefix}}) + { + $entries->{$key} = {%{$index->{$prefix}->{$key}}}; + } + } + + if (defined($code)) + { + for $prefix (keys %$code) + { + unless (exists $normal->{$keys}) + { + for $key (keys %{$index->{$prefix}}) + { + $entries->{$key} = {%{$index->{$prefix}->{$key}}}; + $entries->{$key}->{html_key} = "$entries->{$key}->{html_key}"; + } + } + } + } + return $entries; +} + +sub byAlpha +{ + if ($a =~ /^[A-Za-z]/) + { + if ($b =~ /^[A-Za-z]/) + { + return lc($a) cmp lc($b); + } + else + { + return 1; + } + } + elsif ($b =~ /^[A-Za-z]/) + { + return -1; + } + else + { + return lc($a) cmp lc($b); + } +} + +sub GetIndexPages +{ + my $entries = shift; + my (@Letters, $key); + my ($EntriesByLetter, $Pages, $page) = ({}, [], {}); + my @keys = sort byAlpha keys %$entries; + + for $key (@keys) + { + push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key}; + } + @Letters = sort byAlpha keys %$EntriesByLetter; + + $T2H_SPLIT_INDEX = 0 unless ($T2H_SPLIT); + + unless ($T2H_SPLIT_INDEX) + { + $page->{First} = $Letters[0]; + $page->{Last} = $Letters[$#Letters]; + $page->{Letters} = \@Letters; + $page->{EntriesByLetter} = $EntriesByLetter; + push @$Pages, $page; + return $Pages; + } + + if ($T2H_SPLIT_INDEX =~ /^\d+$/) + { + my $i = 0; + my ($prev_letter, $letter); + $page->{First} = $Letters[0]; + for $letter (@Letters) + { + if ($i > $T2H_SPLIT_INDEX) + { + $page->{Last} = $prev_letter; + push @$Pages, {%$page}; + $page->{Letters} = []; + $page->{EntriesByLetter} = {}; + $page->{First} = $letter; + $i=0; + } + push @{$page->{Letters}}, $letter; + $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}]; + $i += scalar(@{$EntriesByLetter->{$letter}}); + $prev_letter = $letter; + } + $page->{Last} = $Letters[$#Letters]; + push @$Pages, {%$page}; + } + return $Pages; +} + +sub GetIndexSummary +{ + my $first_page = shift; + my $Pages = shift; + my $name = shift; + my ($page, $letter, $summary, $i, $l1, $l2, $l); + + $i = 0; + $summary = '
    Jump to:   '; + + for $page ($first_page, @$Pages) + { + for $letter (@{$page->{Letters}}) + { + $l = t2h_anchor('', "$page->{href}#${name}_$letter", "$letter", + 0, 'style="text-decoration:none"') . "\n   \n"; + + if ($letter =~ /^[A-Za-z]/) + { + $l2 .= $l; + } + else + { + $l1 .= $l; + } + } + } + $summary .= $l1 . "
    \n" if ($l1); + $summary .= $l2 . '

    '; + return $summary; +} + +sub PrintIndexPage +{ + my $lines = shift; + my $summary = shift; + my $page = shift; + my $name = shift; + + push @$lines, $summary; + + push @$lines , <

    + + + +EOT + + for $letter (@{$page->{Letters}}) + { + push @$lines, "\n"; + for $entry (@{$page->{EntriesByLetter}->{$letter}}) + { + push @$lines, + "\n"; + } + push @$lines, "\n"; + } + push @$lines, "
    Index Entry Section

    $letter
    " . + t2h_anchor('', $entry->{href}, $entry->{html_key}) . + "" . + t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) . + "

    "; + push @$lines, $summary; +} + +sub PrintIndex +{ + my $lines = shift; + my $name = shift; + my $section = shift; + $section = 'Top' unless $section; + my $prefix = IndexName2Prefix($name); + + warn ("$ERROR printindex: bad index name: $name"), return + unless $prefix; + + if ($index_properties->{$prefix}->{code}) + { + $index_properties->{$prefix}->{from_code}->{$prefix} = 1; + } + else + { + $index_properties->{$prefix}->{from}->{$prefix}= 1; + } + + my $Entries = GetIndexEntries($index_properties->{$prefix}->{from}, + $index_properties->{$prefix}->{from_code}); + return unless %$Entries; + + if ($T2H_IDX_SUMMARY) + { + my $key; + open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx") + || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n"; + print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE; + + for $key (sort keys %$Entries) + { + print FHIDX "$key\t$Entries->{$key}->{href}\n"; + } + } + + my $Pages = GetIndexPages($Entries); + my $page; + my $first_page = shift @$Pages; + my $sec_name = $section; + # remove section number + $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./; + + ($first_page->{href} = sec_href($section)) =~ s/\#.*$//; + # Update tree structure of document + if (@$Pages) + { + my $sec; + my @after; + + while (@sections && $sections[$#sections] ne $section) + { + unshift @after, pop @sections; + } + + for $page (@$Pages) + { + my $node = ($page->{First} ne $page->{Last} ? + "$sec_name: $page->{First} -- $page->{Last}" : + "$sec_name: $page->{First}"); + push @sections, $node; + $node2sec{$node} = $node; + $sec2node{$node} = $node; + $node2up{$node} = $section; + $page->{href} = next_doc(); + $page->{name} = $node; + $node2href{$node} = $page->{href}; + if ($prev_node) + { + $node2next{$prev_node} = $node; + $node2prev{$node} = $prev_node; + } + $prev_node = $node; + } + push @sections, @after; + } + + my $summary = GetIndexSummary($first_page, $Pages, $name); + PrintIndexPage($lines, $summary, $first_page, $name); + for $page (@$Pages) + { + push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); + push @$lines, "

    $page->{name}

    \n"; + PrintIndexPage($lines, $summary, $page, $name); + } +} + + +#+++############################################################################ +# # +# Pass 2/3: handle style, menu, index, cross-reference # +# # +#---############################################################################ + +@lines2 = (); # whole document (2nd pass) +@lines3 = (); # whole document (3rd pass) +$in_menu = 0; # am I inside a menu + +while (@lines) { + $_ = shift(@lines); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@lines2, $_); + next; + } + # + # menu + # + if (/^\@menu\b/) + { + $in_menu = 1; + $in_menu_listing = 1; + push(@lines2, &debug("
    \n", __LINE__)); + next; + } + if (/^\@end\s+menu\b/) + { + if ($in_menu_listing) + { + push(@lines2, &debug("
    \n", __LINE__)); + } + else + { + push(@lines2, &debug("\n", __LINE__)); + } + $in_menu = 0; + $in_menu_listing = 0; + next; + } + if ($in_menu) + { + my ($node, $name, $descr); + if (/^\*\s+($NODERE)::/o) + { + $node = $1; + $descr = $'; + } + elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) + { + $name = $1; + $node = $2; + $descr = $'; + } + elsif (/^\*/) + { + warn "$ERROR Bad menu line: $_"; + } + else + { + if ($in_menu_listing) + { + $in_menu_listing = 0; + push(@lines2, &debug("\n", __LINE__)); + } + # should be like verbatim -- preseve spaces, etc + s/ /\ /g; + $_ .= "
    \n"; + push(@lines2, $_); + } + if ($node) + { + if (! $in_menu_listing) + { + $in_menu_listing = 1; + push(@lines2, &debug("\n", __LINE__)); + } + # look for continuation + while ($lines[0] =~ /^\s+\w+/) + { + $descr .= shift(@lines); + } + &menu_entry($node, $name, $descr); + } + next; + } + # + # printindex + # + PrintIndex(\@lines2, $2, $1), next + if (/^\@printindex\s+(\w+)/); + # + # simple style substitutions + # + $_ = &substitute_style($_); + # + # xref + # + while (/\@(x|px|info|)ref{([^{}]+)(}?)/) { + # note: Texinfo may accept other characters + ($type, $nodes, $full) = ($1, $2, $3); + ($before, $after) = ($`, $'); + if (! $full && $after) { + warn "$ERROR Bad xref (no ending } on line): $_"; + $_ = "$before$;0${type}ref\{$nodes$after"; + next; # while xref + } + if ($type eq 'x') { + $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} "; + } elsif ($type eq 'px') { + $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} "; + } elsif ($type eq 'info') { + $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info"; + } else { + $type = ''; + } + unless ($full) { + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); # remove final newline + if ($next =~ /\}/) { # split on 2 lines + $nodes .= " $`"; + $after = $'; + } else { + $nodes .= " $next"; + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); + if ($next =~ /\}/) { # split on 3 lines + $nodes .= " $`"; + $after = $'; + } else { + warn "$ERROR Bad xref (no ending }): $_"; + $_ = "$before$;0xref\{$nodes$after"; + unshift(@lines, $next); + next; # while xref + } + } + } + $nodes =~ s/\s+/ /g; # remove useless spaces + @args = split(/\s*,\s*/, $nodes); + $node = $args[0]; # the node is always the first arg + $node = &normalise_node($node); + $sec = $args[2] || $args[1] || $node2sec{$node}; + $href = $node2href{$node}; + if (@args == 5) { # reference to another manual + $sec = $args[2] || $node; + $man = $args[4] || $args[3]; + $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after"; + } elsif ($type =~ /Info/) { # inforef + warn "$ERROR Wrong number of arguments: $_" unless @args == 3; + ($nn, $_, $in) = @args; + $_ = "${before}${type} file `$in', node `$nn'$after"; + } elsif ($sec && $href && ! $T2H_SHORT_REF) { + $_ = "${before}${type}"; + $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if ${type}; + $_ .= &t2h_anchor('', $href, $sec) . $after; + } + elsif ($href) + { + $_ = "${before}${type} " . + &t2h_anchor('', $href, $args[2] || $args[1] || $node) . + $after; + } + else { + warn "$ERROR Undefined node ($node): $_"; + $_ = "$before$;0xref{$nodes}$after"; + } + } + + # replace images + s[\@image\s*{(.+?)}] + { + my @args = split (/\s*,\s*/, $1); + my $base = $args[0]; + my $image = + LocateIncludeFile("$base.png") || + LocateIncludeFile("$base.jpg") || + LocateIncludeFile("$base.gif"); + warn "$ERROR no image file for $base: $_" unless ($image && -e $image); + "\"$base\""; + ($T2H_CENTER_IMAGE ? + "
    \"$base\"
    " : + "\"$base\""); + }eg; + + # + # try to guess bibliography references or glossary terms + # + unless (/^/) { + $done .= $pre . &t2h_anchor('', $href, $what); + } else { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + if ($T2H_USE_GLOSSARY) { + $done = ''; + while (/\b\w+\b/) { + ($pre, $what, $post) = ($`, $&, $'); + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $href = $gloss2href{$entry}; + if (defined($href) && $post !~ /^[^<]*<\/A>/) { + $done .= $pre . &t2h_anchor('', $href, $what); + } else { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + } + # otherwise + push(@lines2, $_); +} +print "# end of pass 2\n" if $T2H_VERBOSE; + +# +# split style substitutions +# +while (@lines2) { + $_ = shift(@lines2); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@lines3, $_); + next; + } + # + # split style substitutions + # + $old = ''; + while ($old ne $_) { + $old = $_; + if (/\@(\w+)\{/) { + ($before, $style, $after) = ($`, $1, $'); + if (defined($style_map{$style})) { + $_ = $after; + $text = ''; + $after = ''; + $failed = 1; + while (@lines2) { + if (/\}/) { + $text .= $`; + $after = $'; + $failed = 0; + last; + } else { + $text .= $_; + $_ = shift(@lines2); + } + } + if ($failed) { + die "* Bad syntax (\@$style) after: $before\n"; + } else { + $text = &apply_style($style, $text); + $_ = "$before$text$after"; + } + } + } + } + # otherwise + push(@lines3, $_); +} +print "# end of pass 3\n" if $T2H_VERBOSE; + +#+++############################################################################ +# # +# Pass 4: foot notes, final cleanup # +# # +#---############################################################################ + +@foot_lines = (); # footnotes +@doc_lines = (); # final document +$end_of_para = 0; # true if last line is

    + +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, "

    " . &t2h_anchor($footid, "$d#$docid", $foot) . "

    \n"); + $text = "

    $text" unless $text =~ /^\s*

    /; + push(@foot_lines, "$text\n"); + $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after; + } + } + # + # remove unnecessary

    + # + if (/^\s*

    \s*$/) { + next if $end_of_para++; + } else { + $end_of_para = 0; + } + # otherwise + push(@doc_lines, $_); +} + +print "# end of pass 4\n" if $T2H_VERBOSE; + +#+++############################################################################ +# # +# Pass 5: print things # +# # +#---############################################################################ + +$T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H); +$T2H_L2H = &l2h_ToHtml if ($T2H_L2H); +$T2H_L2H = &l2h_InitFromHtml if ($T2H_L2H); + +# fix node2up, node2prev, node2next, if desired +if ($has_top_command) +{ + for $section (keys %sec2number) + { + $node = $sec2node{$section}; + $node2up{$node} = Sec2UpNode($section) unless $node2up{$node}; + $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node}; + $node2next{$node} = Sec2NextNode($section) unless $node2next{$node}; + } +} + +# prepare %T2H_THISDOC +$T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document"; +$T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle}; +$T2H_THISDOC{author} = $value{'_author'}; +$T2H_THISDOC{subtitle} = $value{'_subtitle'}; +$T2H_THISDOC{shorttitle} = $value{'_shorttitle'}; +for $key (keys %T2H_THISDOC) +{ + $_ = &substitute_style($T2H_THISDOC{$key}); + &unprotect_texi; + s/\s*$//; + $T2H_THISDOC{$key} = $_; +} + +# if no sections, then simply print document as is +unless (@sections) +{ + print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE; + open(FILE, "> $docu_top_file") + || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; + + &$T2H_print_page_head(\*FILE); + $T2H_THIS_SECTION = \@doc_lines; + t2h_print_lines(\*FILE); + &$T2H_print_foot_navigation(\*FILE); + &$T2H_print_page_foot(\*FILE); + close(FILE); + goto Finish; +} + +# initialize $T2H_HREF, $T2H_NAME +%T2H_HREF = + ( + 'First' , sec_href($sections[0]), + 'Last', sec_href($sections[$#sections]), + 'About', $docu_about. '#SEC_About', + ); + +# prepare TOC, OVERVIEW, TOP +$T2H_TOC = \@toc_lines; +$T2H_OVERVIEW = \@stoc_lines; +if ($has_top) +{ + while (1) + { + $_ = shift @doc_lines; + last if /$TOPEND/; + push @$T2H_TOP, $_; + } + $T2H_HREF{'Top'} = $docu_top . '#SEC_Top'; +} +else +{ + $T2H_HREF{'Top'} = $T2H_HREF{First}; +} + +$node2href{Top} = $T2H_HREF{Top}; +$T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines; +$T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines; + +# settle on index +if ($T2H_INDEX_CHAPTER) +{ + $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)}; + warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n" + unless $T2H_HREF{Index}; +} +if (! $T2H_HREF{Index} && $first_index_chapter) +{ + $T2H_INDEX_CHAPTER = $first_index_chapter; + $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER}; +} + +print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n" + if ($T2H_VERBOSE && $T2H_HREF{Index}); + +%T2H_NAME = + ( + 'First', clean_name($sec2node{$sections[0]}), + 'Last', clean_name($sec2node{$sections[$#sections]}), + 'About', $T2H_WORDS->{$T2H_LANG}->{'About_Title'}, + 'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'}, + 'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'}, + 'Index' , clean_name($T2H_INDEX_CHAPTER), + 'Top', clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}), + ); + +############################################################################# +# print frame and frame toc file +# +if ( $T2H_FRAMES ) +{ + open(FILE, "> $docu_frame_file") + || die "$ERROR: Can't open $docu_frame_file for writing: $!\n"; + print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE; + &$T2H_print_frame(\*FILE); + close(FILE); + + open(FILE, "> $docu_toc_frame_file") + || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n"; + print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE; + &$T2H_print_toc_frame(\*FILE); + close(FILE); +} + + +############################################################################# +# print Top +# +open(FILE, "> $docu_top_file") + || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; +&$T2H_print_page_head(\*FILE) unless ($T2H_SPLIT); + +if ($has_top) +{ + print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE; + $T2H_THIS_SECTION = $T2H_TOP; + $T2H_HREF{This} = $T2H_HREF{Top}; + $T2H_NAME{This} = $T2H_NAME{Top}; + &$T2H_print_Top(\*FILE); +} + +close(FILE) if $T2H_SPLIT; + +############################################################################# +# Print sections +# +$T2H_NODE{Forward} = $sec2node{$sections[0]}; +$T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]}); +$T2H_HREF{Forward} = sec_href($sections[0]); +$T2H_NODE{This} = 'Top'; +$T2H_NAME{This} = $T2H_NAME{Top}; +$T2H_HREF{This} = $T2H_HREF{Top}; +if ($T2H_SPLIT) +{ + print "# writing " . scalar(@sections) . + " sections in $docu_rdir$docu_name"."_[1..$doc_num]" + if $T2H_VERBOSE; + $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); + undef $FH; + $doc_num = 0; +} +else +{ + print "# writing " . scalar(@sections) . " sections in $docu_top_file ..." + if $T2H_VERBOSE; + $FH = \*FILE; + $previous = ''; +} + +$counter = 0; +# loop through sections +while ($section = shift(@sections)) +{ + if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND)) + { + if ($FH) + { + #close previous page + &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; + &$T2H_print_page_foot($FH); + close($FH); + undef $FH; + } + } + $T2H_NAME{Back} = $T2H_NAME{This}; + $T2H_HREF{Back} = $T2H_HREF{This}; + $T2H_NODE{Back} = $T2H_NODE{This}; + $T2H_NAME{This} = $T2H_NAME{Forward}; + $T2H_HREF{This} = $T2H_HREF{Forward}; + $T2H_NODE{This} = $T2H_NODE{Forward}; + if ($sections[0]) + { + $T2H_NODE{Forward} = $sec2node{$sections[0]}; + $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward}); + $T2H_HREF{Forward} = sec_href($sections[0]); + } + else + { + undef $T2H_HREF{Forward}, $T2H_NODE{Forward}, $T2H_NAME{Forward}; + } + + $node = $node2up{$T2H_NODE{This}}; + $T2H_HREF{Up} = $node2href{$node}; + if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up}) + { + $T2H_NAME{Up} = $T2H_NAME{Top}; + $T2H_HREF{Up} = $T2H_HREF{Top}; + $T2H_NODE{Up} = 'Up'; + } + else + { + $T2H_NAME{Up} = &clean_name($node); + $T2H_NODE{Up} = $node; + } + + $node = $T2H_NODE{This}; + $node = $node2prev{$node}; + $T2H_NAME{Prev} = &clean_name($node); + $T2H_HREF{Prev} = $node2href{$node}; + $T2H_NODE{Prev} = $node; + + $node = $T2H_NODE{This}; + if ($node2up{$node} && $node2up{$node} ne 'Top'&& + ($node2prev{$node} eq $T2H_NODE{Back} || ! $node2prev{$node})) + { + $node = $node2up{$node}; + while ($node && $node ne $node2up{$node} && ! $node2prev{$node}) + { + $node = $node2up{$node}; + } + $node = $node2prev{$node} + unless $node2up{$node} eq 'Top' || ! $node2up{$node}; + } + else + { + $node = $node2prev{$node}; + } + $T2H_NAME{FastBack} = &clean_name($node); + $T2H_HREF{FastBack} = $node2href{$node}; + $T2H_NODE{FastBack} = $node; + + $node = $T2H_NODE{This}; + $node = $node2next{$node}; + $T2H_NAME{Next} = &clean_name($node); + $T2H_HREF{Next} = $node2href{$node}; + $T2H_NODE{Next} = $node; + + $node = $T2H_NODE{This}; + if ($node2up{$node} && $node2up{$node} ne 'Top'&& + ($node2next{$node} eq $T2H_NODE{Forward} || ! $node2next{$node})) + { + $node = $node2up{$node}; + while ($node && $node ne $node2up{$node} && ! $node2next{$node}) + { + $node = $node2up{$node}; + } + } + $node = $node2next{$node}; + $T2H_NAME{FastForward} = &clean_name($node); + $T2H_HREF{FastForward} = $node2href{$node}; + $T2H_NODE{FastForward} = $node; + + if (! defined($FH)) + { + my $file = $T2H_HREF{This}; + $file =~ s/\#.*$//; + open(FILE, "> $docu_rdir$file") || + die "$ERROR: Can't open $docu_rdir$file for writing: $!\n"; + $FH = \*FILE; + &$T2H_print_page_head($FH); + t2h_print_label($FH); + &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter'; + } + else + { + t2h_print_label($FH); + } + + $T2H_THIS_SECTION = []; + while (@doc_lines) { + $_ = shift(@doc_lines); + last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND); + push(@$T2H_THIS_SECTION, $_); + } + $previous = $_; + &$T2H_print_section($FH); + + if ($T2H_VERBOSE) + { + $counter++; + print "." if $counter =~ /00$/; + } +} +if ($T2H_SPLIT) +{ + &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; + &$T2H_print_page_foot($FH); + close($FH); +} +print "\n" if $T2H_VERBOSE; + +############################################################################# +# Print ToC, Overview, Footnotes +# +undef $T2H_HREF{Prev}; +undef $T2H_HREF{Next}; +undef $T2H_HREF{Back}; +undef $T2H_HREF{Forward}; +undef $T2H_HREF{Up}; + +if (@foot_lines) +{ + print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n" + if $T2H_SPLIT; + $T2H_HREF{This} = $docu_foot; + $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'}; + $T2H_THIS_SECTION = \@foot_lines; + &$T2H_print_Footnotes(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +if (@toc_lines) +{ + print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n" + if $T2H_SPLIT; + $T2H_HREF{This} = $T2H_HREF{Contents}; + $T2H_NAME{This} = $T2H_NAME{Contents}; + $T2H_THIS_SECTION = \@toc_lines; + &$T2H_print_Toc(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +if (@stoc_lines) +{ + print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n" + if $T2H_SPLIT; + + $T2H_HREF{This} = $T2H_HREF{Overview}; + $T2H_NAME{This} = $T2H_NAME{Overview}; + $T2H_THIS_SECTION = \@stoc_lines; + unshift @$T2H_THIS_SECTION, "

    \n"; + push @$T2H_THIS_SECTION, "\n
    \n"; + &$T2H_print_Overview(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +if ($about_body = &$T2H_about_body()) +{ + print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n" + if $T2H_SPLIT; + + $T2H_HREF{This} = $T2H_HREF{About}; + $T2H_NAME{This} = $T2H_NAME{About}; + $T2H_THIS_SECTION = [$about_body]; + &$T2H_print_About(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +unless ($T2H_SPLIT) +{ + &$T2H_print_page_foot(\*FILE); + close (FILE); +} + +Finish: +&l2h_FinishFromHtml if ($T2H_L2H); +&l2h_Finish if($T2H_L2H); +print "# that's all folks\n" if $T2H_VERBOSE; + +exit(0); + +#+++############################################################################ +# # +# Low level functions # +# # +#---############################################################################ + +sub LocateIncludeFile +{ + my $file = shift; + my $dir; + + return $file if (-e $file && -r $file); + foreach $dir (@T2H_INCLUDE_DIRS) + { + return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file"); + } + return undef; +} + +sub clean_name +{ + local ($_); + $_ = &remove_style($_[0]); + &unprotect_texi; + return $_; +} + +sub update_sec_num { + local($name, $level) = @_; + my $ret; + + $level--; # here we start at 0 + if ($name =~ /^appendix/ || defined(@appendix_sec_num)) { + # appendix style + if (defined(@appendix_sec_num)) { + &incr_sec_num($level, @appendix_sec_num); + } else { + @appendix_sec_num = ('A', 0, 0, 0); + } + $ret = join('.', @appendix_sec_num[0..$level]); + } else { + # normal style + if (defined(@normal_sec_num)) + { + &incr_sec_num($level, @normal_sec_num); + } + else + { + @normal_sec_num = (1, 0, 0, 0); + } + $ret = join('.', @normal_sec_num[0..$level]); + } + + $ret .= "." if $level == 0; + return $ret; +} + +sub incr_sec_num { + local($level, $l); + $level = shift(@_); + $_[$level]++; + foreach $l ($level+1 .. 3) { + $_[$l] = 0; + } +} + +sub Sec2UpNode +{ + my $sec = shift; + my $num = $sec2number{$sec}; + + return '' unless $num; + return 'Top' unless $num =~ /\.\d+/; + $num =~ s/\.[^\.]*$//; + $num = $num . '.' unless $num =~ /\./; + return $sec2node{$number2sec{$num}}; +} + +sub Sec2PrevNode +{ + my $sec = shift; + my $num = $sec2number{$sec}; + my ($i, $post); + + if ($num =~ /(\w+)(\.$|$)/) + { + $num = $`; + $i = $1; + $post = $2; + if ($i eq 'A') + { + $i = $normal_sec_num[0]; + } + elsif ($i ne '1') + { + # unfortunately, -- operator is not magical + $i = chr(ord($i) + 1); + } + else + { + return ''; + } + return $sec2node{$number2sec{$num . $i . $post}} + } + return ''; +} + +sub Sec2NextNode +{ + my $sec = shift; + my $num = $sec2number{$sec}; + my $i; + + if ($num =~ /(\w+)(\.$|$)/) + { + $num = $`; + $i = $1; + $post = $2; + if ($post eq '.' && $i eq $normal_sec_num[0]) + { + $i = 'A'; + } + else + { + $i++; + } + return $sec2node{$number2sec{$num . $i . $post}} + } + return ''; +} + +sub check { + local($_, %seen, %context, $before, $match, $after); + + while (<>) { + if (/\@(\*|\.|\:|\@|\{|\})/) { + $seen{$&}++; + $context{$&} .= "> $_" if $T2H_VERBOSE; + $_ = "$`XX$'"; + redo; + } + if (/\@(\w+)/) { + ($before, $match, $after) = ($`, $&, $'); + if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address + $seen{'e-mail address'}++; + $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE; + } else { + $seen{$match}++; + $context{$match} .= "> $_" if $T2H_VERBOSE; + } + $match =~ s/^\@/X/; + $_ = "$before$match$after"; + redo; + } + } + + foreach (sort(keys(%seen))) { + if ($T2H_VERBOSE) { + print "$_\n"; + print $context{$_}; + } else { + print "$_ ($seen{$_})\n"; + } + } +} + +sub open { + local($name) = @_; + + ++$fh_name; + if (open($fh_name, $name)) { + unshift(@fhs, $fh_name); + } else { + warn "$ERROR Can't read file $name: $!\n"; + } +} + +sub init_input { + @fhs = (); # hold the file handles to read + @input_spool = (); # spooled lines to read + $fh_name = 'FH000'; + &open($docu); +} + +sub next_line { + local($fh, $line); + + if (@input_spool) { + $line = shift(@input_spool); + return($line); + } + while (@fhs) { + $fh = $fhs[0]; + $line = <$fh>; + return($line) if $line; + close($fh); + shift(@fhs); + } + return(undef); +} + +# used in pass 1, use &next_line +sub skip_until { + local($tag) = @_; + local($_); + + while ($_ = &next_line) { + return if /^\@end\s+$tag\s*$/; + } + die "* Failed to find '$tag' after: " . $lines[$#lines]; +} + +# used in pass 1 for l2h use &next_line +sub string_until { + local($tag) = @_; + local($_, $string); + + while ($_ = &next_line) { + return $string if /^\@end\s+$tag\s*$/; +# $_ =~ s/hbox/mbox/g; + $string = $string.$_; + } + die "* Failed to find '$tag' after: " . $lines[$#lines]; +} + +# +# HTML stacking to have a better HTML output +# + +sub html_reset { + @html_stack = ('html'); + $html_element = 'body'; +} + +sub html_push { + local($what) = @_; + push(@html_stack, $html_element); + $html_element = $what; +} + +sub html_push_if { + local($what) = @_; + push(@html_stack, $html_element) + if ($html_element && $html_element ne 'P'); + $html_element = $what; +} + +sub html_pop { + $html_element = pop(@html_stack); +} + +sub html_pop_if { + local($elt); + + if (@_) { + foreach $elt (@_) { + if ($elt eq $html_element) { + $html_element = pop(@html_stack) if @html_stack; + last; + } + } + } else { + $html_element = pop(@html_stack) if @html_stack; + } +} + +sub html_debug { + local($what, $line) = @_; + if ($T2H_DEBUG & $DEBUG_HTML) + { + $what = "\n" unless $what; + return("$what") + } + return($what); +} + +# to debug the output... +sub debug { + local($what, $line) = @_; + return("$what") + if $T2H_DEBUG & $DEBUG_HTML; + return($what); +} + +sub SimpleTexi2Html +{ + local $_ = $_[0]; + &protect_texi; + &protect_html; + $_ = substitute_style($_); + $_[0] = $_; +} + +sub normalise_node { + local $_ = $_[0]; + s/\s+/ /g; + s/ $//; + s/^ //; + &protect_texi; + &protect_html; + $_ = substitute_style($_); + $_[0] = $_; +} + +sub menu_entry +{ + my ($node, $name, $descr) = @_; + my ($href, $entry); + + &normalise_node($node); + $href = $node2href{$node}; + if ($href) + { + $descr =~ s/^\s+//; + $descr =~ s/\s*$//; + $descr = SimpleTexi2Html($descr); + if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node}) + { + $entry = $node2sec{$node}; + $name = ''; + } + else + { + &normalise_node($name); + $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY) + ? "$name : $node" : $node); + } + + if ($T2H_AVOID_MENU_REDUNDANCY && $descr) + { + my $clean_entry = $entry; + $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /); + $clean_entry =~ s/[^\w]//g; + my $clean_descr = $descr; + $clean_descr =~ s/[^\w]//g; + $descr = '' if ($clean_entry eq $clean_descr) + } + push(@lines2,&debug('
    \n", __LINE__)); + } + elsif ($node =~ /^\(.*\)\w+/) + { + push(@lines2,&debug('\n", __LINE__)) + } + else + { + warn "$ERROR Undefined node of menu_entry ($node): $_"; + } +} + +sub do_ctrl { "^$_[0]" } + +sub do_email { + local($addr, $text) = split(/,\s*/, $_[0]); + + $text = $addr unless $text; + &t2h_anchor('', "mailto:$addr", $text); +} + +sub do_sc +{ + # l2h does this much better + return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H); + return "\U$_[0]\E"; +} + +sub do_math +{ + return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H); + return "".$text.""; +} + +sub do_uref { + local($url, $text, $only_text) = split(/,\s*/, $_[0]); + + $text = $only_text if $only_text; + $text = $url unless $text; + &t2h_anchor('', $url, $text); +} + +sub do_url { &t2h_anchor('', $_[0], $_[0]) } + +sub do_acronym +{ + return '' . $_[0] . ''; +} + +sub do_accent +{ + return "&$_[0]acute;" if $_[1] eq 'H'; + return "$_[0]." if $_[1] eq 'dotaccent'; + return "$_[0]*" if $_[1] eq 'ringaccent'; + return "$_[0]".'[' if $_[1] eq 'tieaccent'; + return "$_[0]".'(' if $_[1] eq 'u'; + return "$_[0]_" if $_[1] eq 'ubaraccent'; + return ".$_[0]" if $_[1] eq 'udotaccent'; + return "$_[0]<" if $_[1] eq 'v'; + return "&$_[0]cedil;" if $_[1] eq ','; + return "$_[0]" if $_[1] eq 'dotless'; + return undef; +} + +sub apply_style { + local($texi_style, $text) = @_; + local($style); + + $style = $style_map{$texi_style}; + if (defined($style)) { # known style + if ($style =~ /^\"/) { # add quotes + $style = $'; + $text = "\`$text\'"; + } + if ($style =~ /^\&/) { # custom + $style = $'; + $text = &$style($text, $texi_style); + } elsif ($style) { # good style + $text = "<$style>$text"; + } else { # no style + } + } else { # unknown style + $text = undef; + } + return($text); +} + +# remove Texinfo styles +sub remove_style { + local($_) = @_; + 1 while(s/\@\w+{([^\{\}]+)}/$1/g); + return($_); +} + +sub remove_things +{ + local ($_) = @_; + s|\@(\w+)\{\}|$1|g; + return $_; +} + +sub substitute_style { + local($_) = @_; + local($changed, $done, $style, $text); + + &simple_substitutions; + $changed = 1; + while ($changed) { + $changed = 0; + $done = ''; + while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/) { + $text = &apply_style($1, $2); + if ($text) { + $_ = "$`$text$'"; + $changed = 1; + } else { + $done .= "$`\@$1"; + $_ = "{$2}$'"; + } + } + $_ = $done . $_; + } + return($_); +} + +sub t2h_anchor { + local($name, $href, $text, $newline, $extra_attribs) = @_; + local($result); + + $result = " + $what =~ s/\&/\&\#38;/g; + $what =~ s/\/\&\#62;/g; + # restore anything in quotes + # this fixes my problem where I had: + # < IMG SRC="leftarrow.gif" ALT="<--" > but what if I wanted < in my ALT text ?? + # maybe byte stuffing or some other technique should be used. + $what =~ s/\"([^\&]+)\&\#60;(.*)\"/"$1<$2"/g; + $what =~ s/\"([^\&]+)\&\#62;(.*)\"/"$1>$2"/g; + $what =~ s/\"([^\&]+)\&\#38;(.*)\"/"$1&$2"/g; + # but recognize some HTML things + $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # + $what =~ s/\&\#60;A ([^\&]+)\&\#62;//g; # + $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;//g; # + return($what); +} + +sub unprotect_texi { + s/$;0/\@/go; + s/$;1/\{/go; + s/$;2/\}/go; + s/$;3/\`/go; + s/$;4/\'/go; +} + +sub Unprotect_texi +{ + local $_ = shift; + &unprotect_texi; + return($_); +} + +sub unprotect_html { + local($what) = @_; + $what =~ s/\&\#38;/\&/g; + $what =~ s/\&\#60;/\/g; + return($what); +} + +sub t2h_print_label +{ + my $fh = shift; + my $href = shift || $T2H_HREF{This}; + $href =~ s/.*#(.*)$/$1/; + print $fh qq{\n}; +} + +############################################################################## + + # These next few lines are legal in both Perl and nroff. + +.00 ; # finish .ig + +'di \" finish diversion--previous line must be blank +.nr nl 0-1 \" fake up transition to first page again +.nr % 0 \" start at page 1 +'; __END__ ############# From here on it's a standard manual page ############ +.so /usr/local/man/man1/texi2html.1 diff --git a/doc/texinfo.tex b/doc/texinfo.tex new file mode 100644 index 0000000..d494cce --- /dev/null +++ b/doc/texinfo.tex @@ -0,0 +1,11045 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2015-11-22.14} +% +% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +% 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 +% 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 3 of the +% License, 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 program. If not, see . +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. This Exception is an additional permission under section 7 +% of the GNU General Public License, version 3 ("GPLv3"). +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or +% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or +% http://www.gnu.org/software/texinfo/ (the Texinfo home page) +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexnewwrite\newwrite +\let\ptexnoindent=\noindent +\let\ptexplus=+ +\let\ptexraggedright=\raggedright +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexsp=\sp +\let\ptexstar=\* +\let\ptexsup=\sup +\let\ptext=\t +\let\ptextop=\top +{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putworderror\undefined \gdef\putworderror{error}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% Since the category of space is not known, we have to be careful. +\chardef\spacecat = 10 +\def\spaceisspace{\catcode`\ =\spacecat} + +% sometimes characters are active, so we need control sequences. +\chardef\ampChar = `\& +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dashChar = `\- +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\hashChar = `\# +\chardef\lquoteChar= `\` +\chardef\questChar = `\? +\chardef\rquoteChar= `\' +\chardef\semiChar = `\; +\chardef\slashChar = `\/ +\chardef\underChar = `\_ + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\thisisundefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% @errormsg{MSG}. Do the index-like expansions on MSG, but if things +% aren't perfect, it's not the end of the world, being an error message, +% after all. +% +\def\errormsg{\begingroup \indexnofonts \doerrormsg} +\def\doerrormsg#1{\errmessage{#1}} + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% Output routine +% + +% 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 } + +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Output a mark which sets \thischapter, \thissection and \thiscolor. +% We dump everything together because we only have one kind of mark. +% This works because we only use \botmark / \topmark, not \firstmark. +% +% A mark contains a subexpression of the \ifcase ... \fi construct. +% \get*marks macros below extract the needed part using \ifcase. +% +% Another complication is to let the user choose whether \thischapter +% (\thissection) refers to the chapter (section) in effect at the top +% of a page, or that at the bottom of a page. The solution is +% described on page 260 of The TeXbook. It involves outputting two +% marks for the sectioning macros, one before the section break, and +% one after. I won't pretend I can describe this better than DEK... +% +\def\domark{% + \toks0=\expandafter{\lastchapterdefs}% + \toks2=\expandafter{\lastsectiondefs}% + \toks4=\expandafter{\prevchapterdefs}% + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% + \the\toks0 \the\toks2 % 0: top marks (\last...) + \noexpand\or \the\toks4 \the\toks6 % 1: bottom marks (default, \prev...) + \noexpand\else \the\toks8 % 2: color marks + }% +} + +% \gettopheadingmarks, \getbottomheadingmarks - extract needed part of mark. +% +% \topmark doesn't work for the very first chapter (after the title +% page or the contents), so we use \firstmark there -- this gets us +% the mark with the chapter defs, unless the user sneaks in, e.g., +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. +\def\gettopheadingmarks{% + \ifcase0\topmark\fi + \ifx\thischapter\empty \ifcase0\firstmark\fi \fi +} +\def\getbottomheadingmarks{\ifcase1\botmark\fi} +\def\getcolormarks{\ifcase2\topmark\fi} + +% Avoid "undefined control sequence" errors. +\def\lastchapterdefs{} +\def\lastsectiondefs{} +\def\lastsection{} +\def\prevchapterdefs{} +\def\prevsectiondefs{} +\def\lastcolordefs{} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% Main output routine. +% +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. +% \shipout a vbox for a single page, adding an optional header, footer, +% cropmarks, and footnote. This also causes index entries for this page +% to be written to the auxiliary files. +% +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Common context changes for both heading and footing. + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \def\commmonheadfootline{\let\hsize=\pagewidth \texinfochars} + % + % Retrieve the information for the headings from the marks in the page, + % and call Plain TeX's \makeheadline and \makefootline, which use the + % values in \headline and \footline. + % + % This is used to check if we are on the first page of a chapter. + \ifcase0\topmark\fi + \ifx\thischapter\empty + % See comment for \gettopheadingmarks + \ifcase0\firstmark\fi + \let\curchaptername\thischaptername + \ifcase1\firstmark\fi + \let\prevchaptername\thischaptername + \else + \let\curchaptername\thischaptername + \ifcase1\topmark\fi + \let\prevchaptername\thischaptername + \fi + % + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi + % + \ifx\curchaptername\prevchaptername + \let\thischapterheading\thischapter + \else + % \thischapterheading is the same as \thischapter except it is blank + % for the first page of a chapter. This is to prevent the chapter name + % being shown twice. + \def\thischapterheading{}% + \fi + % + \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% + \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}% + % + {% + % Set context for writing to auxiliary files like index files. + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + % We don't want .vr (or whatever) entries like this: + % \entry{{\indexbackslash }acronym}{32}{\code {\acronym}} + % "\acronym" won't work when it's read back in; + % it needs to be + % {\code {{\backslashcurfont }acronym} + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingyyy.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 24pt + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \indexdummies + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +% Main part of page, including any footnotes +\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\relax \unvbox#1\relax +\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}} + + +% Argument parsing + +% 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. +% For example, \def\foo{\parsearg\fooxxx}. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\argtorun{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. Also remove a @texinfoc +% comment (see \scanmacro for details). Pass the result on to \argcheckspaces. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argremovetexinfoc #1\texinfoc\ArgTerm} +\def\argremovetexinfoc#1\texinfoc#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurrence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \argtorun. +% (Similarly, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + + +% \parseargdef - define a command taking an argument on the line +% +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % 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. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % 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 \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as environments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At run-time, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Environment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + outside of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal. + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\unskip\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=\endofsentencespacefactor\space} + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=\endofsentencespacefactor\space} + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=\endofsentencespacefactor\space} + +% @frenchspacing on|off says whether to put extra space after punctuation. +% +\def\onword{on} +\def\offword{off} +% +\parseargdef\frenchspacing{% + \def\temp{#1}% + \ifx\temp\onword \plainfrenchspacing + \else\ifx\temp\offword \plainnonfrenchspacing + \else + \errhelp = \EMsimple + \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% + \fi\fi +} + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % 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 +} +% +% The \vtop 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. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + \addgroupbox + \prevdepth = \dimen1 + \checkinserts +} + +\def\addgroupbox{ + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox +} + +% +% 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 + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @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. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. Not documented, written for gawk manual. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @| 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). This command +% is not documented, not supported, and doesn't work. +% +\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 + }% + }% +} + +% @include FILE -- \input text of FILE. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable % we want to expand any @value in FILE. + \turnoffactive % and allow special characters in the expansion + \indexnofonts % Allow `@@' and other weird things in file names. + \wlog{texinfo.tex: doing @include of #1^^J}% + \edef\temp{\noexpand\input #1 }% + % + % This trickery is to read FILE outside of a group, in case it makes + % definitions, etc. + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other + \catcode`\`=\other + \catcode`\'=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} +% +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\centersub\centerH + \else + \let\centersub\centerV + \fi + \centersub{\hfil \ignorespaces#1\unskip \hfil}% + \let\centersub\relax % don't let the definition persist, just in case +} +\def\centerH#1{{% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break +}} +% +\newcount\centerpenalty +\def\centerV#1{% + % The idea here is the same as in \startdefun, \cartouche, etc.: if + % @center is the first thing after a section heading, we need to wipe + % out the negative parskip inserted by \sectionheading, but still + % prevent a page break here. + \centerpenalty = \lastpenalty + \ifnum\centerpenalty>10000 \vskip\parskip \fi + \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi + \line{\kern\leftskip #1\kern\rightskip}% +} + +% @sp n outputs n lines of vertical space +% +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment +% +\def\comment{\begingroup \catcode`\^^M=\active% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other\commentxxx}% + +{\catcode`\^^M=\active% +\gdef\commentxxx#1^^M{\endgroup% +\futurelet\nexttoken\commentxxxx}% +\gdef\commentxxxx{\ifx\nexttoken\aftermacro\expandafter\comment\fi}% +} + +\def\c{\begingroup \catcode`\^^M=\active% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\cxxx} +{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} +% See comment in \scanmacro about why the definitions of @c and @comment differ + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent {\restorefirstparagraphindent \indent}% + \gdef\noindent{\restorefirstparagraphindent \noindent}% + \global\everypar = {\kern -\parindent \restorefirstparagraphindent}% +} +% +\gdef\restorefirstparagraphindent{% + \global\let\indent = \ptexindent + \global\let\noindent = \ptexnoindent + \global\everypar = {}% +} + + +% @refill is a no-op. +\let\refill=\relax + +% @setfilename INFO-FILENAME - ignored +\let\setfilename=\comment + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newbox\boxB +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as being undefined. +\ifx\pdfoutput\thisisundefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi + +% PDF uses PostScript string constants for the names of xref targets, +% for display in the outlines, and in other places. Thus, we have to +% double any backslashes. Otherwise, a name like "\node" will be +% interpreted as a newline (\n), followed by o, d, e. Not good. +% +% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and +% related messages. The final outcome is that it is up to the TeX user +% to double the backslashes and otherwise make the string valid, so +% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to +% do this reliably, so we use it. + +% #1 is a control sequence in which to do the replacements, +% which we \xdef. +\def\txiescapepdf#1{% + \ifx\pdfescapestring\thisisundefined + % No primitive available; should we give a warning or log? + % Many times it won't matter. + \else + % The expandable \pdfescapestring primitive escapes parentheses, + % backslashes, and other special chars. + \xdef#1{\pdfescapestring{#1}}% + \fi +} + +\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images +with PDF output, and none of those formats could be found. (.eps cannot +be supported due to the design of the PDF format; use regular TeX (DVI +output) for that.)} + +\ifpdf + % + % Color manipulation macros using ideas from pdfcolor.tex, + % except using rgb instead of cmyk; the latter is said to render as a + % very dark gray on-screen and a very dark halftone in print, instead + % of actual black. The dark red here is dark enough to print on paper as + % nearly black, but still distinguishable for online viewing. We use + % black by default, though. + \def\rgbDarkRed{0.50 0.09 0.12} + \def\rgbBlack{0 0 0} + % + % k sets the color for filling (usual text, etc.); + % K sets the color for stroking (thin rules, e.g., normal _'s). + \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} + % + % Set color, and create a mark which defines \thiscolor accordingly, + % so that \makeheadline knows which color to restore. + \def\setcolor#1{% + \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% + } + % + \def\maincolor{\rgbBlack} + \pdfsetcolor{\maincolor} + \edef\thiscolor{\maincolor} + \def\lastcolordefs{} + % + \def\makefootline{% + \baselineskip24pt + \line{\pdfsetcolor{\maincolor}\the\footline}% + } + % + \def\makeheadline{% + \vbox to 0pt{% + \vskip-22.5pt + \line{% + \vbox to8.5pt{}% + % Extract \thiscolor definition from the marks. + \getcolormarks + % Typeset the headline with \maincolor, then restore the color. + \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% + }% + \vss + }% + \nointerlineskip + } + % + % + \pdfcatalog{/PageMode /UseOutlines} + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% + \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % pdftex (and the PDF format) support .pdf, .png, .jpg (among + % others). Let's try in that order, PDF first since if + % someone has a scalable image, presumably better to use that than a + % bitmap. + \let\pdfimgext=\empty + \begingroup + \openin 1 #1.pdf \ifeof 1 + \openin 1 #1.PDF \ifeof 1 + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 + \errhelp = \nopdfimagehelp + \errmessage{Could not find image file #1 for pdf}% + \else \gdef\pdfimgext{JPG}% + \fi + \else \gdef\pdfimgext{jpeg}% + \fi + \else \gdef\pdfimgext{jpg}% + \fi + \else \gdef\pdfimgext{png}% + \fi + \else \gdef\pdfimgext{PDF}% + \fi + \else \gdef\pdfimgext{pdf}% + \fi + \closein 1 + \endgroup + % + % without \immediate, ancient pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifdim \wd0 >0pt width \pdfimagewidth \fi + \ifdim \wd2 >0pt height \pdfimageheight \fi + \ifnum\pdftexversion<13 + #1.\pdfimgext + \else + {#1.\pdfimgext}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + % + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \indexnofonts + \turnoffactive + \makevalueexpandable + \def\pdfdestname{#1}% + \txiescapepdf\pdfdestname + \safewhatsit{\pdfdest name{\pdfdestname} xyz}% + }} + % + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1} + % + % by default, use black for everything. + \def\urlcolor{\rgbBlack} + \def\linkcolor{\rgbBlack} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \edef\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + \txiescapepdf\pdfoutlinedest + \fi + % + % Also escape PDF chars in the display string. + \edef\pdfoutlinetext{#1}% + \txiescapepdf\pdfoutlinetext + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\partentry##1##2##3##4{}% ignore parts in the outlines + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \def\thissubsecnum{0}% + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \def\thischapnum{0}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \readdatafile{toc}% + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % TODO this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Too + % much work for too little return. Just use the ASCII equivalents + % we use for the index sort strings. + % + \indexnofonts + \setupdatafile + % We can have normal brace characters in the PDF outlines, unlike + % Texinfo index files. So set that up. + \def\{{\lbracecharliteral}% + \def\}{\rbracecharliteral}% + \catcode`\\=\active \otherbackslash + \input \tocreadfilename + \endgroup + } + {\catcode`[=1 \catcode`]=2 + \catcode`{=\other \catcode`}=\other + \gdef\lbracecharliteral[{]% + \gdef\rbracecharliteral[}]% + ] + % + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \nextsp} + \def\getfilename#1{% + \filenamelength=0 + % If we don't expand the argument now, \skipspaces will get + % snagged on things like "@value{foo}". + \edef\temp{#1}% + \expandafter\skipspaces\temp|\relax + } + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + % make a live url in pdf output. + \def\pdfurl#1{% + \begingroup + % it seems we really need yet another set of dummies; have not + % tried to figure out what each command should do in the context + % of @url. for now, just make @/ a no-op, that's the only one + % people have actually reported a problem with. + % + \normalturnoffactive + \def\@{@}% + \let\/=\empty + \makevalueexpandable + % do we want to go so far as to use \indexnofonts instead of just + % special-casing \var here? + \def\var##1{##1}% + % + \leavevmode\setcolor{\urlcolor}% + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + % non-pdf mode + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\setcolor = \gobble + \let\pdfsetcolor = \gobble + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Unfortunately, we have to override this for titles and the like, since +% in those cases "rm" is bold. Sigh. +\def\rmisbold{\rm\def\curfontstyle{bf}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + + +% 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} +% +% can get a sort of poor man's double spacing by redefining this. +\def\baselinefactor{1} +% +\newdimen\textleading +\def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% PDF CMaps. See also LaTeX's t1.cmap. +% +% do nothing with this by default. +\expandafter\let\csname cmapOT1\endcsname\gobble +\expandafter\let\csname cmapOT1IT\endcsname\gobble +\expandafter\let\csname cmapOT1TT\endcsname\gobble + +% if we are producing pdf, and we have \pdffontattr, then define cmaps. +% (\pdffontattr was introduced many years ago, but people still run +% older pdftex's; it's easy to conditionalize, so we do.) +\ifpdf \ifx\pdffontattr\thisisundefined \else + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1-0) +%%Title: (TeX-OT1-0 TeX OT1 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1) +/Supplement 0 +>> def +/CMapName /TeX-OT1-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<23> <26> <0023> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +40 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1IT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1IT-0) +%%Title: (TeX-OT1IT-0 TeX OT1IT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1IT) +/Supplement 0 +>> def +/CMapName /TeX-OT1IT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<25> <26> <0025> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +42 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<23> <0023> +<24> <00A3> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1IT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1TT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1TT-0) +%%Title: (TeX-OT1TT-0 TeX OT1TT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1TT) +/Supplement 0 +>> def +/CMapName /TeX-OT1TT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +5 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<21> <26> <0021> +<28> <5F> <0028> +<61> <7E> <0061> +endbfrange +32 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <2191> +<0C> <2193> +<0D> <0027> +<0E> <00A1> +<0F> <00BF> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<20> <2423> +<27> <2019> +<60> <2018> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1TT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +\fi\fi + + +% Set the font macro #1 to the font named \fontprefix#2. +% #3 is the font's design size, #4 is a scale factor, #5 is the CMap +% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). +% Example: +% #1 = \textrm +% #2 = \rmshape +% #3 = 10 +% #4 = \mainmagstep +% #5 = OT1 +% +\def\setfont#1#2#3#4#5{% + \font#1=\fontprefix#2#3 scaled #4 + \csname cmap#5\endcsname#1% +} +% This is what gets called when #5 of \setfont is empty. +\let\cmap\gobble +% +% (end of cmaps) + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\thisisundefined +\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} + +% Definitions for a main text size of 11pt. (The default in Texinfo.) +% +\def\definetextfontsizexi{% +% Text fonts (11.2pt, magstep1). +\def\textnominalsize{11pt} +\edef\mainmagstep{\magstephalf} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1095} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1}{OT1} +\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defsl\slshape{10}{\magstep1}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf +\let\tenttsl=\defttsl \let\tensl=\defsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter (and unnumbered) fonts (17.28pt). +\def\chapnominalsize{17pt} +\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} +\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep3}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} +\setfont\chapsf\sfbshape{17}{1000}{OT1} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3}{OT1} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 +\def\chapecsize{1728} + +% Section fonts (14.4pt). +\def\secnominalsize{14pt} +\setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1} +\setfont\secit\itbshape{10}{\magstep2}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep2}{OT1} +\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\secsf\sfbshape{12}{\magstep1}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2}{OT1} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 +\def\sececsize{1440} + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} +\setfont\ssecit\itbshape{10}{1315}{OT1IT} +\setfont\ssecsl\slbshape{10}{1315}{OT1} +\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} +\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315}{OT1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +\def\ssececsize{1200} + +% Reduced fonts for @acro in text (10pt). +\def\reducednominalsize{10pt} +\setfont\reducedrm\rmshape{10}{1000}{OT1} +\setfont\reducedtt\ttshape{10}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{1000}{OT1} +\setfont\reducedit\itshape{10}{1000}{OT1IT} +\setfont\reducedsl\slshape{10}{1000}{OT1} +\setfont\reducedsf\sfshape{10}{1000}{OT1} +\setfont\reducedsc\scshape{10}{1000}{OT1} +\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 +\def\reducedecsize{1000} + +\textleading = 13.2pt % line spacing for 11pt CM +\textfonts % reset the current fonts +\rm +} % end of 11pt text font size definitions, \definetextfontsizexi + + +% Definitions to make the main text be 10pt Computer Modern, with +% section, chapter, etc., sizes following suit. This is for the GNU +% Press printing of the Emacs 22 manual. Maybe other manuals in the +% future. Used with @smallbook, which sets the leading to 12pt. +% +\def\definetextfontsizex{% +% Text fonts (10pt). +\def\textnominalsize{10pt} +\edef\mainmagstep{1000} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1000} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstephalf}{OT1} +\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defsl\slshape{10}{\magstephalf}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf +\let\tensl=\defsl \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter fonts (14.4pt). +\def\chapnominalsize{14pt} +\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} +\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep2}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} +\let\chapbf\chaprm +\setfont\chapsc\scbshape{10}{\magstep2}{OT1} +\font\chapi=cmmi12 scaled \magstep1 +\font\chapsy=cmsy10 scaled \magstep2 +\def\chapecsize{1440} + +% Section fonts (12pt). +\def\secnominalsize{12pt} +\setfont\secrm\rmbshape{12}{1000}{OT1} +\setfont\secit\itbshape{10}{\magstep1}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep1}{OT1} +\setfont\sectt\ttbshape{12}{1000}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} +\setfont\secsf\sfbshape{12}{1000}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep1}{OT1} +\font\seci=cmmi12 +\font\secsy=cmsy10 scaled \magstep1 +\def\sececsize{1200} + +% Subsection fonts (10pt). +\def\ssecnominalsize{10pt} +\setfont\ssecrm\rmbshape{10}{1000}{OT1} +\setfont\ssecit\itbshape{10}{1000}{OT1IT} +\setfont\ssecsl\slbshape{10}{1000}{OT1} +\setfont\ssectt\ttbshape{10}{1000}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} +\setfont\ssecsf\sfbshape{10}{1000}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1000}{OT1} +\font\sseci=cmmi10 +\font\ssecsy=cmsy10 +\def\ssececsize{1000} + +% Reduced fonts for @acro in text (9pt). +\def\reducednominalsize{9pt} +\setfont\reducedrm\rmshape{9}{1000}{OT1} +\setfont\reducedtt\ttshape{9}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{900}{OT1} +\setfont\reducedit\itshape{9}{1000}{OT1IT} +\setfont\reducedsl\slshape{9}{1000}{OT1} +\setfont\reducedsf\sfshape{9}{1000}{OT1} +\setfont\reducedsc\scshape{10}{900}{OT1} +\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} +\font\reducedi=cmmi9 +\font\reducedsy=cmsy9 +\def\reducedecsize{0900} + +\divide\parskip by 2 % reduce space between paragraphs +\textleading = 12pt % line spacing for 10pt CM +\textfonts % reset the current fonts +\rm +} % end of 10pt text font size definitions, \definetextfontsizex + + +% We provide the user-level command +% @fonttextsize 10 +% (or 11) to redefine the text font size. pt is assumed. +% +\def\xiword{11} +\def\xword{10} +\def\xwordpt{10pt} +% +\parseargdef\fonttextsize{% + \def\textsizearg{#1}% + %\wlog{doing @fonttextsize \textsizearg}% + % + % Set \globaldefs so that documents can use this inside @tex, since + % makeinfo 4.8 does not support it, but we need it nonetheless. + % + \begingroup \globaldefs=1 + \ifx\textsizearg\xword \definetextfontsizex + \else \ifx\textsizearg\xiword \definetextfontsizexi + \else + \errhelp=\EMsimple + \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} + \fi\fi + \endgroup +} + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. We don't +% bother to reset \scriptfont and \scriptscriptfont; awaiting user need. +% +\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 because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used +% in, e.g., the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\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 + \def\curfontsize{text}% + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\curfontsize{title}% + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{27pt}} +\def\titlefont#1{{\titlefonts\rmisbold #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \let\tenttsl=\chapttsl + \def\curfontsize{chap}% + \def\lsize{sec}\def\lllsize{text}% + \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 + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{17pt}} +\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 + \def\curfontsize{ssec}% + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\curfontsize{reduced}% + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\curfontsize{small}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\curfontsize{smaller}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000}{OT1} +\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000}{OT1} +\setfont\shortconttt\ttshape{12}{1000}{OT1TT} + +% Define these just so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% --karl, 24jan03. + +% Set up the default fonts, so we can use them for creating boxes. +% +\definetextfontsizexi + + +\message{markup,} + +% 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 } + +% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will +% define and register \INITMACRO to be called on markup style changes. +% \INITMACRO can check \currentmarkupstyle for the innermost +% style and the set of \ifmarkupSTYLE switches for all styles +% currently in effect. +\newif\ifmarkupvar +\newif\ifmarkupsamp +\newif\ifmarkupkey +%\newif\ifmarkupfile % @file == @samp. +%\newif\ifmarkupoption % @option == @samp. +\newif\ifmarkupcode +\newif\ifmarkupkbd +%\newif\ifmarkupenv % @env == @code. +%\newif\ifmarkupcommand % @command == @code. +\newif\ifmarkuptex % @tex (and part of @math, for now). +\newif\ifmarkupexample +\newif\ifmarkupverb +\newif\ifmarkupverbatim + +\let\currentmarkupstyle\empty + +\def\setupmarkupstyle#1{% + \csname markup#1true\endcsname + \def\currentmarkupstyle{#1}% + \markupstylesetup +} + +\let\markupstylesetup\empty + +\def\defmarkupstylesetup#1{% + \expandafter\def\expandafter\markupstylesetup + \expandafter{\markupstylesetup #1}% + \def#1% +} + +% Markup style setup for left and right quotes. +\defmarkupstylesetup\markupsetuplq{% + \expandafter\let\expandafter \temp + \csname markupsetuplq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuplqdefault \else \temp \fi +} + +\defmarkupstylesetup\markupsetuprq{% + \expandafter\let\expandafter \temp + \csname markupsetuprq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuprqdefault \else \temp \fi +} + +{ +\catcode`\'=\active +\catcode`\`=\active + +\gdef\markupsetuplqdefault{\let`\lq} +\gdef\markupsetuprqdefault{\let'\rq} + +\gdef\markupsetcodequoteleft{\let`\codequoteleft} +\gdef\markupsetcodequoteright{\let'\codequoteright} +} + +\let\markupsetuplqcode \markupsetcodequoteleft +\let\markupsetuprqcode \markupsetcodequoteright +% +\let\markupsetuplqexample \markupsetcodequoteleft +\let\markupsetuprqexample \markupsetcodequoteright +% +\let\markupsetuplqkbd \markupsetcodequoteleft +\let\markupsetuprqkbd \markupsetcodequoteright +% +\let\markupsetuplqsamp \markupsetcodequoteleft +\let\markupsetuprqsamp \markupsetcodequoteright +% +\let\markupsetuplqverb \markupsetcodequoteleft +\let\markupsetuprqverb \markupsetcodequoteright +% +\let\markupsetuplqverbatim \markupsetcodequoteleft +\let\markupsetuprqverbatim \markupsetcodequoteright + +% Allow an option to not use regular directed right quote/apostrophe +% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). +% The undirected quote is ugly, so don't make it the default, but it +% works for pasting with more pdf viewers (at least evince), the +% lilypond developers report. xpdf does work with the regular 0x27. +% +\def\codequoteright{% + \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \else \char'15 \fi +} +% +% and a similar option for the left quote char vs. a grave accent. +% Modern fonts display ASCII 0x60 as a grave accent, so some people like +% the code environments to do likewise. +% +\def\codequoteleft{% + \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + % [Knuth] pp. 380,381,391 + % \relax disables Spanish ligatures ?` and !` of \tt font. + \relax`% + \else \char'22 \fi + \else \char'22 \fi +} + +% Commands to set the quote options. +% +\parseargdef\codequoteundirected{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% + \fi\fi +} +% +\parseargdef\codequotebacktick{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% + \fi\fi +} + +% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. +\def\noligaturesquoteleft{\relax\lq} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Font commands. + +% #1 is the font command (\sl or \it), #2 is the text to slant. +% If we are in a monospaced environment, however, 1) always use \ttsl, +% and 2) do not add an italic correction. +\def\dosmartslant#1#2{% + \ifusingtt + {{\ttsl #2}\let\next=\relax}% + {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% + \next +} +\def\smartslanted{\dosmartslant\sl} +\def\smartitalic{\dosmartslant\it} + +% Output an italic correction unless \next (presumed to be the following +% character) is such as not to need one. +\def\smartitaliccorrection{% + \ifx\next,% + \else\ifx\next-% + \else\ifx\next.% + \else\ifx\next\.% + \else\ifx\next\comma% + \else\ptexslash + \fi\fi\fi\fi\fi + \aftersmartic +} + +% Unconditional use \ttsl, and no ic. @var is set to this for defuns. +\def\ttslanted#1{{\ttsl #1}} + +% @cite is like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} + +\def\aftersmartic{} +\def\var#1{% + \let\saveaftersmartic = \aftersmartic + \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% + \smartslanted{#1}% +} + +\let\i=\smartitalic +\let\slanted=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @b, explicit bold. Also @strong. +\def\b#1{{\bf #1}} +\let\strong=\b + +% @sansserif, explicit sans. +\def\sansserif#1{{\sf #1}} + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\plainfrenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \def\endofsentencespacefactor{1000}% for @. and friends + } + \def\plainnonfrenchspacing{% + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends + } +\catcode`@=\other +\def\endofsentencespacefactor{3000}% default + +% @t, explicit typewriter. +\def\t#1{% + {\tt \rawbackslash \plainfrenchspacing #1}% + \null +} + +% @samp. +\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} + +% @indicateurl is \samp, that is, with quotes. +\let\indicateurl=\samp + +% @code (and similar) prints in typewriter, but with spaces the same +% size as normal in the surrounding text, without hyphenation, etc. +% This is a subroutine for that. +\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 + \plainfrenchspacing + #1% + }% + \null % reset spacefactor to 1000 +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% (But see \codedashfinish below.) +% 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 + \catcode`\'=\active \catcode`\`=\active + \global\let'=\rq \global\let`=\lq % default definitions + % + \global\def\code{\begingroup + \setupmarkupstyle{code}% + % The following should really be moved into \setupmarkupstyle handlers. + \catcode\dashChar=\active \catcode\underChar=\active + \ifallowcodebreaks + \let-\codedash + \let_\codeunder + \else + \let-\normaldash + \let_\realunder + \fi + % Given -foo (with a single dash), we do not want to allow a break + % after the hyphen. + \global\let\codedashprev=\codedash + % + \codex + } + % + \gdef\codedash{\futurelet\next\codedashfinish} + \gdef\codedashfinish{% + \normaldash % always output the dash character itself. + % + % Now, output a discretionary to allow a line break, unless + % (a) the next character is a -, or + % (b) the preceding character is a -. + % E.g., given --posix, we do not want to allow a break after either -. + % Given --foo-bar, we do want to allow a break between the - and the b. + \ifx\next\codedash \else + \ifx\codedashprev\codedash + \else \discretionary{}{}{}\fi + \fi + % we need the space after the = for the case when \next itself is a + % space token; it would get swallowed otherwise. As in @code{- a}. + \global\let\codedashprev= \next + } +} +\def\normaldash{-} +% +\def\codex #1{\tclose{#1}\endgroup} + +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} + +% An additional complication: the above will allow breaks after, e.g., +% each of the four underscores in __typeof__. This is bad. +% @allowcodebreaks provides a document-level way to turn breaking at - +% and _ on and off. +% +\newif\ifallowcodebreaks \allowcodebreakstrue + +\def\keywordtrue{true} +\def\keywordfalse{false} + +\parseargdef\allowcodebreaks{% + \def\txiarg{#1}% + \ifx\txiarg\keywordtrue + \allowcodebreakstrue + \else\ifx\txiarg\keywordfalse + \allowcodebreaksfalse + \else + \errhelp = \EMsimple + \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% + \fi\fi +} + +% For @command, @env, @file, @option quotes seem unnecessary, +% so use \code rather than \samp. +\let\command=\code +\let\env=\code +\let\file=\code +\let\option=\code + +% @uref (abbreviation for `urlref') aka @url takes an optional +% (comma-separated) second argument specifying the text to display and +% an optional third arg as text to display instead of (rather than in +% addition to) the url itself. First (mandatory) arg is the url. + +% TeX-only option to allow changing PDF output to show only the second +% arg (if given), and not the url (which is then just the link target). +\newif\ifurefurlonlylink + +% The main macro is \urefbreak, which allows breaking at expected +% places within the url. (There used to be another version, which +% didn't support automatic breaking.) +\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} +\let\uref=\urefbreak +% +\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} +\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% look for second arg + \ifdim\wd0 > 0pt + \ifpdf + \ifurefurlonlylink + % PDF plus option to not display url, show just arg + \unhbox0 + \else + % PDF, normally display both arg and url for consistency, + % visibility, if the pdf is eventually used to print, etc. + \unhbox0\ (\urefcode{#1})% + \fi + \else + \unhbox0\ (\urefcode{#1})% DVI, always show arg and url + \fi + \else + \urefcode{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% Allow line breaks around only a few characters (only). +\def\urefcatcodes{% + \catcode\ampChar=\active \catcode\dotChar=\active + \catcode\hashChar=\active \catcode\questChar=\active + \catcode\slashChar=\active +} +{ + \urefcatcodes + % + \global\def\urefcode{\begingroup + \setupmarkupstyle{code}% + \urefcatcodes + \let&\urefcodeamp + \let.\urefcodedot + \let#\urefcodehash + \let?\urefcodequest + \let/\urefcodeslash + \codex + } + % + % By default, they are just regular characters. + \global\def&{\normalamp} + \global\def.{\normaldot} + \global\def#{\normalhash} + \global\def?{\normalquest} + \global\def/{\normalslash} +} + +% we put a little stretch before and after the breakable chars, to help +% line breaking of long url's. The unequal skips make look better in +% cmtt at least, especially for dots. +\def\urefprestretchamount{.13em} +\def\urefpoststretchamount{.1em} +\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax} +\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax} +% +\def\urefcodeamp{\urefprestretch \&\urefpoststretch} +\def\urefcodedot{\urefprestretch .\urefpoststretch} +\def\urefcodehash{\urefprestretch \#\urefpoststretch} +\def\urefcodequest{\urefprestretch ?\urefpoststretch} +\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} +{ + \catcode`\/=\active + \global\def\urefcodeslashfinish{% + \urefprestretch \slashChar + % Allow line break only after the final / in a sequence of + % slashes, to avoid line break between the slashes in http://. + \ifx\next/\else \urefpoststretch \fi + } +} + +% One more complication: by default we'll break after the special +% characters, but some people like to break before the special chars, so +% allow that. Also allow no breaking at all, for manual control. +% +\parseargdef\urefbreakstyle{% + \def\txiarg{#1}% + \ifx\txiarg\wordnone + \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordbefore + \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordafter + \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} + \else + \errhelp = \EMsimple + \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% + \fi\fi\fi +} +\def\wordafter{after} +\def\wordbefore{before} +\def\wordnone{none} + +\urefbreakstyle after + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\txiarg{#1}% + \ifx\txiarg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\txiarg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\txiarg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct'. +\kbdinputstyle distinct + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. +\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} + +\def\xkey{\key} +\def\kbdsub#1#2#3\par{% + \def\one{#1}\def\three{#3}\def\threex{??}% + \ifx\one\xkey\ifx\threex\three \key{#2}% + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi +} + +% definition of @key that produces a lozenge. Doesn't adjust to text size. +%\setfont\keyrm\rmshape{8}{1000}{OT1} +%\font\keysy=cmsy9 +%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +% \vbox{\hrule\kern-0.4pt +% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +% \kern-0.4pt\hrule}% +% \kern-.06em\raise0.4pt\hbox{\angleright}}}} + +% definition of @key with no lozenge. If the current font is already +% monospace, don't change it; that way, we respect @kbdinputstyle. But +% if it isn't monospace, then use \tt. +% +\def\key#1{{\setupmarkupstyle{key}% + \nohyphenation + \ifmonospace\else\tt\fi + #1}\null} + +% @clicksequence{File @click{} Open ...} +\def\clicksequence#1{\begingroup #1\endgroup} + +% @clickstyle @arrow (by default) +\parseargdef\clickstyle{\def\click{#1}} +\def\click{\arrow} + +% 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} + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode`\_ = \active + \gdef\mathunderscore{% + \catcode`\_=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a math (or tt) \. +% FYI, plain.tex uses \\ as a temporary control sequence (for no +% particular reason), but this is not advertised and we don't care. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + % make the texinfo accent commands work in math mode + \let\"=\ddot + \let\'=\acute + \let\==\bar + \let\^=\hat + \let\`=\grave + \let\u=\breve + \let\v=\check + \let\~=\tilde + \let\dotaccent=\dot + % have to provide another name for sup operator + \let\mathopsup=\sup + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \catcode`' = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + \let' = \ptexquoteright + } +} + +% for @sub and @sup, if in math mode, just do a normal sub/superscript. +% If in text, use math to place as sub/superscript, but switch +% into text mode, with smaller fonts. This is a different font than the +% one used for real math sub/superscripts (8pt vs. 7pt), but let's not +% fix it (significant additions to font machinery) until someone notices. +% +\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} +\def\finishsub#1{$\sb{\hbox{\selectfonts\lllsize #1}}$}% +% +\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} +\def\finishsup#1{$\ptexsp{\hbox{\selectfonts\lllsize #1}}$}% + +% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. +% Ignore unless FMTNAME == tex; then it is like @iftex and @tex, +% except specified as a normal braced arg, so no newlines to worry about. +% +\def\outfmtnametex{tex} +% +\long\def\inlinefmt#1{\doinlinefmt #1,\finish} +\long\def\doinlinefmt#1,#2,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi +} +% +% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if +% FMTNAME is tex, else ELSE-TEXT. +\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} +\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi +} +% +% For raw, must switch into @tex before parsing the argument, to avoid +% setting catcodes prematurely. Doing it this way means that, for +% example, @inlineraw{html, foo{bar} gets a parse error instead of being +% ignored. But this isn't important because if people want a literal +% *right* brace they would have to use a command anyway, so they may as +% well use a command to get a left brace too. We could re-use the +% delimiter character idea from \verb, but it seems like overkill. +% +\long\def\inlineraw{\tex \doinlineraw} +\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} +\def\doinlinerawtwo#1,#2,\finish{% + \def\inlinerawname{#1}% + \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi + \endgroup % close group opened by \tex. +} + +% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. +% +\long\def\inlineifset#1{\doinlineifset #1,\finish} +\long\def\doinlineifset#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax + \else\ignorespaces#2\fi +} + +% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. +% +\long\def\inlineifclear#1{\doinlineifclear #1,\finish} +\long\def\doinlineifclear#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi +} + + +\message{glyphs,} +% and logos. + +% @@ prints an @, as does @atchar{}. +\def\@{\char64 } +\let\atchar=\@ + +% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. +% Unless we're in typewriter, use \ecfont because the CM text fonts do +% not have braces, and we don't want to switch into math. +\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} +\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} +\let\{=\mylbrace \let\lbracechar=\{ +\let\}=\myrbrace \let\rbracechar=\} +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \ptexc +\let\dotaccent = \ptexdot +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \ptext +\let\ubaraccent = \ptexb +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi + \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{% + \ifx\textnominalsize\xwordpt + % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. + % Revert to plain's \scriptsize, which is 7pt. + \count255=\the\fam $\fam\count255 \scriptstyle A$% + \else + % For 11pt, we can use our lllsize. + \selectfonts\lllsize A% + \fi + }% + \vss + }}% + \kern-.15em + \TeX +} + +% Some math mode symbols. Define \ensuremath to switch into math mode +% unless we are already there. Expansion tricks may not be needed here, +% but safer, and can't hurt. +\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} +\def\ensuredmath#1{$\relax#1$} +% +\def\bullet{\ensuremath\ptexbullet} +\def\geq{\ensuremath\ge} +\def\leq{\ensuremath\le} +\def\minus{\ensuremath-} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em. So do +% whichever is larger. +% +\def\dots{% + \leavevmode + \setbox0=\hbox{...}% get width of three periods + \ifdim\wd0 > 1.5em + \dimen0 = \wd0 + \else + \dimen0 = 1.5em + \fi + \hbox to \dimen0{% + \hskip 0pt plus.25fil + .\hskip 0pt plus1fil + .\hskip 0pt plus1fil + .\hskip 0pt plus.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor +} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, they should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} +\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @pounds{} is a sterling sign, which Knuth put in the CM italic font. +% +\def\pounds{{\it\$}} + +% @euro{} comes from a separate font, depending on the current style. +% We use the free feym* fonts from the eurosym package by Henrik +% Theiling, which support regular, slanted, bold and bold slanted (and +% "outlined" (blackboard board, sort of) versions, which we don't need). +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. +% +% Although only regular is the truly official Euro symbol, we ignore +% that. The Euro is designed to be slightly taller than the regular +% font height. +% +% feymr - regular +% feymo - slanted +% feybr - bold +% feybo - bold slanted +% +% There is no good (free) typewriter version, to my knowledge. +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. +% Hmm. +% +% Also doesn't work in math. Do we need to do math with euro symbols? +% Hope not. +% +% +\def\euro{{\eurofont e}} +\def\eurofont{% + % We set the font at each command, rather than predefining it in + % \textfonts and the other font-switching commands, so that + % installations which never need the symbol don't have to have the + % font installed. + % + % There is only one designed size (nominal 10pt), so we always scale + % that to the current nominal size. + % + % By the way, simply using "at 1em" works for cmr10 and the like, but + % does not work for cmbx10 and other extended/shrunken fonts. + % + \def\eurosize{\csname\curfontsize nominalsize\endcsname}% + % + \ifx\curfontstyle\bfstylename + % bold: + \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize + \else + % regular: + \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize + \fi + \thiseurofont +} + +% Glyphs from the EC fonts. We don't use \let for the aliases, because +% sometimes we redefine the original macro, and the alias should reflect +% the redefinition. +% +% Use LaTeX names for the Icelandic letters. +\def\DH{{\ecfont \char"D0}} % Eth +\def\dh{{\ecfont \char"F0}} % eth +\def\TH{{\ecfont \char"DE}} % Thorn +\def\th{{\ecfont \char"FE}} % thorn +% +\def\guillemetleft{{\ecfont \char"13}} +\def\guillemotleft{\guillemetleft} +\def\guillemetright{{\ecfont \char"14}} +\def\guillemotright{\guillemetright} +\def\guilsinglleft{{\ecfont \char"0E}} +\def\guilsinglright{{\ecfont \char"0F}} +\def\quotedblbase{{\ecfont \char"12}} +\def\quotesinglbase{{\ecfont \char"0D}} +% +% This positioning is not perfect (see the ogonek LaTeX package), but +% we have the precomposed glyphs for the most common cases. We put the +% tests to use those glyphs in the single \ogonek macro so we have fewer +% dummy definitions to worry about for index entries, etc. +% +% ogonek is also used with other letters in Lithuanian (IOU), but using +% the precomposed glyphs for those is not so easy since they aren't in +% the same EC font. +\def\ogonek#1{{% + \def\temp{#1}% + \ifx\temp\macrocharA\Aogonek + \else\ifx\temp\macrochara\aogonek + \else\ifx\temp\macrocharE\Eogonek + \else\ifx\temp\macrochare\eogonek + \else + \ecfont \setbox0=\hbox{#1}% + \ifdim\ht0=1ex\accent"0C #1% + \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% + \fi + \fi\fi\fi\fi + }% +} +\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} +\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} +\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} +\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} +% +% Use the European Computer Modern fonts (cm-super in outline format) +% for non-CM glyphs. That is ec* for regular text and tc* for the text +% companion symbols (LaTeX TS1 encoding). Both are part of the ec +% package and follow the same conventions. +% +\def\ecfont{\etcfont{e}} +\def\tcfont{\etcfont{t}} +% +\def\etcfont#1{% + % We can't distinguish serif/sans and italic/slanted, but this + % is used for crude hacks anyway (like adding French and German + % quotes to documents typeset with CM, where we lose kerning), so + % hopefully nobody will notice/care. + \edef\ecsize{\csname\curfontsize ecsize\endcsname}% + \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% + \ifmonospace + % typewriter: + \font\thisecfont = #1ctt\ecsize \space at \nominalsize + \else + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \fi + \thisecfont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% @textdegree - the normal degrees sign. +% +\def\textdegree{$^\circ$} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\thisisundefined +\def\Orb{\mathhexbox20D} +\fi + +% Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" +\chardef\quoteleft=`\` +\chardef\quoteright=`\' + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{% + \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % 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 + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +% Settings used for typesetting titles: no hyphenation, no indentation, +% don't worry much about spacing, ragged right. This should be used +% inside a \vbox, and fonts need to be set appropriately first. Because +% it is always used for titles, nothing else, we call \rmisbold. \par +% should be specified before the end of the \vbox, since a vbox is a group. +% +\def\raggedtitlesettings{% + \rmisbold + \hyphenpenalty=10000 + \parindent=0pt + \tolerance=5000 + \ptexraggedright +} + +% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\parseargdef\title{% + \checkenv\titlepage + \vbox{\titlefonts \raggedtitlesettings #1\par}% + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\secfonts\rmisbold \leftline{#1}}% + \fi +} + + +% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make \makeheadline and \makefootline in Plain 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\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -12pt + \global\advance\vsize by -12pt +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + +% @evenheadingmarks top \thischapter <- chapter at the top of a page +% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page +% +% The same set of arguments for: +% +% @oddheadingmarks +% @evenfootingmarks +% @oddfootingmarks +% @everyheadingmarks +% @everyfootingmarks + +% These define \getoddheadingmarks, \getevenheadingmarks, +% \getoddfootingmarks, and \getevenfootingmarks, each to one of +% \gettopheadingmarks, \getbottomheadingmarks. +% +\def\evenheadingmarks{\headingmarks{even}{heading}} +\def\oddheadingmarks{\headingmarks{odd}{heading}} +\def\evenfootingmarks{\headingmarks{even}{footing}} +\def\oddfootingmarks{\headingmarks{odd}{footing}} +\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} + \headingmarks{odd}{heading}{#1} } +\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} + \headingmarks{odd}{footing}{#1} } +% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. +\def\headingmarks#1#2#3 {% + \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname + \global\expandafter\let\csname get#1#2marks\endcsname \temp +} + +\everyheadingmarks bottom +\everyfootingmarks bottom + +% @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{% non-global headings elimination + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% +} + +\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting +\HEADINGSoff % it's the default + +% 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{\thischapterheading\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{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\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{\thischapterheading\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\thisisundefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(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, @ftable, 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\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil\relax + \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. However, if + % what follows is an environment such as @example, there will be no + % \parskip glue; then the negative vskip we just inserted would + % cause the example and the item to crash together. So we use this + % bizarre value of 10001 as a signal to \aboveenvbreak to insert + % \parskip glue after all. Section titles are handled this way also. + % + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablecheck{table}% +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablecheck{ftable}% +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablecheck{vtable}% +} +\def\tablecheck#1{% + \ifnum \the\catcode`\^^M=\active + \endgroup + \errmessage{This command won't work in this context; perhaps the problem is + that we are \inenvironment\thisenv}% + \def\next{\doignore{#1}}% + \else + \let\next\tablex + \fi + \next +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + % + % Try typesetting the item mark so that if the document erroneously says + % something like @itemize @samp (intending @table), there's an error + % right away at the @itemize. It's not the best error message in the + % world, but it's better than leaving it to the @item. This means if + % the user wants an empty mark, they have to say @w{} not just @w. + \def\itemcontents{#1}% + \setbox0 = \hbox{\itemcontents}% + % + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + % + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + % + \ifinner\else + \vadjust{\penalty 1200}% not good to break after first line of item. + \fi + % We can be in inner vertical mode in a footnote, although an + % @itemize looks awful there. + }% + \flushcr +} + +% \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'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % 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 . + % + \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 \doitemize, 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 + \doitemize{#1.}\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} + + +% @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. + +% 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 do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \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 + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. Assignments +% have to be global since we are inside the implicit group of an +% alignment entry. \everycr below resets \everytab so we don't have to +% undo it ourselves. +\def\headitemfont{\b}% for people to use in the template row; not changeable +\def\headitem{% + \checkenv\multitable + \crcr + \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings + \global\everytab={\bf}% can't use \headitemfont since the parsing differs + \the\everytab % for the first item +}% +% +% default for tables with no headings. +\let\headitemcrhook=\relax +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we again encounter the problem the 1sp was intended to solve. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + % We use \def instead of \let so that if one of the multitable entries + % contains an @itemize, we don't choke on the \item (seen as \crcr aka + % \endtemplate) expanding \doitemize. + \def\item{\crcr}% + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% Reset from possible headitem. + \global\colcount=0 % Reset the column counter. + % + % Check for saved footnotes, etc.: + \checkinserts + % + % Perhaps a \nobreak, then reset: + \headitemcrhook + \global\let\headitemcrhook=\relax + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % 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 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% + \def\multistrut{\strut}% just use the standard line spacing + % + % Compute \multitablelinespace (if not defined by user) for use in + % \multitableparskip calculation. We used define \multistrut based on + % this, but (ironically) that caused the spacing to be off. + % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +\fi +% Test to see if parskip is larger than space between lines of +% table. If not, do nothing. +% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \obeylines + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore{#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the command name as a string, e.g., `ifinfo'. + % + % Define a command to find the next `@end #1'. + \long\def\doignoretext##1^^M@end #1{% + \doignoretextyyy##1^^M@#1\_STOP_}% + % + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +{ \obeylines% + % Ignore anything after the last `@end #1'; this matters in verbatim + % environments, where otherwise the newline after an ignored conditional + % would result in a blank line in the output. + \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% +} + + +% @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. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\-=\active \catcode`\_=\active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\normaldash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +% Unfortunately, this has the consequence that when _ is in the *value* +% of an @set, it does not print properly in the roman fonts (get the cmr +% dot accent at position 126 instead). No fix comes to mind, and it's +% been this way since 2003 or earlier, so just ignore it. +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get the special treatment we need for `@end ifset,' we call +% \makecond and then redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end executes the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written +% without the @) is in fact defined. We can only feasibly check at the +% TeX level, so something like `mathcode' is going to considered +% defined even though it is not a Texinfo command. +% +\makecond{ifcommanddefined} +\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} +% +\def\doifcmddefined#1#2{{% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname #2\endcsname\relax + #1% If not defined, \let\next as above. + \fi + \expandafter + }\next +} +\def\ifcmddefinedfail{\doignore{ifcommanddefined}} + +% @ifcommandnotdefined CMD ... handled similar to @ifclear above. +\makecond{ifcommandnotdefined} +\def\ifcommandnotdefined{% + \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} +\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} + +% Set the `txicommandconditionals' variable, so documents have a way to +% test if the @ifcommand...defined conditionals are available. +\set txicommandconditionals + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within macros and \if's. +\edef\newwrite{\makecsname{ptexnewwrite}} + +% \newindex {foo} defines an index named IX. +% It automatically defines \IXindex such that +% \IXindex ...rest of line... puts an entry in the index IX. +% It also defines \IXindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is IX. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \expandafter\chardef\csname#1indfile\endcsname=0 + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \expandafter\chardef\csname#1indfile\endcsname=0 + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + +% The default indices: +\newindex{cp}% concepts, +\newcodeindex{fn}% functions, +\newcodeindex{vr}% variables, +\newcodeindex{tp}% types, +\newcodeindex{ky}% keys +\newcodeindex{pg}% and programs. + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \relax + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all index macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it the two-letter name of the index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} +\def\doindexxxx #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} +\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}} + +% Used when writing an index entry out to an index file, to prevent +% expansion of Texinfo commands that can appear in an index entry. +% +\def\indexdummies{% + \escapechar = `\\ % use backslash in output files. + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % + % Need these unexpandable (because we define \tt as a dummy) + % definitions when @{ or @} appear in index entry text. Also, more + % complicated, when \tex is in effect and \{ is a \delimiter again. + % We can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. Perhaps we + % should use @lbracechar and @rbracechar? + \def\{{{\tt\char123}}% + \def\}{{\tt\char125}}% + % + % Do the redefinitions. + \commondummies +} + +% For the aux and toc files, @ is the escape character. So we want to +% redefine everything using @ as the escape character (instead of +% \realbackslash, still used for index files). When everything uses @, +% this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % Do the redefinitions. + \commondummies + \otherbackslash +} + +% Called from \indexdummies and \atdummies. +% +\def\commondummies{% + % \definedummyword defines \#1 as \string\#1\space, thus effectively + % preventing its expansion. This is used only for control words, + % not control letters, because the \space would be incorrect for + % control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword ##1{\def##1{\string##1\space}}% + \def\definedummyletter##1{\def##1{\string##1}}% + \let\definedummyaccent\definedummyletter + % + \commondummiesnofonts + % + \definedummyletter\_% + \definedummyletter\-% + % + % Non-English letters. + \definedummyword\AA + \definedummyword\AE + \definedummyword\DH + \definedummyword\L + \definedummyword\O + \definedummyword\OE + \definedummyword\TH + \definedummyword\aa + \definedummyword\ae + \definedummyword\dh + \definedummyword\exclamdown + \definedummyword\l + \definedummyword\o + \definedummyword\oe + \definedummyword\ordf + \definedummyword\ordm + \definedummyword\questiondown + \definedummyword\ss + \definedummyword\th + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword\bf + \definedummyword\gtr + \definedummyword\hat + \definedummyword\less + \definedummyword\sf + \definedummyword\sl + \definedummyword\tclose + \definedummyword\tt + % + \definedummyword\LaTeX + \definedummyword\TeX + % + % Assorted special characters. + \definedummyword\arrow + \definedummyword\bullet + \definedummyword\comma + \definedummyword\copyright + \definedummyword\registeredsymbol + \definedummyword\dots + \definedummyword\enddots + \definedummyword\entrybreak + \definedummyword\equiv + \definedummyword\error + \definedummyword\euro + \definedummyword\expansion + \definedummyword\geq + \definedummyword\guillemetleft + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright + \definedummyword\lbracechar + \definedummyword\leq + \definedummyword\mathopsup + \definedummyword\minus + \definedummyword\ogonek + \definedummyword\pounds + \definedummyword\point + \definedummyword\print + \definedummyword\quotedblbase + \definedummyword\quotedblleft + \definedummyword\quotedblright + \definedummyword\quoteleft + \definedummyword\quoteright + \definedummyword\quotesinglbase + \definedummyword\rbracechar + \definedummyword\result + \definedummyword\sub + \definedummyword\sup + \definedummyword\textdegree + % + % We want to disable all macros so that they are not expanded by \write. + \macrolist + % + \normalturnoffactive + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% Define \definedumyletter, \definedummyaccent and \definedummyword before +% using. +% +\def\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter\!% + \definedummyaccent\"% + \definedummyaccent\'% + \definedummyletter\*% + \definedummyaccent\,% + \definedummyletter\.% + \definedummyletter\/% + \definedummyletter\:% + \definedummyaccent\=% + \definedummyletter\?% + \definedummyaccent\^% + \definedummyaccent\`% + \definedummyaccent\~% + \definedummyword\u + \definedummyword\v + \definedummyword\H + \definedummyword\dotaccent + \definedummyword\ogonek + \definedummyword\ringaccent + \definedummyword\tieaccent + \definedummyword\ubaraccent + \definedummyword\udotaccent + \definedummyword\dotless + % + % Texinfo font commands. + \definedummyword\b + \definedummyword\i + \definedummyword\r + \definedummyword\sansserif + \definedummyword\sc + \definedummyword\slanted + \definedummyword\t + % + % Commands that take arguments. + \definedummyword\abbr + \definedummyword\acronym + \definedummyword\anchor + \definedummyword\cite + \definedummyword\code + \definedummyword\command + \definedummyword\dfn + \definedummyword\dmn + \definedummyword\email + \definedummyword\emph + \definedummyword\env + \definedummyword\file + \definedummyword\image + \definedummyword\indicateurl + \definedummyword\inforef + \definedummyword\kbd + \definedummyword\key + \definedummyword\math + \definedummyword\option + \definedummyword\pxref + \definedummyword\ref + \definedummyword\samp + \definedummyword\strong + \definedummyword\tie + \definedummyword\U + \definedummyword\uref + \definedummyword\url + \definedummyword\var + \definedummyword\verb + \definedummyword\w + \definedummyword\xref +} + +% For testing: output @{ and @} in index sort strings as \{ and \}. +\newif\ifusebracesinindexes + +\let\indexlbrace\relax +\let\indexrbrace\relax + +{\catcode`\@=0 +\catcode`\\=13 + @gdef@backslashdisappear{@def\{}} +} + +{ +\catcode`\<=13 +\catcode`\-=13 +\catcode`\`=13 + \gdef\indexnonalnumdisappear{% + \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else + % @set txiindexlquoteignore makes us ignore left quotes in the sort term. + % (Introduced for FSFS 2nd ed.) + \let`=\empty + \fi + % + \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else + \backslashdisappear + \fi + % + \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else + \def-{}% + \fi + \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else + \def<{}% + \fi + \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else + \def\@{}% + \fi + } + + \gdef\indexnonalnumreappear{% + \useindexbackslash + \let-\normaldash + \let<\normalless + \def\@{@}% + } +} + + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + % Accent commands should become @asis. + \def\definedummyaccent##1{\let##1\asis}% + % We can just ignore other control letters. + \def\definedummyletter##1{\let##1\empty}% + % All control words become @asis by default; overrides below. + \let\definedummyword\definedummyaccent + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + \def\_{\normalunderscore}% + \def\-{}% @- shouldn't affect sorting + % + \def\lbracechar{{\indexlbrace}}% + \def\rbracechar{{\indexrbrace}}% + \let\{=\lbracechar + \let\}=\rbracechar + % + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\DH{DZZ}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\TH{TH}% + \def\aa{aa}% + \def\ae{ae}% + \def\dh{dzz}% + \def\exclamdown{!}% + \def\l{l}% + \def\oe{oe}% + \def\ordf{a}% + \def\ordm{o}% + \def\o{o}% + \def\questiondown{?}% + \def\ss{ss}% + \def\th{th}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\arrow{->}% + \def\bullet{bullet}% + \def\comma{,}% + \def\copyright{copyright}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\euro{euro}% + \def\expansion{==>}% + \def\geq{>=}% + \def\guillemetleft{<<}% + \def\guillemetright{>>}% + \def\guilsinglleft{<}% + \def\guilsinglright{>}% + \def\leq{<=}% + \def\minus{-}% + \def\point{.}% + \def\pounds{pounds}% + \def\print{-|}% + \def\quotedblbase{"}% + \def\quotedblleft{"}% + \def\quotedblright{"}% + \def\quoteleft{`}% + \def\quoteright{'}% + \def\quotesinglbase{,}% + \def\registeredsymbol{R}% + \def\result{=>}% + \def\textdegree{o}% + % + % We need to get rid of all macros, leaving only the arguments (if present). + % Of course this is not nearly correct, but it is the best we can do for now. + % makeinfo does not expand macros in the argument to @deffn, which ends up + % writing an index entry, and texindex isn't prepared for an index sort entry + % that starts with \. + % + % Since macro invocations are followed by braces, we can just redefine them + % to take a single TeX argument. The case of a macro invocation that + % goes to end-of-line is not handled. + % + \macrolist +} + + +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. +% TODO: Two-level index? Operation index? + +% Workhorse for all indexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + \requireopenindexfile{#1}% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \safewhatsit\dosubindwrite + }% + \fi +} + +% Check if an index file has been opened, and if not, open it. +\def\requireopenindexfile#1{% +\ifnum\csname #1indfile\endcsname=0 + \expandafter\newwrite \csname#1indfile\endcsname + \edef\suffix{#1}% + % A .fls suffix would conflict with the file extension for the output + % of -recorder, so use .f1s instead. + \ifx\suffix\indexisfl\def\suffix{f1}\fi + % Open the file + \immediate\openout\csname#1indfile\endcsname \jobname.\suffix + % Using \immediate here prevents an object entering into the current box, + % which could confound checks such as those in \safewhatsit for preceding + % skips. +\fi} +\def\indexisfl{fl} + +% Output \ as {\indexbackslash}, because \ is an escape character in +% the index files. +\let\indexbackslash=\relax +{\catcode`\@=0 \catcode`\\=\active + @gdef@useindexbackslash{@def\{{@indexbackslash}}} +} + +% Definition for writing index entry text. +\def\sortas#1{\ignorespaces}% + +% Definition for writing index entry sort key. Should occur at the at +% the beginning of the index entry, like +% @cindex @sortas{september} \september +% The \ignorespaces takes care of following space, but there's no way +% to remove space before it. +{ +\catcode`\-=13 +\gdef\indexwritesortas{% + \begingroup + \indexnonalnumreappear + \indexwritesortasxxx} +\gdef\indexwritesortasxxx#1{% + \xdef\indexsortkey{#1}\endgroup} +} + + +% Write the entry in \toks0 to the index file. +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \useindexbackslash % \indexbackslash isn't defined now so it will be output + % as is; and it will print as backslash. + % Get the string to sort by, by processing the index entry with all + % font commands turned off. + {\indexnofonts + \indexnonalnumdisappear + \xdef\indexsortkey{}% + \let\sortas=\indexwritesortas + \edef\temp{\the\toks0}% + \setbox\dummybox = \hbox{\temp}% Make sure to execute any \sortas + \ifx\indexsortkey\empty + \xdef\indexsortkey{\temp}% + \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi + \fi + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsortkey}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} +\newbox\dummybox % used above + +% Take care of unwanted page breaks/skips around a whatsit: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write or \pdfdest will make \lastskip zero. The result is that +% sequences like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +\newskip\whatsitskip +\newcount\whatsitpenalty +% +% ..., ready, GO: +% +\def\safewhatsit#1{\ifhmode + #1% + \else + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \whatsitskip = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \whatsitpenalty = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\whatsitskip glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\whatsitskip + \fi + % + #1% + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +\fi} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \plainfrenchspacing + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + % See comment in \requireopenindexfile. + \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi + \openin 1 \jobname.\indexname s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + \catcode`\\ = 0 + \escapechar = `\\ + % + % 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 \thisline + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\ttbackslash}% + \let\indexlbrace\{ % Likewise, set these sequences for braces + \let\indexrbrace\} % used in the sort key. + \begindoublecolumns + \let\entryorphanpenalty=\indexorphanpenalty + % + % Read input from the index file line by line. + \loopdo + \ifeof1 + \let\firsttoken\relax + \else + \read 1 to \nextline + \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}% + \act + \fi + \thisline + % + \ifeof1\else + \let\thisline\nextline + \repeat + %% + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +\def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken} +\long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1} + +\def\loopdo#1\repeat{\def\body{#1}\loopdoxxx} +\def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 +\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 +\catcode`\$=3 +\gdef\initialglyphs{% + % Some changes for non-alphabetic characters. Using the glyphs from the + % math fonts looks more consistent than the typewriter font used elsewhere + % for these characters. + \def\indexbackslash{\math{\backslash}}% + \let\\=\indexbackslash + % + % Can't get bold backslash so don't use bold forward slash + \catcode`\/=13 + \def/{{\secrmnotbold \normalslash}}% + \def-{{\normaldash\normaldash}}% en dash `--' + \def^{{\chapbf \normalcaret}}% + \def~{{\chapbf \normaltilde}}% + \def\_{% + \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% + \def|{$\vert$}% + \def<{$\less$}% + \def>{$\gtr$}% + \def+{$\normalplus$}% +}} + +\def\initial{% + \bgroup + \initialglyphs + \initialx +} + +\def\initialx#1{% + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + % The glue before the bonus allows a little bit of space at the + % bottom of a column to reduce an increase in inter-line spacing. + \nobreak + \vskip 0pt plus 5\baselineskip + \penalty -300 + \vskip 0pt plus -5\baselineskip + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus 1\baselineskip + \leftline{\secfonts \kern-0.05em \secbf #1}% + % \secfonts is inside the argument of \leftline so that the change of + % \baselineskip will not affect any glue inserted before the vbox that + % \leftline creates. + % Do our best not to break after the initial. + \nobreak + \vskip .33\baselineskip plus .1\baselineskip + \egroup % \initialglyphs +} + +\newdimen\entryrightmargin +\entryrightmargin=0pt + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % No extra space above this paragraph. + \parskip = 0in + % + % When reading the text of entry, convert explicit line breaks + % from @* into spaces. The user might give these in long section + % titles, for instance. + \def\*{\unskip\space\ignorespaces}% + \def\entrybreak{\hfil\break}% An undocumented command + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus0.5pt + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\entrybreak{\unskip\space\ignorespaces}% +\def\doentry{% + % Save the text of the entry + \global\setbox\boxA=\hbox\bgroup + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. + % Not absorbing as a macro argument reduces the chance of problems + % with catcodes occurring. +} +{\catcode`\@=11 +\gdef\finishentry#1{% + \egroup % end box A + \dimen@ = \wd\boxA % Length of text of entry + \global\setbox\boxA=\hbox\bgroup\unhbox\boxA + % #1 is the page number. + % + % Get the width of the page numbers, and only use + % leaders if they are present. + \global\setbox\boxB = \hbox{#1}% + \ifdim\wd\boxB = 0pt + \null\nobreak\hfill\ % + \else + % + \null\nobreak\indexdotfill % Have leaders before the page number. + % + \ifpdf + \pdfgettoks#1.% + \hskip\skip\thinshrinkable\the\toksA + \else + \hskip\skip\thinshrinkable #1% + \fi + \fi + \egroup % end \boxA + \ifdim\wd\boxB = 0pt + \global\setbox\entryindexbox=\box\boxA + \else + \global\setbox\entryindexbox=\vbox\bgroup\noindent + % We want the text of the entries to be aligned to the left, and the + % page numbers to be aligned to the right. + % + \advance\leftskip by 0pt plus 1fil + \advance\leftskip by 0pt plus -1fill + \rightskip = 0pt plus -1fil + \advance\rightskip by 0pt plus 1fill + % Cause last line, which could consist of page numbers on their own + % if the list of page numbers is long, to be aligned to the right. + \parfillskip=0pt plus -1fill + % + \hangindent=1em + % + \advance\rightskip by \entryrightmargin + % Determine how far we can stretch into the margin. + % This allows, e.g., "Appendix H GNU Free Documentation License" to + % fit on one line in @letterpaper format. + \ifdim\entryrightmargin>2.1em + \dimen@i=2.1em + \else + \dimen@i=0em + \fi + \advance \parfillskip by 0pt minus 1\dimen@i + % + \dimen@ii = \hsize + \advance\dimen@ii by -1\leftskip + \advance\dimen@ii by -1\entryrightmargin + \advance\dimen@ii by 1\dimen@i + \let\maybestrut=\relax + \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line + \let\maybestrut=\strut + \ifdim\dimen@ > 0.8\dimen@ii % due to long index text + \dimen@ = 0.7\dimen@ % Try to split the text roughly evenly + \dimen@ii = \hsize + \advance \dimen@ii by -1em + \ifnum\dimen@>\dimen@ii + % If the entry is too long, use the whole line + \dimen@ = \dimen@ii + \fi + \advance\leftskip by 0pt plus 1fill % ragged right + \advance \dimen@ by 1\rightskip + \parshape = 2 0pt \dimen@ 1em \dimen@ii + % Ideally we'd add a finite glue at the end of the first line only, but + % TeX doesn't seem to provide a way to do such a thing. + \fi\fi + \maybestrut % Add a strut on the first and last lines + \unhbox\boxA + \maybestrut + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % Word spacing - no stretch + \spaceskip=\fontdimen2\font minus \fontdimen4\font + % + \linepenalty=1000 % Discourage line breaks. + \hyphenpenalty=5000 % Discourage hyphenation. + % + \par % format the paragraph + \egroup % The \vbox + \fi + \endgroup + % delay text of entry until after penalty + \bgroup\aftergroup\insertindexentrybox + \entryorphanpenalty +}} + +\newskip\thinshrinkable +\skip\thinshrinkable=.15em minus .15em + +\newbox\entryindexbox +\def\insertindexentrybox{% +\lineskip=0pt % This comes into effect when the \vbox has a large + % height due to the paragraph in it having several + % lines. +\box\entryindexbox} + +% Default is no penalty +\let\entryorphanpenalty\egroup + +% Used from \printindex. \firsttoken should be the first token +% after the \entry. If it's not another \entry, we are at the last +% line of a group of index entries, so insert a penalty to discourage +% orphaned index entries. +\long\def\indexorphanpenalty{% + \def\isentry{\entry}% + \ifx\firsttoken\isentry + \else + \unskip\penalty 9000 + % The \unskip here stops breaking before the glue. It relies on the + % \vskip above being there, otherwise there is an error + % "You can't use `\unskip' in vertical mode". There has to be glue + % in the current vertical list that hasn't been added to the + % "current page". See Chapter 24 of the TeXbook. This contradicts + % Section 8.3.7 in "TeX by Topic," though. + \fi + \egroup % now comes the box added with \aftergroup +} + +% Like plain.tex's \dotfill, except uses up at least 1 em. +% The filll stretch here overpowers both the fil and fill stretch to push +% the page number to the right. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} + + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize +\newdimen\doublecolumntopgap +\doublecolumntopgap = 0pt + +\newtoks\savedtopmark % Used in \begindoublecolumns +\newtoks\savedfirstmark + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + % Save \topmark and \firstmark + \global\savedtopmark=\expandafter{\topmark}% + \global\savedfirstmark=\expandafter{\firstmark}% + }% + \eject % run that output routine to set \partialpage + % + % We recover the two marks that the last output routine saved in order + % to propagate the information in marks added around a chapter heading, + % which could be otherwise be lost by the time the final page is output. + % + \mark{\the\savedtopmark}% Only mark in page passed to following \output. + \output = {% + \setbox0=\box\PAGE % clear box 255 + }abc\eject + % + \mark{\the\savedfirstmark}% + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \global\doublecolumntopgap = \topskip + \global\advance\doublecolumntopgap by -1\baselineskip + \global\advance\vsize by -1\doublecolumntopgap + \vsize = 2\vsize + \topskip=0pt +} + +% The double-column output routine for all double-column pages except +% the last, which is done by \balancecolumns. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \vbox{% + \vskip\doublecolumntopgap + \hbox to\pagewidth{\box0\hfil\box2}}% +} + + +% Finished with with double columns. +\def\enddoublecolumns{% + % The following penalty ensures that the page builder is exercised + % _before_ we change the output routine. This is necessary in the + % following situation: + % + % The last section of the index consists only of a single entry. + % Before this section, \pagetotal is less than \pagegoal, so no + % break occurs before the last section starts. However, the last + % section, consisting of \initial and the single \entry, does not + % fit on the page and has to be broken off. Without the following + % penalty the page builder will not be exercised until \eject + % below, and by that time we'll already have changed the output + % routine to the \balancecolumns version, so the next-to-last + % double-column page will be processed with \balancecolumns, which + % is wrong: The two columns will go to the main vertical list, with + % the broken-off section in the recent contributions. As soon as + % the output routine finishes, TeX starts reconsidering the page + % break. The two columns and the broken-off section both fit on the + % page, because the two columns now take up only half of the page + % goal. When TeX sees \eject from below which follows the final + % section, it invokes the new output routine that we've set after + % \balancecolumns below; \onepageout will try to fit the two columns + % and the final section into the vbox of \pageheight (see + % \pagebody), causing an overfull box. + % + % Note that glue won't work here, because glue does not exercise the + % page builder, unlike penalties (see The TeXbook, pp. 280-281). + \penalty0 + % + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Only called for the last of the double column material. \doublecolumnout +% does the others. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \ifdim\dimen@<14\baselineskip + % Don't split a short final column in two. + \setbox2=\vbox{}% + \else + \divide\dimen@ by 2 % target to split to + \dimen@ii = \dimen@ + \splittopskip = \topskip + % Loop until the second column is no higher than the first + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + % Remove glue from bottom of first column to + % make sure it is higher than the second. + \global\setbox1 = \vbox{\unvbox1\unpenalty\unskip}% + \ifdim\ht3>\ht1 + \global\advance\dimen@ by 1pt + \repeat + }% + \multiply\dimen@ii by 4 + \divide\dimen@ii by 5 + \ifdim\ht3<\dimen@ii + % Column heights are too different, so don't make their bottoms + % flush with each other. The glue at the end of the second column + % allows a second column to stretch, reducing the difference in + % height between the two. + \setbox0=\vbox to\dimen@{\unvbox1\vfill}% + \setbox2=\vbox to\dimen@{\unvbox3\vskip 0pt plus 0.3\ht0}% + \else + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + \fi + \fi + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% Let's start with @part. +\outer\parseargdef\part{\partzzz{#1}} +\def\partzzz#1{% + \chapoddpage + \null + \vskip.3\vsize % move it down on the page a bit + \begingroup + \noindent \titlefonts\rmisbold #1\par % the text + \let\lastnode=\empty % no node to associate with + \writetocentry{part}{#1}{}% but put it in the toc + \headingsoff % no headline or footline on the part page + % This outputs a mark at the end of the page that clears \thischapter + % and \thissection, as is done in \startcontents. + \let\pchapsepmacro\relax + \chapmacro{}{Yomitfromtoc}{}% + \chapoddpage + \endgroup +} + +% \unnumberedno is an oxymoron. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines these (using marks) as the number+name, number +% and name of the chapter. Page headings and footings can use +% these. @section does likewise. +\def\thischapter{} +\def\thischapternum{} +\def\thischaptername{} +\def\thissection{} +\def\thissectionnum{} +\def\thissectionname{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@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 + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achieve this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unnlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unnlevel + \chardef\unnlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unnlevel + \def\headtype{U}% + \else + \chardef\unnlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + % \putwordChapter can contain complex things in translations. + \toks0=\expandafter{\putwordChapter}% + \message{\the\toks0 \space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz +% +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + % \putwordAppendix can contain complex things in translations. + \toks0=\expandafter{\putwordAppendix}% + \message{\the\toks0 \space \appendixletter}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +% normally unnmhead0 calls unnumberedzzz: +\outer\parseargdef\unnumbered{\unnmhead0{#1}} +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % 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 to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +% +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +% normally calls appendixsectionzzz: +\outer\parseargdef\appendixsection{\apphead1{#1}} +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +% normally calls unnumberedseczzz: +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +% +% normally calls numberedsubseczzz: +\outer\parseargdef\numberedsubsec{\numhead2{#1}} +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +% normally calls appendixsubseczzz: +\outer\parseargdef\appendixsubsec{\apphead2{#1}} +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +% normally calls unnumberedsubseczzz: +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +% +% normally numberedsubsubseczzz: +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% normally appendixsubsubseczzz: +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% normally unnumberedsubsubseczzz: +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% 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. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip \nobreak + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% 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} + +% Parameter controlling skip before chapter headings (if needed) +\newskip\chapheadingskip + +% Define plain chapter starts, and page on/off switching for it. +\def\chapbreak{\dobreak \chapheadingskip {-4000}} + +% Start a new page +\def\chappager{\par\vfill\supereject} + +% \chapoddpage - start on an odd page for a new chapter +% Because \domark is called before \chapoddpage, the filler page will +% get the headings for the next chapter, which is wrong. But we don't +% care -- we just disable all headings on the filler page. +\def\chapoddpage{% + \chappager + \ifodd\pageno \else + \begingroup + \headingsoff + \null + \chappager + \endgroup + \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 + +% \chapmacro - Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% Not used for @heading series. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yappendixkeyword{Yappendix} +\def\Yomitfromtockeyword{Yomitfromtoc} +% +\def\chapmacro#1#2#3{% + \checkenv{}% chapters, etc., should not start inside an environment. + % + % Insert the first mark before the heading break (see notes for \domark). + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% + \gdef\thissection{}}% + % + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{\thischaptername}}% + \else\ifx\temptype\Yomitfromtockeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{}}% + \else\ifx\temptype\Yappendixkeyword + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\appendixletter}% + % \noexpand\putwordAppendix avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \else + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\the\chapno}% + % \noexpand\putwordChapter avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordChapter{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert the chapter heading break. + \pchapsepmacro + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \domark + % + {% + \chapfonts \rmisbold + \let\footnote=\errfootnoteheading % give better error message + % + % Have to define \lastsection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\lastsection{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. + \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% + \nobreak\bigskip \nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text of the title, +% #2 is the section level (sec/subsec/subsubsec), +% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), +% #4 is the section number. +% +\def\seckeyword{sec} +% +\def\sectionheading#1#2#3#4{% + {% + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % It is ok for the @heading series commands to appear inside an + % environment (it's been historically allowed, though the logic is + % dubious), but not the others. + \ifx\temptype\Yomitfromtockeyword\else + \checkenv{}% non-@*heading should not be in an environment. + \fi + \let\footnote=\errfootnoteheading + % + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rmisbold + % + % Insert first mark before the heading break (see notes for \domark). + \let\prevsectiondefs=\lastsectiondefs + \ifx\temptype\Ynothingkeyword + \ifx\sectionlevel\seckeyword + \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% + \gdef\thissection{\thissectionname}}% + \fi + \else\ifx\temptype\Yomitfromtockeyword + % Don't redefine \thissection. + \else\ifx\temptype\Yappendixkeyword + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \else + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \fi\fi\fi + % + % Go into vertical mode. Usually we'll already be there, but we + % don't want the following whatsit to end up in a preceding paragraph + % if the document didn't happen to have a blank line. + \par + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \global\let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\lastsection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \lastsection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\lastsection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\lastsection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chapmacro. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chapmacro. + \donoderef{#3}% + % + % Interline glue will be inserted when the vbox is completed. + % That glue will be a valid breakpoint for the page, since it'll be + % preceded by a whatsit (usually from the \donoderef, or from the + % \writetocentry if there was no node). We don't want to allow that + % break, since then the whatsits could end up on page n while the + % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. + \nobreak + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) However, when a paragraph is not started next + % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out + % or the negative glue will cause weirdly wrong output, typically + % obscuring the section heading with something else. + \vskip-\parskip + % + % This is so the last item on the main vertical list is a known + % \penalty > 10000, so \startdefun, etc., can recognize the situation + % and do the needful. + \penalty 10001 +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + {\atdummies + \edef\temp{% + \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% + \temp + }% + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + + +% These characters do not print properly in the Computer Modern roman +% fonts, so we must take special care. This is more or less redundant +% with the Texinfo input format setup at the end of this file. +% +\def\activecatcodes{% + \catcode`\"=\active + \catcode`\$=\active + \catcode`\<=\active + \catcode`\>=\active + \catcode`\\=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\|=\active + \catcode`\~=\active +} + + +% Read the toc file, which is essentially Texinfo input. +\def\readtocfile{% + \setupdatafile + \activecatcodes + \input \tocreadfilename +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \raggedbottom % Worry more about breakpoints than the bottom. + \entryrightmargin=\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + +% redefined for the two-volume lispref. We always output on +% \jobname.toc even if this is redefined. +% +\def\tocreadfilename{\jobname.toc} + +% Normal (long) toc. +% +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\partentry = \shortpartentry + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% 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, ... + +% Parts, in the main contents. Replace the part number, which doesn't +% exist, with an empty box. Let's hope all the numbers have the same width. +% Also ignore the page number, which is conventionally not printed. +\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} +\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} +% +% Parts, in the short toc. +\def\shortpartentry#1#2#3#4{% + \penalty-300 + \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip + \shortchapentry{{\bf #1}}{\numeralbox}{}{}% +} + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} + +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% 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 + % Move the page numbers slightly to the right + \advance\entryrightmargin by -0.05em + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% 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} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @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 @ character. + +\envdef\tex{% + \setupmarkupstyle{tex}% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \catcode `\`=\other + \catcode `\'=\other + \escapechar=`\\ + % + % ' is active in math mode (mathcode"8000). So reset it, and all our + % other math active characters (just in case), to plain's definitions. + \mathactive + % + % Inverse of the list at the beginning of the file. + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\sp=\ptexsp + \let\*=\ptexstar + %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode + \let\t=\ptext + \expandafter \let\csname top\endcsname=\ptextop % we've made it outer + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + \ifnum\lastpenalty<10000 + % Penalize breaking before the environment, because preceding text + % often leads into it. + \penalty100 + \fi + \vskip\envskipamount + \fi + \fi +}} + +\def\afterenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will +% also clear it, so that its embedded environments do the narrowing again. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % + % If this cartouche directly follows a sectioning command, we need the + % \parskip glue (backspaced over by default) or the cartouche can + % collide with the section heading. + \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi + % + \setbox\groupbox=\vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \addgroupbox + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\newdimen\nonfillparindent +\def\nonfillstart{% + \aboveenvbreak + \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + % Turn off paragraph indentation but redefine \indent to emulate + % the normal \indent. + \nonfillparindent=\parindent + \parindent = 0pt + \let\indent\nonfillindent + % + \emergencystretch = 0pt % don't try to avoid overfull boxes + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \let\exdent=\nofillexdent +} + +\begingroup +\obeyspaces +% We want to swallow spaces (but not other tokens) after the fake +% @indent in our nonfill-environments, where spaces are normally +% active and set to @tie, resulting in them not being ignored after +% @indent. +\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% +\gdef\nonfillindentcheck{% +\ifx\temp % +\expandafter\nonfillindentgobble% +\else% +\leavevmode\nonfillindentbox% +\fi% +}% +\endgroup +\def\nonfillindentgobble#1{\nonfillindent} +\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + % end paragraph for sake of leading, in case document has no blank + % line. This is redundant with what happens in \aboveenvbreak, but + % we need to do it before changing the fonts, and it's inconvenient + % to change the fonts afterward. + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it in one command. #1 is the env name, #2 the definition. +\def\makedispenvdef#1#2{% + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two environment synonyms (#1 and #2) for an environment. +\def\maketwodispenvdef#1#2#3{% + \makedispenvdef{#1}{#3}% + \makedispenvdef{#2}{#3}% +} +% +% @lisp: indented, narrowed, typewriter font; +% @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvdef{lisp}{example}{% + \nonfillstart + \tt\setupmarkupstyle{example}% + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenvdef{display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenvdef{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill\relax + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @raggedright does more-or-less normal line breaking but no right +% justification. From plain.tex. Don't stretch around special +% characters in urls in this environment, since the stretch at the right +% should be enough. +\envdef\raggedright{% + \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax + \def\urefprestretchamount{0pt}% + \def\urefpoststretchamount{0pt}% +} +\let\Eraggedright\par + +\envdef\raggedleft{% + \parindent=0pt \leftskip0pt plus2em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedleft\par + +\envdef\raggedcenter{% + \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedcenter\par + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\makedispenvdef{quotation}{\quotationstart} +% +\def\quotationstart{% + \indentedblockstart % same as \indentedblock, but increase right margin too. + \ifx\nonarrowing\relax + \advance\rightskip by \lispnarrowing + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\thisisundefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallquotation{\Equotation} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + +% @indentedblock is like @quotation, but indents only on the left and +% has no optional argument. +% +\makedispenvdef{indentedblock}{\indentedblockstart} +% +\def\indentedblockstart{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi +} + +% Keep a nonzero parskip for the environment, since we're doing normal filling. +% +\def\Eindentedblock{% + \par + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallindentedblock{\Eindentedblock} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% + % Don't do the quotes -- if we do, @set txicodequoteundirected and + % @set txicodequotebacktick will not have effect on @verb and + % @verbatim, and ?` and !` ligatures won't get disabled. + %\do\`\do\'% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \setupmarkupstyle{verb}% + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion. +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +% We typeset each line of the verbatim in an \hbox, so we can handle +% tabs. The \global is in case the verbatim line starts with an accent, +% or some other command that starts with a begin-group. Otherwise, the +% entire \verbbox would disappear at the corresponding end-group, before +% it is typeset. Meanwhile, we can't have nested verbatim commands +% (can we?), so the \global won't be overwriting itself. +\newbox\verbbox +\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} +% +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab + \divide\dimen\verbbox by\tabw + \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw + \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw + \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox + }% + } +\endgroup + +% start the verbatim environment. +\def\setupverbatim{% + \let\nonarrowing = t% + \nonfillstart + \tt % easiest (and conventionally used) font for verbatim + % The \leavevmode here is for blank lines. Otherwise, we would + % never \starttabox and the \egroup would end verbatim mode. + \def\par{\leavevmode\egroup\box\verbbox\endgraf}% + \tabexpand + \setupmarkupstyle{verbatim}% + % Respect line breaks, + % print special symbols as themselves, and + % make each space count. + % Must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \indexnofonts % Allow `@@' and other weird things in file names. + \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is desirable. +% +\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} +\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} +% +\def\insertcopying{% + \begingroup + \parindent = 0pt % paragraph indentation looks wrong on title page + \scanexp\copyingtext + \endgroup +} + + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt +\newcount\defunpenalty + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \defunpenalty=10003 % Will keep this @deffn together with the + % following @def command, see below. + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check specifically for penalty 10002, inserted + % by \printdefunline, instead of 10000, since the sectioning + % commands also insert a nobreak penalty, and we don't want to allow + % a break between a section heading and a defun. + % + % As a further refinement, we avoid "club" headers by signalling + % with penalty of 10003 after the very first @deffn in the + % sequence (see above), and penalty of 10002 after any following + % @def command. + \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil\relax + \endgraf + \nobreak\vskip -\parskip + \penalty\defunpenalty % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remaining is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) } +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \doingtypefnfalse % distinguish typed functions from all else + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +\newif\ifdoingtypefn % doing typed function? +\newif\ifrettypeownline % typeset return type on its own line? + +% @deftypefnnewline on|off says whether the return type of typed functions +% are printed on their own line. This affects @deftypefn, @deftypefun, +% @deftypeop, and @deftypemethod. +% +\parseargdef\deftypefnnewline{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @txideftypefnnl value `\temp', + must be on|off}% + \fi\fi +} + +% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \doingtypefntrue + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +% Types: + +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + \par + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % Determine if we are typesetting the return type of a typed function + % on a line by itself. + \rettypeownlinefalse + \ifdoingtypefn % doing a typed function specifically? + % then check user option for putting return type on its own line: + \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else + \rettypeownlinetrue + \fi + \fi + % + % How we'll format the category name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. We'll always have at + % least two. + \tempnum = 2 + % + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % + % If doing a return type on its own line, we'll have another line. + \ifrettypeownline + \advance\tempnum by 1 + \def\maybeshapeline{0in \hsize}% + \else + \def\maybeshapeline{}% + \fi + % + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % + % The final paragraph shape: + \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 + % + % Put the category name at the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% text of the return type + \ifx\temp\empty\else + \tclose{\temp}% typeset the return type + \ifrettypeownline + % put return type on its own line; prohibit line break following: + \hfil\vadjust{\nobreak}\break + \else + \space % type on same line, so just followed by a space + \fi + \fi % no return type + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. We used to recommend @var for that, so + % leave the code in, but it's strange for @var to lead to typewriter. + % Nowadays we recommend @code, since the difference between a ttsl hyphen + % and a tt hyphen is pretty tiny. @code also disables ?` !`. + \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% 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. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +% these should not use \errmessage; the glibc manual, at least, actually +% has such constructs (when documenting function pointers). +\def\badparencount{% + \message{Warning: unbalanced parentheses in @def...}% + \global\parencount=0 +} +\def\badbrackcount{% + \message{Warning: unbalanced square brackets in @def...}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\thisisundefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\let\aftermacroxxx\relax +\def\aftermacro{\aftermacroxxx} + +% alias because \c means cedilla in @tex or @math +\let\texinfoc=\c + +% Used at the time of macro expansion. +% Argument is macro body with arguments substituted +\def\scanmacro#1{% + \newlinechar`\^^M + \def\xprocessmacroarg{\eatspaces}% + % + % Process the macro body under the current catcode regime. + \scantokens{#1\texinfoc}\aftermacro% + % + % The \c is to remove the \newlinechar added by \scantokens, and + % can be noticed by \parsearg. + % The \aftermacro allows a \comment at the end of the macro definition + % to duplicate itself past the final \newlinechar added by \scantokens: + % this is used in the definition of \group to comment out a newline. We + % don't do the same for \c to support Texinfo files with macros that ended + % with a @c, which should no longer be necessary. + % We avoid surrounding the call to \scantokens with \bgroup and \egroup + % to allow macros to open or close groups themselves. +} + +\def\scanexp#1{% + \bgroup + % Undo catcode changes of \startcontents and \printindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. + % FIXME: This may not be needed. + %\catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + \edef\temp{\noexpand\scanmacro{#1}}% + \temp + \egroup +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? + +% List of all defined macros in the form +% \definedummyword\macro1\definedummyword\macro2... +% Currently is also contains all @aliases; the list can be split +% if there is a need. +\def\macrolist{} + +% Add the macro to \macrolist +\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} +\def\addtomacrolistxxx#1{% + \toks0 = \expandafter{\macrolist\definedummyword#1}% + \xdef\macrolist{\the\toks0}% +} + +% Utility routines. +% This does \let #1 = #2, with \csnames; that is, +% \let \csname#1\endcsname = \csname#2\endcsname +% (except of course we have to play expansion games). +% +\def\cslet#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname + \csname#2\endcsname +} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \ +% to recognize macro arguments; this is the job of \mbodybackslash. +% +% Non-ASCII encodings make 8-bit characters active, so un-activate +% them to avoid their expansion. Must do this non-globally, to +% confine the change to the current group. +% +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. +% +\def\scanctxt{% used as subroutine + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other + \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +} + +\def\scanargctxt{% used for copying and captions, not macros. + \scanctxt + \catcode`\@=\other + \catcode`\\=\other + \catcode`\^^M=\other +} + +\def\macrobodyctxt{% used for @macro definitions + \scanctxt + \catcode`\ =\other + \catcode`\@=\other + \catcode`\{=\other + \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash +} + +% Used when scanning braced macro arguments. Note, however, that catcode +% changes here are ineffectual if the macro invocation was nested inside +% an argument to another Texinfo command. +\def\macroargctxt{% + \scanctxt + \catcode`\ =\active + \catcode`\^^M=\other + \catcode`\\=\active +} + +\def\macrolineargctxt{% used for whole-line arguments without braces + \scanctxt + \catcode`\{=\other + \catcode`\}=\other +} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. +% +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\margbackslash#1{\char`\#1 } + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0\relax + \else + \expandafter\parsemargdef \argl;% + \if\paramno>256\relax + \ifx\eTeXversion\thisisundefined + \errhelp = \EMsimple + \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} + \fi + \fi + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + \addtomacrolist{\the\macname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\definedummyword\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx #1\relax + % remove this + \else + \noexpand\definedummyword \noexpand#1% + \fi +} + +% \getargs -- Parse the arguments to a @macro line. Set \macname to +% the name of the macro, and \argl to the braced argument list. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname#1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} +% This made use of the feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. + +% Parse the optional {params} list to @macro or @rmacro. +% Set \paramno to the number of arguments, +% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a +% three-param macro.) Define \macarg.BLAH for each BLAH in the params +% list to some hook where the argument is to be expanded. If there are +% less than 10 arguments that hook is to be replaced by ##N where N +% is the position in that list, that is to say the macro arguments are to be +% defined `a la TeX in the macro body. +% +% That gets used by \mbodybackslash (above). +% +% If there are 10 or more arguments, a different technique is used: see +% \parsemmanyargdef. +% +\def\parsemargdef#1;{% + \paramno=0\def\paramlist{}% + \let\hash\relax + % \hash is redefined to `#' later to get it into definitions + \let\processmacroarg\relax + \parsemargdefxxx#1,;,% + \ifnum\paramno<10\relax\else + \paramno0\relax + \parsemmanyargdef@@#1,;,% 10 or more arguments + \fi +} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1 + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\processmacroarg{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% \parsemacbody, \parsermacbody +% +% Read recursive and nonrecursive macro bodies. (They're different since +% rec and nonrec macros end differently.) +% +% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro +% body to be transformed. +% Set \macrobody to the body of the macro, and call \defmacro. +% +{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% +{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% + +% Make @ a letter, so that we can make private-to-Texinfo macro names. +\edef\texiatcatcode{\the\catcode`\@} +\catcode `@=11\relax + +%%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%% + +% If there are 10 or more arguments, a different technique is used, where the +% hook remains in the body, and when macro is to be expanded the body is +% processed again to replace the arguments. +% +% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the +% argument N value and then \edef the body (nothing else will expand because of +% the catcode regime under which the body was input). +% +% If you compile with TeX (not eTeX), and you have macros with 10 or more +% arguments, no macro can have more than 256 arguments (else error). +% +% In case that there are 10 or more arguments we parse again the arguments +% list to set new definitions for the \macarg.BLAH macros corresponding to +% each BLAH argument. It was anyhow needed to parse already once this list +% in order to count the arguments, and as macros with at most 9 arguments +% are by far more frequent than macro with 10 or more arguments, defining +% twice the \macarg.BLAH macros does not cost too much processing power. +\def\parsemmanyargdef@@#1,{% + \if#1;\let\next=\relax + \else + \let\next=\parsemmanyargdef@@ + \edef\tempb{\eatspaces{#1}}% + \expandafter\def\expandafter\tempa + \expandafter{\csname macarg.\tempb\endcsname}% + % Note that we need some extra \noexpand\noexpand, this is because we + % don't want \the to be expanded in the \parsermacbody as it uses an + % \xdef . + \expandafter\edef\tempa + {\noexpand\noexpand\noexpand\the\toks\the\paramno}% + \advance\paramno by 1\relax + \fi\next} + + +\let\endargs@\relax +\let\nil@\relax +\def\nilm@{\nil@}% +\long\def\nillm@{\nil@}% + +% This macro is expanded during the Texinfo macro expansion, not during its +% definition. It gets all the arguments' values and assigns them to macros +% macarg.ARGNAME +% +% #1 is the macro name +% #2 is the list of argument names +% #3 is the list of argument values +\def\getargvals@#1#2#3{% + \def\macargdeflist@{}% + \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. + \def\paramlist{#2,\nil@}% + \def\macroname{#1}% + \begingroup + \macroargctxt + \def\argvaluelist{#3,\nil@}% + \def\@tempa{#3}% + \ifx\@tempa\empty + \setemptyargvalues@ + \else + \getargvals@@ + \fi +} +\def\getargvals@@{% + \ifx\paramlist\nilm@ + % Some sanity check needed here that \argvaluelist is also empty. + \ifx\argvaluelist\nillm@ + \else + \errhelp = \EMsimple + \errmessage{Too many arguments in macro `\macroname'!}% + \fi + \let\next\macargexpandinbody@ + \else + \ifx\argvaluelist\nillm@ + % No more arguments values passed to macro. Set remaining named-arg + % macros to empty. + \let\next\setemptyargvalues@ + \else + % pop current arg name into \@tempb + \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% + \expandafter\@tempa\expandafter{\paramlist}% + % pop current argument value into \@tempc + \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% + \expandafter\@tempa\expandafter{\argvaluelist}% + % Here \@tempb is the current arg name and \@tempc is the current arg value. + % First place the new argument macro definition into \@tempd + \expandafter\macname\expandafter{\@tempc}% + \expandafter\let\csname macarg.\@tempb\endcsname\relax + \expandafter\def\expandafter\@tempe\expandafter{% + \csname macarg.\@tempb\endcsname}% + \edef\@tempd{\long\def\@tempe{\the\macname}}% + \push@\@tempd\macargdeflist@ + \let\next\getargvals@@ + \fi + \fi + \next +} + +\def\push@#1#2{% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter#2% + \expandafter\expandafter\expandafter{% + \expandafter#1#2}% +} + +% Replace arguments by their values in the macro body, and place the result +% in macro \@tempa. +% +\def\macvalstoargs@{% + % To do this we use the property that token registers that are \the'ed + % within an \edef expand only once. So we are going to place all argument + % values into respective token registers. + % + % First we save the token context, and initialize argument numbering. + \begingroup + \paramno0\relax + % Then, for each argument number #N, we place the corresponding argument + % value into a new token list register \toks#N + \expandafter\putargsintokens@\saveparamlist@,;,% + % Then, we expand the body so that argument are replaced by their + % values. The trick for values not to be expanded themselves is that they + % are within tokens and that tokens expand only once in an \edef . + \edef\@tempc{\csname mac.\macroname .body\endcsname}% + % Now we restore the token stack pointer to free the token list registers + % which we have used, but we make sure that expanded body is saved after + % group. + \expandafter + \endgroup + \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% + } + +% Define the named-macro outside of this group and then close this group. +% +\def\macargexpandinbody@{% + \expandafter + \endgroup + \macargdeflist@ + % First the replace in body the macro arguments by their values, the result + % is in \@tempa . + \macvalstoargs@ + % Then we point at the \norecurse or \gobble (for recursive) macro value + % with \@tempb . + \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname + % Depending on whether it is recursive or not, we need some tailing + % \egroup . + \ifx\@tempb\gobble + \let\@tempc\relax + \else + \let\@tempc\egroup + \fi + % And now we do the real job: + \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% + \@tempd +} + +\def\putargsintokens@#1,{% + \if#1;\let\next\relax + \else + \let\next\putargsintokens@ + % First we allocate the new token list register, and give it a temporary + % alias \@tempb . + \toksdef\@tempb\the\paramno + % Then we place the argument value into that token list register. + \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname + \expandafter\@tempb\expandafter{\@tempa}% + \advance\paramno by 1\relax + \fi + \next +} + +% Trailing missing arguments are set to empty. +% +\def\setemptyargvalues@{% + \ifx\paramlist\nilm@ + \let\next\macargexpandinbody@ + \else + \expandafter\setemptyargvaluesparser@\paramlist\endargs@ + \let\next\setemptyargvalues@ + \fi + \next +} + +\def\setemptyargvaluesparser@#1,#2\endargs@{% + \expandafter\def\expandafter\@tempa\expandafter{% + \expandafter\def\csname macarg.#1\endcsname{}}% + \push@\@tempa\macargdeflist@ + \def\paramlist{#2}% +} + +% #1 is the element target macro +% #2 is the list macro +% #3,#4\endargs@ is the list value +\def\pop@#1#2#3,#4\endargs@{% + \def#1{#3}% + \def#2{#4}% +} +\long\def\longpop@#1#2#3,#4\endargs@{% + \long\def#1{#3}% + \long\def#2{#4}% +} + + +%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% + + + +% Remove following spaces at the expansion stage. +% This works because spaces are discarded before each argument when TeX is +% getting the arguments for a macro. +% This must not be immediately followed by a }. +\long\def\gobblespaces#1{#1} + +% This defines a Texinfo @macro or @rmacro, called by \parsemacbody. +% \macrobody has the body of the macro in it, with placeholders for +% its parameters, looking like "\processmacroarg{\hash 1}". +% \paramno is the number of parameters +% \paramlist is a TeX parameter text, e.g. "#1,#2,#3," +% There are eight cases: recursive and nonrecursive macros of zero, one, +% up to nine, and many arguments. +% \xdef is used so that macro definitions will survive the file +% they're defined in: @include reads the file inside a group. +% +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifnum\paramno=1 + \def\processmacroarg{\gobblespaces}% + % This removes the pair of braces around the argument. We don't + % use \eatspaces, because this can cause ends of lines to be lost + % when the argument to \eatspaces is read, leading to line-based + % commands like "@itemize" not being read correctly. + \else + \def\processmacroarg{\xprocessmacroarg}% + \let\xprocessmacroarg\relax + \fi + \ifrecursive %%%%%%%%%%%%%% Recursive %%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\macrobody}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname @@@\endcsname}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% + \expandafter\noexpand\csname\the\macname @@@@\endcsname{% + \noexpand\gobblespaces##1\empty}% + % The \empty is for \gobblespaces in case #1 is empty + }% + \expandafter\xdef\csname\the\macname @@@@\endcsname##1{% + \egroup\noexpand\scanmacro{\macrobody}}% + \else + \ifnum\paramno<10\relax % at most 9 + % See non-recursive section below for comments + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup + \noexpand\expandafter + \noexpand\macroargctxt + \noexpand\expandafter + \expandafter\noexpand\csname\the\macname @@\endcsname}% + \expandafter\xdef\csname\the\macname @@\endcsname##1{% + \noexpand\passargtomacro + \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% + \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname @@@@\endcsname\paramlist{% + \egroup\noexpand\scanmacro{\macrobody}}% + \else % 10 or more + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble + \fi + \fi + \else %%%%%%%%%%%%%%%%%%%%%% Non-recursive %%%%%%%%%%%%%%%%%%%%%%%%%% + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\macrobody}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname @@@\endcsname}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% + \expandafter\noexpand\csname\the\macname @@@@\endcsname{% + \noexpand\gobblespaces##1\empty}% + % The \empty is for \gobblespaces in case #1 is empty + }% + \expandafter\xdef\csname\the\macname @@@@\endcsname##1{% + \egroup + \noexpand\scanmacro{\macrobody}% + }% + \else % at most 9 + \ifnum\paramno<10\relax + % @MACNAME sets the context for reading the macro argument + % @MACNAME@@ gets the argument, processes backslashes and appends a + % comma. + % @MACNAME@@@ removes braces surrounding the argument list. + % @MACNAME@@@@ scans the macro body with arguments substituted. + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup + \noexpand\expandafter % This \expandafter skip any spaces after the + \noexpand\macroargctxt % macro before we change the catcode of space. + \noexpand\expandafter + \expandafter\noexpand\csname\the\macname @@\endcsname}% + \expandafter\xdef\csname\the\macname @@\endcsname##1{% + \noexpand\passargtomacro + \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% + \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname @@@@\endcsname\paramlist{% + \egroup\noexpand\scanmacro{\macrobody}}% + \else % 10 or more: + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse + \fi + \fi + \fi} + +\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +{\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape +@catcode`@_=11 % private names +@catcode`@!=11 % used as argument separator + +% \passargtomacro#1#2 - +% Call #1 with a list of tokens #2, with any doubled backslashes in #2 +% compressed to one. +% +% This implementation works by expansion, and not execution (so we cannot use +% \def or similar). This reduces the risk of this failing in contexts where +% complete expansion is done with no execution (for example, in writing out to +% an auxiliary file for an index entry). +% +% State is kept in the input stream: the argument passed to +% @look_ahead, @gobble_and_check_finish and @add_segment is +% +% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input) +% +% where: +% THE_MACRO - name of the macro we want to call +% ARG_RESULT - argument list we build to pass to that macro +% PENDING_BS - either a backslash or nothing +% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next + +@gdef@passargtomacro#1#2{% + @add_segment #1!{}@relax#2\@_finish\% +} +@gdef@_finish{@_finishx} @global@let@_finishx@relax + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 used to look ahead +% +% If the next token is not a backslash, process the rest of the argument; +% otherwise, remove the next token. +@gdef@look_ahead#1!#2#3#4{% + @ifx#4\% + @expandafter@gobble_and_check_finish + @else + @expandafter@add_segment + @fi#1!{#2}#4#4% +} + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 should be a backslash, which is gobbled. +% #5 looks ahead +% +% Double backslash found. Add a single backslash, and look ahead. +@gdef@gobble_and_check_finish#1!#2#3#4#5{% + @add_segment#1\!{}#5#5% +} + +@gdef@is_fi{@fi} + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 is input stream until next backslash +% +% Input stream is either at the start of the argument, or just after a +% backslash sequence, either a lone backslash, or a doubled backslash. +% NEXT_TOKEN contains the first token in the input stream: if it is \finish, +% finish; otherwise, append to ARG_RESULT the segment of the argument up until +% the next backslash. PENDING_BACKSLASH contains a backslash to represent +% a backslash just before the start of the input stream that has not been +% added to ARG_RESULT. +@gdef@add_segment#1!#2#3#4\{% +@ifx#3@_finish + @call_the_macro#1!% +@else + % append the pending backslash to the result, followed by the next segment + @expandafter@is_fi@look_ahead#1#2#4!{\}@fi + % this @fi is discarded by @look_ahead. + % we can't get rid of it with \expandafter because we don't know how + % long #4 is. +} + +% #1 - THE_MACRO +% #2 - ARG_RESULT +% #3 discards the res of the conditional in @add_segment, and @is_fi ends the +% conditional. +@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} + +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% \braceorline MAC is used for a one-argument macro MAC. It checks +% whether the next non-whitespace character is a {. It sets the context +% for reading the argument (slightly different in the two cases). Then, +% to read the argument, in the whole-line case, it then calls the regular +% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. +% +\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup + \macroargctxt + \expandafter\passargtomacro + \else + \macrolineargctxt\expandafter\parsearg + \fi \macnamexxx} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Make them active and then expand them all to nothing. +% +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \addtomacrolist{#1}% + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{% + \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \lastsection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \requireauxfile + \atdummies % preserve commands, but don't expand them + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\lastsection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout + }% + \fi +} + +% @xrefautosectiontitle on|off says whether @section(ing) names are used +% automatically in xrefs, if the third arg is not explicitly specified. +% This was provided as a "secret" @set xref-automatic-section-title +% variable, now it's official. +% +\parseargdef\xrefautomaticsectiontitle{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', + must be on|off}% + \fi\fi +} + +% +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref{\putwordsee{} \xrefXX} +\def\xref{\putwordSee{} \xrefXX} +\def\ref{\xrefXX} + +\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} +\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} +% +\newbox\toprefbox +\newbox\printedrefnamebox +\newbox\infofilenamebox +\newbox\printedmanualbox +% +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + % + % Get args without leading/trailing spaces. + \def\printedrefname{\ignorespaces #3}% + \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% + % + \def\infofilename{\ignorespaces #4}% + \setbox\infofilenamebox = \hbox{\infofilename\unskip}% + % + \def\printedmanual{\ignorespaces #5}% + \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% + % + % If the printed reference name (arg #3) was not explicitly given in + % the @xref, figure out what we want to use. + \ifdim \wd\printedrefnamebox = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax + % Not auto section-title: use node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Auto section-title: use chapter/section title inside + % the square brackets if we have it. + \ifdim \wd\printedmanualbox > 0pt + % It is in another manual, so we don't have it; use node name. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We (should) know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + {\indexnofonts + \turnoffactive + \makevalueexpandable + % This expands tokens, so do it after making catcode changes, so _ + % etc. don't get their TeX definitions. This ignores all spaces in + % #4, including (wrongly) those in the middle of the filename. + \getfilename{#4}% + % + % This (wrongly) does not take account of leading or trailing + % spaces in #1, which should be ignored. + \edef\pdfxrefdest{#1}% + \ifx\pdfxrefdest\empty + \def\pdfxrefdest{Top}% no empty targets + \else + \txiescapepdf\pdfxrefdest % escape PDF special chars + \fi + % + \leavevmode + \startlink attr{/Border [0 0 0]}% + \ifnum\filenamelength>0 + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \setcolor{\linkcolor}% + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd\printedrefnamebox = 0pt + \refx{#1-snt}{}% + \else + \printedrefname + \fi + % + % If the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd\printedmanualbox > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox 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 \wd\printedmanualbox > 0pt + % Cross-manual reference with a printed manual name. + % + \crossmanualxref{\cite{\printedmanual\unskip}}% + % + \else\ifdim \wd\infofilenamebox > 0pt + % Cross-manual reference with only an info filename (arg 4), no + % printed manual name (arg 5). This is essentially the same as + % the case above; we output the filename, since we have nothing else. + % + \crossmanualxref{\code{\infofilename\unskip}}% + % + \else + % Reference within this manual. + % + % _ (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 + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via the macro below so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \ifx,\tokenafterxref + \else\ifx.\tokenafterxref + \else\ifx;\tokenafterxref + \else\ifx)\tokenafterxref + \else,% add a , if xref not followed by punctuation + \fi\fi\fi\fi + \fi\fi + \fi + \endlink +\endgroup} + +% Output a cross-manual xref to #1. Used just above (twice). +% +% Only include the text "Section ``foo'' in" if the foo is neither +% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply +% "see The Foo Manual", the idea being to refer to the whole manual. +% +% But, this being TeX, we can't easily compare our node name against the +% string "Top" while ignoring the possible spaces before and after in +% the input. By adding the arbitrary 7sp below, we make it much less +% likely that a real node name would have the same width as "Top" (e.g., +% in a monospaced font). Hopefully it will never happen in practice. +% +% For the same basic reason, we retypeset the "Top" at every +% reference, since the current font is indeterminate. +% +\def\crossmanualxref#1{% + \setbox\toprefbox = \hbox{Top\kern7sp}% + \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% + \ifdim \wd2 > 7sp % nonempty? + \ifdim \wd2 = \wd\toprefbox \else % same as Top? + \putwordSection{} ``\printedrefname'' \putwordin{}\space + \fi + \fi + #1% +} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% 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{% + \requireauxfile + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + {\toks0 = {#1}% avoid expansion of possibly-complex value + \message{\linenumber Undefined cross reference `\the\toks0'.}}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + {% The node name might contain 8-bit characters, which in our current + % implementation are changed to commands like @'e. Don't let these + % mess up the control sequence name. + \indexnofonts + \turnoffactive + \xdef\safexrefname{#1}% + }% + % + \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR\safexrefname\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 + {\safexrefname}}% + \fi +} + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate at the beginning of the file. +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% Used when writing to the aux file, or when using data from it. +\def\requireauxfile{% + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi + \global\let\requireauxfile=\relax % Only do this once. +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readdatafile{aux}% + \global\havexrefstrue + \fi + \closein 1 +} + +\def\setupdatafile{% + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {\setnonasciicharscatcodenonglobal\other}% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 +} + +\def\readdatafile#1{% +\begingroup + \setupdatafile + \input\jobname.#1 +\endgroup} + + +\message{insertions,} +% including 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 + +{\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}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % + % Nested footnotes are not supported in TeX, that would take a lot + % more work. (\startsavinginserts does not suffice.) + \let\footnote=\errfootnotenest + % + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + % + % Invoke rest of plain TeX footnote routine. + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +\def\errfootnotenest{% + \errhelp=\EMsimple + \errmessage{Nested footnotes not supported in texinfo.tex, + even though they work in makeinfo; sorry} +} + +\def\errfootnoteheading{% + \errhelp=\EMsimple + \errmessage{Footnotes in chapters, sections, etc., are not supported} +} + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarly, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. +% +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\thisisundefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \else \ifx\centersub\centerV + % for @center @image, we need a vbox so we can have our vertical space + \imagevmodetrue + \vbox\bgroup % vbox has better behavior than vtop herev + \fi\fi + % + \ifimagevmode + \nobreak\medskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \fi + % + % Leave vertical mode so that indentation from an enclosing + % environment such as @quotation is respected. + % However, if we're at the top level, we don't want the + % normal paragraph indentation. + % On the other hand, if we are in the case of @center @image, we don't + % want to start a paragraph, which will create a hsize-width box and + % eradicate the centering. + \ifx\centersub\centerV\else \noindent \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode + \medskip % space after a standalone image + \fi + \ifx\centersub\centerV \egroup \fi +\endgroup} + + +% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, +% etc. We don't actually implement floating yet, we always include the +% float "here". But it seemed the best name for the future. +% +\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} + +% There may be a space before second and/or third parameter; delete it. +\def\eatcommaspace#1, {#1,} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \lastsection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\lastsection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline{\scanexp\thiscaption}% + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + % + % Space below caption. + \vskip\parskip + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \requireauxfile + \atdummies + % + % since we read the caption text in the macro world, where ^^M + % is turned into a normal character, we have to scan it back, so + % we don't write the literal three characters "^^M" into the aux file. + \scanexp{% + \xdef\noexpand\gtemp{% + \ifx\thisshortcaption\empty + \thiscaption + \else + \thisshortcaption + \fi + }% + }% + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident + \ifx\gtemp\empty \else : \gtemp \fi}}% + }% + \fi + \egroup % end of \vtop + % + % place the captured inserts + % + % BEWARE: when the floats start floating, we have to issue warning + % whenever an insert appears inside a float which could possibly + % float. --kasal, 26may04 + % + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\def\appendtomacro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} + +% @caption, @shortcaption +% +\def\caption{\docaption\thiscaption} +\def\shortcaption{\docaption\thisshortcaption} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \lastsection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + + +\message{localization,} + +% For single-language documents, @documentlanguage is usually given very +% early, just after @documentencoding. Single argument is the language +% (de) or locale (de_DE) abbreviation. +% +{ + \catcode`\_ = \active + \globaldefs=1 +\parseargdef\documentlanguage{% + \tex % read txi-??.tex file in plain TeX. + % Read the file by the name they passed if it exists. + \let_ = \normalunderscore % normal _ character for filename test + \openin 1 txi-#1.tex + \ifeof 1 + \documentlanguagetrywithoutunderscore #1_\finish + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 + \endgroup % end raw TeX +} +% +% If they passed de_DE, and txi-de_DE.tex doesn't exist, +% try txi-de.tex. +% +\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 +} +}% end of special _ catcode +% +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? Putting it in the current +directory should work if nowhere else does.} + +% This macro is called from txi-??.tex files; the first argument is the +% \language name to set (without the "\lang@" prefix), the second and +% third args are \{left,right}hyphenmin. +% +% The language names to pass are determined when the format is built. +% See the etex.log file created at that time, e.g., +% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. +% +% With TeX Live 2008, etex now includes hyphenation patterns for all +% available languages. This means we can support hyphenation in +% Texinfo, at least to some extent. (This still doesn't solve the +% accented characters problem.) +% +\catcode`@=11 +\def\txisetlanguage#1#2#3{% + % do not set the language if the name is undefined in the current TeX. + \expandafter\ifx\csname lang@#1\endcsname \relax + \message{no patterns for #1}% + \else + \global\language = \csname lang@#1\endcsname + \fi + % but there is no harm in adjusting the hyphenmin values regardless. + \global\lefthyphenmin = #2\relax + \global\righthyphenmin = #3\relax +} + +% Helpers for encodings. +% Set the catcode of characters 128 through 255 to the specified number. +% +\def\setnonasciicharscatcode#1{% + \count255=128 + \loop\ifnum\count255<256 + \global\catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +\def\setnonasciicharscatcodenonglobal#1{% + \count255=128 + \loop\ifnum\count255<256 + \catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +% @documentencoding sets the definition of non-ASCII characters +% according to the specified encoding. +% +\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} +\def\documentencodingzzz#1{% + % Encoding being declared for the document. + \def\declaredencoding{\csname #1.enc\endcsname}% + % + % Supported encodings: names converted to tokens in order to be able + % to compare them with \ifx. + \def\ascii{\csname US-ASCII.enc\endcsname}% + \def\latnine{\csname ISO-8859-15.enc\endcsname}% + \def\latone{\csname ISO-8859-1.enc\endcsname}% + \def\lattwo{\csname ISO-8859-2.enc\endcsname}% + \def\utfeight{\csname UTF-8.enc\endcsname}% + % + \ifx \declaredencoding \ascii + \asciichardefs + % + \else \ifx \declaredencoding \lattwo + \setnonasciicharscatcode\active + \lattwochardefs + % + \else \ifx \declaredencoding \latone + \setnonasciicharscatcode\active + \latonechardefs + % + \else \ifx \declaredencoding \latnine + \setnonasciicharscatcode\active + \latninechardefs + % + \else \ifx \declaredencoding \utfeight + \setnonasciicharscatcode\active + % since we already invoked \utfeightchardefs at the top level + % (below), do not re-invoke it, then our check for duplicated + % definitions triggers. Making non-ascii chars active is enough. + % + \else + \message{Ignoring unknown document encoding: #1.}% + % + \fi % utfeight + \fi % latnine + \fi % latone + \fi % lattwo + \fi % ascii +} + +% emacs-page +% A message to be logged when using a character that isn't available +% the default font encoding (OT1). +% +\def\missingcharmsg#1{\message{Character missing, sorry: #1.}} + +% Take account of \c (plain) vs. \, (Texinfo) difference. +\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} + +% First, make active non-ASCII characters in order for them to be +% correctly categorized when TeX reads the replacement text of +% macros containing the character definitions. +\setnonasciicharscatcode\active +% +% Latin1 (ISO-8859-1) character definitions. +\def\latonechardefs{% + \gdef^^a0{\tie} + \gdef^^a1{\exclamdown} + \gdef^^a2{{\tcfont \char162}} % cent + \gdef^^a3{\pounds} + \gdef^^a4{{\tcfont \char164}} % currency + \gdef^^a5{{\tcfont \char165}} % yen + \gdef^^a6{{\tcfont \char166}} % broken bar + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\copyright} + \gdef^^aa{\ordf} + \gdef^^ab{\guillemetleft} + \gdef^^ac{\ensuremath\lnot} + \gdef^^ad{\-} + \gdef^^ae{\registeredsymbol} + \gdef^^af{\={}} + % + \gdef^^b0{\textdegree} + \gdef^^b1{$\pm$} + \gdef^^b2{$^2$} + \gdef^^b3{$^3$} + \gdef^^b4{\'{}} + \gdef^^b5{$\mu$} + \gdef^^b6{\P} + \gdef^^b7{\ensuremath\cdot} + \gdef^^b8{\cedilla\ } + \gdef^^b9{$^1$} + \gdef^^ba{\ordm} + \gdef^^bb{\guillemetright} + \gdef^^bc{$1\over4$} + \gdef^^bd{$1\over2$} + \gdef^^be{$3\over4$} + \gdef^^bf{\questiondown} + % + \gdef^^c0{\`A} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\~A} + \gdef^^c4{\"A} + \gdef^^c5{\ringaccent A} + \gdef^^c6{\AE} + \gdef^^c7{\cedilla C} + \gdef^^c8{\`E} + \gdef^^c9{\'E} + \gdef^^ca{\^E} + \gdef^^cb{\"E} + \gdef^^cc{\`I} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\"I} + % + \gdef^^d0{\DH} + \gdef^^d1{\~N} + \gdef^^d2{\`O} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\~O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\O} + \gdef^^d9{\`U} + \gdef^^da{\'U} + \gdef^^db{\^U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\TH} + \gdef^^df{\ss} + % + \gdef^^e0{\`a} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\~a} + \gdef^^e4{\"a} + \gdef^^e5{\ringaccent a} + \gdef^^e6{\ae} + \gdef^^e7{\cedilla c} + \gdef^^e8{\`e} + \gdef^^e9{\'e} + \gdef^^ea{\^e} + \gdef^^eb{\"e} + \gdef^^ec{\`{\dotless i}} + \gdef^^ed{\'{\dotless i}} + \gdef^^ee{\^{\dotless i}} + \gdef^^ef{\"{\dotless i}} + % + \gdef^^f0{\dh} + \gdef^^f1{\~n} + \gdef^^f2{\`o} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\~o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\o} + \gdef^^f9{\`u} + \gdef^^fa{\'u} + \gdef^^fb{\^u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\th} + \gdef^^ff{\"y} +} + +% Latin9 (ISO-8859-15) encoding character definitions. +\def\latninechardefs{% + % Encoding is almost identical to Latin1. + \latonechardefs + % + \gdef^^a4{\euro} + \gdef^^a6{\v S} + \gdef^^a8{\v s} + \gdef^^b4{\v Z} + \gdef^^b8{\v z} + \gdef^^bc{\OE} + \gdef^^bd{\oe} + \gdef^^be{\"Y} +} + +% Latin2 (ISO-8859-2) character definitions. +\def\lattwochardefs{% + \gdef^^a0{\tie} + \gdef^^a1{\ogonek{A}} + \gdef^^a2{\u{}} + \gdef^^a3{\L} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\v L} + \gdef^^a6{\'S} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\v S} + \gdef^^aa{\cedilla S} + \gdef^^ab{\v T} + \gdef^^ac{\'Z} + \gdef^^ad{\-} + \gdef^^ae{\v Z} + \gdef^^af{\dotaccent Z} + % + \gdef^^b0{\textdegree} + \gdef^^b1{\ogonek{a}} + \gdef^^b2{\ogonek{ }} + \gdef^^b3{\l} + \gdef^^b4{\'{}} + \gdef^^b5{\v l} + \gdef^^b6{\'s} + \gdef^^b7{\v{}} + \gdef^^b8{\cedilla\ } + \gdef^^b9{\v s} + \gdef^^ba{\cedilla s} + \gdef^^bb{\v t} + \gdef^^bc{\'z} + \gdef^^bd{\H{}} + \gdef^^be{\v z} + \gdef^^bf{\dotaccent z} + % + \gdef^^c0{\'R} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\u A} + \gdef^^c4{\"A} + \gdef^^c5{\'L} + \gdef^^c6{\'C} + \gdef^^c7{\cedilla C} + \gdef^^c8{\v C} + \gdef^^c9{\'E} + \gdef^^ca{\ogonek{E}} + \gdef^^cb{\"E} + \gdef^^cc{\v E} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\v D} + % + \gdef^^d0{\DH} + \gdef^^d1{\'N} + \gdef^^d2{\v N} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\H O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\v R} + \gdef^^d9{\ringaccent U} + \gdef^^da{\'U} + \gdef^^db{\H U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\cedilla T} + \gdef^^df{\ss} + % + \gdef^^e0{\'r} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\u a} + \gdef^^e4{\"a} + \gdef^^e5{\'l} + \gdef^^e6{\'c} + \gdef^^e7{\cedilla c} + \gdef^^e8{\v c} + \gdef^^e9{\'e} + \gdef^^ea{\ogonek{e}} + \gdef^^eb{\"e} + \gdef^^ec{\v e} + \gdef^^ed{\'{\dotless{i}}} + \gdef^^ee{\^{\dotless{i}}} + \gdef^^ef{\v d} + % + \gdef^^f0{\dh} + \gdef^^f1{\'n} + \gdef^^f2{\v n} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\H o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\v r} + \gdef^^f9{\ringaccent u} + \gdef^^fa{\'u} + \gdef^^fb{\H u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\cedilla t} + \gdef^^ff{\dotaccent{}} +} + +% UTF-8 character definitions. +% +% This code to support UTF-8 is based on LaTeX's utf8.def, with some +% changes for Texinfo conventions. It is included here under the GPL by +% permission from Frank Mittelbach and the LaTeX team. +% +\newcount\countUTFx +\newcount\countUTFy +\newcount\countUTFz + +\gdef\UTFviiiTwoOctets#1#2{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\endcsname} +% +\gdef\UTFviiiThreeOctets#1#2#3{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} +% +\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} + +\gdef\UTFviiiDefined#1{% + \ifx #1\relax + \message{\linenumber Unicode char \string #1 not defined for Texinfo}% + \else + \expandafter #1% + \fi +} + +\begingroup + \catcode`\~13 + \catcode`\"12 + + \def\UTFviiiLoop{% + \global\catcode\countUTFx\active + \uccode`\~\countUTFx + \uppercase\expandafter{\UTFviiiTmp}% + \advance\countUTFx by 1 + \ifnum\countUTFx < \countUTFy + \expandafter\UTFviiiLoop + \fi} + + \countUTFx = "C2 + \countUTFy = "E0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiTwoOctets\string~}} + \UTFviiiLoop + + \countUTFx = "E0 + \countUTFy = "F0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiThreeOctets\string~}} + \UTFviiiLoop + + \countUTFx = "F0 + \countUTFy = "F4 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiFourOctets\string~}} + \UTFviiiLoop +\endgroup + +\def\globallet{\global\let} % save some \expandafter's below + +% @U{xxxx} to produce U+xxxx, if we support it. +\def\U#1{% + \expandafter\ifx\csname uni:#1\endcsname \relax + \errhelp = \EMsimple + \errmessage{Unicode character U+#1 not supported, sorry}% + \else + \csname uni:#1\endcsname + \fi +} + +\begingroup + \catcode`\"=12 + \catcode`\<=12 + \catcode`\.=12 + \catcode`\,=12 + \catcode`\;=12 + \catcode`\!=12 + \catcode`\~=13 + \gdef\DeclareUnicodeCharacter#1#2{% + \countUTFz = "#1\relax + %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% + \begingroup + \parseXMLCharref + \def\UTFviiiTwoOctets##1##2{% + \csname u8:##1\string ##2\endcsname}% + \def\UTFviiiThreeOctets##1##2##3{% + \csname u8:##1\string ##2\string ##3\endcsname}% + \def\UTFviiiFourOctets##1##2##3##4{% + \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \gdef\UTFviiiTmp{#2}% + % + \expandafter\ifx\csname uni:#1\endcsname \relax \else + \message{Internal error, already defined: #1}% + \fi + % + % define an additional control sequence for this code point. + \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp + \endgroup} + + \gdef\parseXMLCharref{% + \ifnum\countUTFz < "A0\relax + \errhelp = \EMsimple + \errmessage{Cannot define Unicode char value < 00A0}% + \else\ifnum\countUTFz < "800\relax + \parseUTFviiiA,% + \parseUTFviiiB C\UTFviiiTwoOctets.,% + \else\ifnum\countUTFz < "10000\relax + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% + \else + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiA!% + \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% + \fi\fi\fi + } + + \gdef\parseUTFviiiA#1{% + \countUTFx = \countUTFz + \divide\countUTFz by 64 + \countUTFy = \countUTFz + \multiply\countUTFz by 64 + \advance\countUTFx by -\countUTFz + \advance\countUTFx by 128 + \uccode `#1\countUTFx + \countUTFz = \countUTFy} + + \gdef\parseUTFviiiB#1#2#3#4{% + \advance\countUTFz by "#10\relax + \uccode `#3\countUTFz + \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} +\endgroup + +% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M +% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) +% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) +% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A +% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B +% +% Many of our renditions are less than wonderful, and all the missing +% characters are available somewhere. Loading the necessary fonts +% awaits user request. We can't truly support Unicode without +% reimplementing everything that's been done in LaTeX for many years, +% plus probably using luatex or xetex, and who knows what else. +% We won't be doing that here in this simple file. But we can try to at +% least make most of the characters not bomb out. +% +\def\utfeightchardefs{% + \DeclareUnicodeCharacter{00A0}{\tie} + \DeclareUnicodeCharacter{00A1}{\exclamdown} + \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent + \DeclareUnicodeCharacter{00A3}{\pounds} + \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency + \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen + \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar + \DeclareUnicodeCharacter{00A7}{\S} + \DeclareUnicodeCharacter{00A8}{\"{ }} + \DeclareUnicodeCharacter{00A9}{\copyright} + \DeclareUnicodeCharacter{00AA}{\ordf} + \DeclareUnicodeCharacter{00AB}{\guillemetleft} + \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot} + \DeclareUnicodeCharacter{00AD}{\-} + \DeclareUnicodeCharacter{00AE}{\registeredsymbol} + \DeclareUnicodeCharacter{00AF}{\={ }} + + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} + \DeclareUnicodeCharacter{00B1}{\ensuremath\pm} + \DeclareUnicodeCharacter{00B2}{$^2$} + \DeclareUnicodeCharacter{00B3}{$^3$} + \DeclareUnicodeCharacter{00B4}{\'{ }} + \DeclareUnicodeCharacter{00B5}{$\mu$} + \DeclareUnicodeCharacter{00B6}{\P} + \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot} + \DeclareUnicodeCharacter{00B8}{\cedilla{ }} + \DeclareUnicodeCharacter{00B9}{$^1$} + \DeclareUnicodeCharacter{00BA}{\ordm} + \DeclareUnicodeCharacter{00BB}{\guillemetright} + \DeclareUnicodeCharacter{00BC}{$1\over4$} + \DeclareUnicodeCharacter{00BD}{$1\over2$} + \DeclareUnicodeCharacter{00BE}{$3\over4$} + \DeclareUnicodeCharacter{00BF}{\questiondown} + + \DeclareUnicodeCharacter{00C0}{\`A} + \DeclareUnicodeCharacter{00C1}{\'A} + \DeclareUnicodeCharacter{00C2}{\^A} + \DeclareUnicodeCharacter{00C3}{\~A} + \DeclareUnicodeCharacter{00C4}{\"A} + \DeclareUnicodeCharacter{00C5}{\AA} + \DeclareUnicodeCharacter{00C6}{\AE} + \DeclareUnicodeCharacter{00C7}{\cedilla{C}} + \DeclareUnicodeCharacter{00C8}{\`E} + \DeclareUnicodeCharacter{00C9}{\'E} + \DeclareUnicodeCharacter{00CA}{\^E} + \DeclareUnicodeCharacter{00CB}{\"E} + \DeclareUnicodeCharacter{00CC}{\`I} + \DeclareUnicodeCharacter{00CD}{\'I} + \DeclareUnicodeCharacter{00CE}{\^I} + \DeclareUnicodeCharacter{00CF}{\"I} + + \DeclareUnicodeCharacter{00D0}{\DH} + \DeclareUnicodeCharacter{00D1}{\~N} + \DeclareUnicodeCharacter{00D2}{\`O} + \DeclareUnicodeCharacter{00D3}{\'O} + \DeclareUnicodeCharacter{00D4}{\^O} + \DeclareUnicodeCharacter{00D5}{\~O} + \DeclareUnicodeCharacter{00D6}{\"O} + \DeclareUnicodeCharacter{00D7}{\ensuremath\times} + \DeclareUnicodeCharacter{00D8}{\O} + \DeclareUnicodeCharacter{00D9}{\`U} + \DeclareUnicodeCharacter{00DA}{\'U} + \DeclareUnicodeCharacter{00DB}{\^U} + \DeclareUnicodeCharacter{00DC}{\"U} + \DeclareUnicodeCharacter{00DD}{\'Y} + \DeclareUnicodeCharacter{00DE}{\TH} + \DeclareUnicodeCharacter{00DF}{\ss} + + \DeclareUnicodeCharacter{00E0}{\`a} + \DeclareUnicodeCharacter{00E1}{\'a} + \DeclareUnicodeCharacter{00E2}{\^a} + \DeclareUnicodeCharacter{00E3}{\~a} + \DeclareUnicodeCharacter{00E4}{\"a} + \DeclareUnicodeCharacter{00E5}{\aa} + \DeclareUnicodeCharacter{00E6}{\ae} + \DeclareUnicodeCharacter{00E7}{\cedilla{c}} + \DeclareUnicodeCharacter{00E8}{\`e} + \DeclareUnicodeCharacter{00E9}{\'e} + \DeclareUnicodeCharacter{00EA}{\^e} + \DeclareUnicodeCharacter{00EB}{\"e} + \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} + \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} + \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} + \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} + + \DeclareUnicodeCharacter{00F0}{\dh} + \DeclareUnicodeCharacter{00F1}{\~n} + \DeclareUnicodeCharacter{00F2}{\`o} + \DeclareUnicodeCharacter{00F3}{\'o} + \DeclareUnicodeCharacter{00F4}{\^o} + \DeclareUnicodeCharacter{00F5}{\~o} + \DeclareUnicodeCharacter{00F6}{\"o} + \DeclareUnicodeCharacter{00F7}{\ensuremath\div} + \DeclareUnicodeCharacter{00F8}{\o} + \DeclareUnicodeCharacter{00F9}{\`u} + \DeclareUnicodeCharacter{00FA}{\'u} + \DeclareUnicodeCharacter{00FB}{\^u} + \DeclareUnicodeCharacter{00FC}{\"u} + \DeclareUnicodeCharacter{00FD}{\'y} + \DeclareUnicodeCharacter{00FE}{\th} + \DeclareUnicodeCharacter{00FF}{\"y} + + \DeclareUnicodeCharacter{0100}{\=A} + \DeclareUnicodeCharacter{0101}{\=a} + \DeclareUnicodeCharacter{0102}{\u{A}} + \DeclareUnicodeCharacter{0103}{\u{a}} + \DeclareUnicodeCharacter{0104}{\ogonek{A}} + \DeclareUnicodeCharacter{0105}{\ogonek{a}} + \DeclareUnicodeCharacter{0106}{\'C} + \DeclareUnicodeCharacter{0107}{\'c} + \DeclareUnicodeCharacter{0108}{\^C} + \DeclareUnicodeCharacter{0109}{\^c} + \DeclareUnicodeCharacter{010A}{\dotaccent{C}} + \DeclareUnicodeCharacter{010B}{\dotaccent{c}} + \DeclareUnicodeCharacter{010C}{\v{C}} + \DeclareUnicodeCharacter{010D}{\v{c}} + \DeclareUnicodeCharacter{010E}{\v{D}} + \DeclareUnicodeCharacter{010F}{d'} + + \DeclareUnicodeCharacter{0110}{\DH} + \DeclareUnicodeCharacter{0111}{\dh} + \DeclareUnicodeCharacter{0112}{\=E} + \DeclareUnicodeCharacter{0113}{\=e} + \DeclareUnicodeCharacter{0114}{\u{E}} + \DeclareUnicodeCharacter{0115}{\u{e}} + \DeclareUnicodeCharacter{0116}{\dotaccent{E}} + \DeclareUnicodeCharacter{0117}{\dotaccent{e}} + \DeclareUnicodeCharacter{0118}{\ogonek{E}} + \DeclareUnicodeCharacter{0119}{\ogonek{e}} + \DeclareUnicodeCharacter{011A}{\v{E}} + \DeclareUnicodeCharacter{011B}{\v{e}} + \DeclareUnicodeCharacter{011C}{\^G} + \DeclareUnicodeCharacter{011D}{\^g} + \DeclareUnicodeCharacter{011E}{\u{G}} + \DeclareUnicodeCharacter{011F}{\u{g}} + + \DeclareUnicodeCharacter{0120}{\dotaccent{G}} + \DeclareUnicodeCharacter{0121}{\dotaccent{g}} + \DeclareUnicodeCharacter{0122}{\cedilla{G}} + \DeclareUnicodeCharacter{0123}{\cedilla{g}} + \DeclareUnicodeCharacter{0124}{\^H} + \DeclareUnicodeCharacter{0125}{\^h} + \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}} + \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}} + \DeclareUnicodeCharacter{0128}{\~I} + \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} + \DeclareUnicodeCharacter{012A}{\=I} + \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} + \DeclareUnicodeCharacter{012C}{\u{I}} + \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} + \DeclareUnicodeCharacter{012E}{\ogonek{I}} + \DeclareUnicodeCharacter{012F}{\ogonek{i}} + + \DeclareUnicodeCharacter{0130}{\dotaccent{I}} + \DeclareUnicodeCharacter{0131}{\dotless{i}} + \DeclareUnicodeCharacter{0132}{IJ} + \DeclareUnicodeCharacter{0133}{ij} + \DeclareUnicodeCharacter{0134}{\^J} + \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} + \DeclareUnicodeCharacter{0136}{\cedilla{K}} + \DeclareUnicodeCharacter{0137}{\cedilla{k}} + \DeclareUnicodeCharacter{0138}{\ensuremath\kappa} + \DeclareUnicodeCharacter{0139}{\'L} + \DeclareUnicodeCharacter{013A}{\'l} + \DeclareUnicodeCharacter{013B}{\cedilla{L}} + \DeclareUnicodeCharacter{013C}{\cedilla{l}} + \DeclareUnicodeCharacter{013D}{L'}% should kern + \DeclareUnicodeCharacter{013E}{l'}% should kern + \DeclareUnicodeCharacter{013F}{L\U{00B7}} + + \DeclareUnicodeCharacter{0140}{l\U{00B7}} + \DeclareUnicodeCharacter{0141}{\L} + \DeclareUnicodeCharacter{0142}{\l} + \DeclareUnicodeCharacter{0143}{\'N} + \DeclareUnicodeCharacter{0144}{\'n} + \DeclareUnicodeCharacter{0145}{\cedilla{N}} + \DeclareUnicodeCharacter{0146}{\cedilla{n}} + \DeclareUnicodeCharacter{0147}{\v{N}} + \DeclareUnicodeCharacter{0148}{\v{n}} + \DeclareUnicodeCharacter{0149}{'n} + \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}} + \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}} + \DeclareUnicodeCharacter{014C}{\=O} + \DeclareUnicodeCharacter{014D}{\=o} + \DeclareUnicodeCharacter{014E}{\u{O}} + \DeclareUnicodeCharacter{014F}{\u{o}} + + \DeclareUnicodeCharacter{0150}{\H{O}} + \DeclareUnicodeCharacter{0151}{\H{o}} + \DeclareUnicodeCharacter{0152}{\OE} + \DeclareUnicodeCharacter{0153}{\oe} + \DeclareUnicodeCharacter{0154}{\'R} + \DeclareUnicodeCharacter{0155}{\'r} + \DeclareUnicodeCharacter{0156}{\cedilla{R}} + \DeclareUnicodeCharacter{0157}{\cedilla{r}} + \DeclareUnicodeCharacter{0158}{\v{R}} + \DeclareUnicodeCharacter{0159}{\v{r}} + \DeclareUnicodeCharacter{015A}{\'S} + \DeclareUnicodeCharacter{015B}{\'s} + \DeclareUnicodeCharacter{015C}{\^S} + \DeclareUnicodeCharacter{015D}{\^s} + \DeclareUnicodeCharacter{015E}{\cedilla{S}} + \DeclareUnicodeCharacter{015F}{\cedilla{s}} + + \DeclareUnicodeCharacter{0160}{\v{S}} + \DeclareUnicodeCharacter{0161}{\v{s}} + \DeclareUnicodeCharacter{0162}{\cedilla{T}} + \DeclareUnicodeCharacter{0163}{\cedilla{t}} + \DeclareUnicodeCharacter{0164}{\v{T}} + \DeclareUnicodeCharacter{0165}{\v{t}} + \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}} + \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}} + \DeclareUnicodeCharacter{0168}{\~U} + \DeclareUnicodeCharacter{0169}{\~u} + \DeclareUnicodeCharacter{016A}{\=U} + \DeclareUnicodeCharacter{016B}{\=u} + \DeclareUnicodeCharacter{016C}{\u{U}} + \DeclareUnicodeCharacter{016D}{\u{u}} + \DeclareUnicodeCharacter{016E}{\ringaccent{U}} + \DeclareUnicodeCharacter{016F}{\ringaccent{u}} + + \DeclareUnicodeCharacter{0170}{\H{U}} + \DeclareUnicodeCharacter{0171}{\H{u}} + \DeclareUnicodeCharacter{0172}{\ogonek{U}} + \DeclareUnicodeCharacter{0173}{\ogonek{u}} + \DeclareUnicodeCharacter{0174}{\^W} + \DeclareUnicodeCharacter{0175}{\^w} + \DeclareUnicodeCharacter{0176}{\^Y} + \DeclareUnicodeCharacter{0177}{\^y} + \DeclareUnicodeCharacter{0178}{\"Y} + \DeclareUnicodeCharacter{0179}{\'Z} + \DeclareUnicodeCharacter{017A}{\'z} + \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} + \DeclareUnicodeCharacter{017C}{\dotaccent{z}} + \DeclareUnicodeCharacter{017D}{\v{Z}} + \DeclareUnicodeCharacter{017E}{\v{z}} + \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}} + + \DeclareUnicodeCharacter{01C4}{D\v{Z}} + \DeclareUnicodeCharacter{01C5}{D\v{z}} + \DeclareUnicodeCharacter{01C6}{d\v{z}} + \DeclareUnicodeCharacter{01C7}{LJ} + \DeclareUnicodeCharacter{01C8}{Lj} + \DeclareUnicodeCharacter{01C9}{lj} + \DeclareUnicodeCharacter{01CA}{NJ} + \DeclareUnicodeCharacter{01CB}{Nj} + \DeclareUnicodeCharacter{01CC}{nj} + \DeclareUnicodeCharacter{01CD}{\v{A}} + \DeclareUnicodeCharacter{01CE}{\v{a}} + \DeclareUnicodeCharacter{01CF}{\v{I}} + + \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} + \DeclareUnicodeCharacter{01D1}{\v{O}} + \DeclareUnicodeCharacter{01D2}{\v{o}} + \DeclareUnicodeCharacter{01D3}{\v{U}} + \DeclareUnicodeCharacter{01D4}{\v{u}} + + \DeclareUnicodeCharacter{01E2}{\={\AE}} + \DeclareUnicodeCharacter{01E3}{\={\ae}} + \DeclareUnicodeCharacter{01E6}{\v{G}} + \DeclareUnicodeCharacter{01E7}{\v{g}} + \DeclareUnicodeCharacter{01E8}{\v{K}} + \DeclareUnicodeCharacter{01E9}{\v{k}} + + \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} + \DeclareUnicodeCharacter{01F1}{DZ} + \DeclareUnicodeCharacter{01F2}{Dz} + \DeclareUnicodeCharacter{01F3}{dz} + \DeclareUnicodeCharacter{01F4}{\'G} + \DeclareUnicodeCharacter{01F5}{\'g} + \DeclareUnicodeCharacter{01F8}{\`N} + \DeclareUnicodeCharacter{01F9}{\`n} + \DeclareUnicodeCharacter{01FC}{\'{\AE}} + \DeclareUnicodeCharacter{01FD}{\'{\ae}} + \DeclareUnicodeCharacter{01FE}{\'{\O}} + \DeclareUnicodeCharacter{01FF}{\'{\o}} + + \DeclareUnicodeCharacter{021E}{\v{H}} + \DeclareUnicodeCharacter{021F}{\v{h}} + + \DeclareUnicodeCharacter{0226}{\dotaccent{A}} + \DeclareUnicodeCharacter{0227}{\dotaccent{a}} + \DeclareUnicodeCharacter{0228}{\cedilla{E}} + \DeclareUnicodeCharacter{0229}{\cedilla{e}} + \DeclareUnicodeCharacter{022E}{\dotaccent{O}} + \DeclareUnicodeCharacter{022F}{\dotaccent{o}} + + \DeclareUnicodeCharacter{0232}{\=Y} + \DeclareUnicodeCharacter{0233}{\=y} + \DeclareUnicodeCharacter{0237}{\dotless{j}} + + \DeclareUnicodeCharacter{02DB}{\ogonek{ }} + + % Greek letters upper case + \DeclareUnicodeCharacter{0391}{{\it A}} + \DeclareUnicodeCharacter{0392}{{\it B}} + \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}} + \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}} + \DeclareUnicodeCharacter{0395}{{\it E}} + \DeclareUnicodeCharacter{0396}{{\it Z}} + \DeclareUnicodeCharacter{0397}{{\it H}} + \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}} + \DeclareUnicodeCharacter{0399}{{\it I}} + \DeclareUnicodeCharacter{039A}{{\it K}} + \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}} + \DeclareUnicodeCharacter{039C}{{\it M}} + \DeclareUnicodeCharacter{039D}{{\it N}} + \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}} + \DeclareUnicodeCharacter{039F}{{\it O}} + \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}} + \DeclareUnicodeCharacter{03A1}{{\it P}} + %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma + \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}} + \DeclareUnicodeCharacter{03A4}{{\it T}} + \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}} + \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}} + \DeclareUnicodeCharacter{03A7}{{\it X}} + \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}} + \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}} + + % Vowels with accents + \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}} + \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}} + \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}} + \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}} + \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}} + \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}} + + % Standalone accent + \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}} + + % Greek letters lower case + \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha} + \DeclareUnicodeCharacter{03B2}{\ensuremath\beta} + \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma} + \DeclareUnicodeCharacter{03B4}{\ensuremath\delta} + \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon} + \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta} + \DeclareUnicodeCharacter{03B7}{\ensuremath\eta} + \DeclareUnicodeCharacter{03B8}{\ensuremath\theta} + \DeclareUnicodeCharacter{03B9}{\ensuremath\iota} + \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa} + \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda} + \DeclareUnicodeCharacter{03BC}{\ensuremath\mu} + \DeclareUnicodeCharacter{03BD}{\ensuremath\nu} + \DeclareUnicodeCharacter{03BE}{\ensuremath\xi} + \DeclareUnicodeCharacter{03BF}{{\it o}} % omicron + \DeclareUnicodeCharacter{03C0}{\ensuremath\pi} + \DeclareUnicodeCharacter{03C1}{\ensuremath\rho} + \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma} + \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma} + \DeclareUnicodeCharacter{03C4}{\ensuremath\tau} + \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon} + \DeclareUnicodeCharacter{03C6}{\ensuremath\phi} + \DeclareUnicodeCharacter{03C7}{\ensuremath\chi} + \DeclareUnicodeCharacter{03C8}{\ensuremath\psi} + \DeclareUnicodeCharacter{03C9}{\ensuremath\omega} + + % More Greek vowels with accents + \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}} + \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}} + \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}} + \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}} + \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}} + + % Variant Greek letters + \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta} + \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi} + \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho} + + \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} + \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} + \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} + \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} + \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} + \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} + \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} + \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} + \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} + \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} + \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} + \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} + + \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} + \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} + + \DeclareUnicodeCharacter{1E20}{\=G} + \DeclareUnicodeCharacter{1E21}{\=g} + \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} + \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} + \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} + \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} + \DeclareUnicodeCharacter{1E26}{\"H} + \DeclareUnicodeCharacter{1E27}{\"h} + + \DeclareUnicodeCharacter{1E30}{\'K} + \DeclareUnicodeCharacter{1E31}{\'k} + \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} + \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} + \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} + \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} + \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} + \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} + \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} + \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} + \DeclareUnicodeCharacter{1E3E}{\'M} + \DeclareUnicodeCharacter{1E3F}{\'m} + + \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} + \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} + \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} + \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} + \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} + \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} + \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} + \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} + \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} + \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} + + \DeclareUnicodeCharacter{1E54}{\'P} + \DeclareUnicodeCharacter{1E55}{\'p} + \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} + \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} + \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} + \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} + \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} + \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} + \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} + \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} + + \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} + \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} + \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} + \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} + \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} + \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} + \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} + \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} + \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} + \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} + + \DeclareUnicodeCharacter{1E7C}{\~V} + \DeclareUnicodeCharacter{1E7D}{\~v} + \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} + \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} + + \DeclareUnicodeCharacter{1E80}{\`W} + \DeclareUnicodeCharacter{1E81}{\`w} + \DeclareUnicodeCharacter{1E82}{\'W} + \DeclareUnicodeCharacter{1E83}{\'w} + \DeclareUnicodeCharacter{1E84}{\"W} + \DeclareUnicodeCharacter{1E85}{\"w} + \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} + \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} + \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} + \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} + \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} + \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} + \DeclareUnicodeCharacter{1E8C}{\"X} + \DeclareUnicodeCharacter{1E8D}{\"x} + \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} + \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} + + \DeclareUnicodeCharacter{1E90}{\^Z} + \DeclareUnicodeCharacter{1E91}{\^z} + \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} + \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} + \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} + \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} + \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} + \DeclareUnicodeCharacter{1E97}{\"t} + \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} + \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} + + \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} + \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} + + \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} + \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} + \DeclareUnicodeCharacter{1EBC}{\~E} + \DeclareUnicodeCharacter{1EBD}{\~e} + + \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} + \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} + \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} + \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} + + \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} + \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} + + \DeclareUnicodeCharacter{1EF2}{\`Y} + \DeclareUnicodeCharacter{1EF3}{\`y} + \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} + + \DeclareUnicodeCharacter{1EF8}{\~Y} + \DeclareUnicodeCharacter{1EF9}{\~y} + + % Punctuation + \DeclareUnicodeCharacter{2013}{--} + \DeclareUnicodeCharacter{2014}{---} + \DeclareUnicodeCharacter{2018}{\quoteleft} + \DeclareUnicodeCharacter{2019}{\quoteright} + \DeclareUnicodeCharacter{201A}{\quotesinglbase} + \DeclareUnicodeCharacter{201C}{\quotedblleft} + \DeclareUnicodeCharacter{201D}{\quotedblright} + \DeclareUnicodeCharacter{201E}{\quotedblbase} + \DeclareUnicodeCharacter{2020}{\ensuremath\dagger} + \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger} + \DeclareUnicodeCharacter{2022}{\bullet} + \DeclareUnicodeCharacter{202F}{\thinspace} + \DeclareUnicodeCharacter{2026}{\dots} + \DeclareUnicodeCharacter{2039}{\guilsinglleft} + \DeclareUnicodeCharacter{203A}{\guilsinglright} + + \DeclareUnicodeCharacter{20AC}{\euro} + + \DeclareUnicodeCharacter{2192}{\expansion} + \DeclareUnicodeCharacter{21D2}{\result} + + % Mathematical symbols + \DeclareUnicodeCharacter{2200}{\ensuremath\forall} + \DeclareUnicodeCharacter{2203}{\ensuremath\exists} + \DeclareUnicodeCharacter{2208}{\ensuremath\in} + \DeclareUnicodeCharacter{2212}{\minus} + \DeclareUnicodeCharacter{2217}{\ast} + \DeclareUnicodeCharacter{221E}{\ensuremath\infty} + \DeclareUnicodeCharacter{2225}{\ensuremath\parallel} + \DeclareUnicodeCharacter{2227}{\ensuremath\wedge} + \DeclareUnicodeCharacter{2229}{\ensuremath\cap} + \DeclareUnicodeCharacter{2261}{\equiv} + \DeclareUnicodeCharacter{2264}{\ensuremath\leq} + \DeclareUnicodeCharacter{2265}{\ensuremath\geq} + \DeclareUnicodeCharacter{2282}{\ensuremath\subset} + \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq} + + \DeclareUnicodeCharacter{2016}{\ensuremath\Vert} + \DeclareUnicodeCharacter{2032}{\ensuremath\prime} + \DeclareUnicodeCharacter{210F}{\ensuremath\hbar} + \DeclareUnicodeCharacter{2111}{\ensuremath\Im} + \DeclareUnicodeCharacter{2113}{\ensuremath\ell} + \DeclareUnicodeCharacter{2118}{\ensuremath\wp} + \DeclareUnicodeCharacter{211C}{\ensuremath\Re} + \DeclareUnicodeCharacter{2127}{\ensuremath\mho} + \DeclareUnicodeCharacter{2135}{\ensuremath\aleph} + \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow} + \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow} + \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow} + \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow} + \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow} + \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow} + \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow} + \DeclareUnicodeCharacter{2198}{\ensuremath\searrow} + \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow} + \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto} + \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow} + \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow} + \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup} + \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown} + \DeclareUnicodeCharacter{21BE}{\ensuremath\upharpoonright} + \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup} + \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown} + \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons} + \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow} + \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow} + \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow} + \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow} + \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow} + \DeclareUnicodeCharacter{21DD}{\ensuremath\leadsto} + \DeclareUnicodeCharacter{2201}{\ensuremath\complement} + \DeclareUnicodeCharacter{2202}{\ensuremath\partial} + \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset} + \DeclareUnicodeCharacter{2207}{\ensuremath\nabla} + \DeclareUnicodeCharacter{2209}{\ensuremath\notin} + \DeclareUnicodeCharacter{220B}{\ensuremath\owns} + \DeclareUnicodeCharacter{220F}{\ensuremath\prod} + \DeclareUnicodeCharacter{2210}{\ensuremath\coprod} + \DeclareUnicodeCharacter{2211}{\ensuremath\sum} + \DeclareUnicodeCharacter{2213}{\ensuremath\mp} + \DeclareUnicodeCharacter{2218}{\ensuremath\circ} + \DeclareUnicodeCharacter{221A}{\ensuremath\surd} + \DeclareUnicodeCharacter{221D}{\ensuremath\propto} + \DeclareUnicodeCharacter{2220}{\ensuremath\angle} + \DeclareUnicodeCharacter{2223}{\ensuremath\mid} + \DeclareUnicodeCharacter{2228}{\ensuremath\vee} + \DeclareUnicodeCharacter{222A}{\ensuremath\cup} + \DeclareUnicodeCharacter{222B}{\ensuremath\smallint} + \DeclareUnicodeCharacter{222E}{\ensuremath\oint} + \DeclareUnicodeCharacter{223C}{\ensuremath\sim} + \DeclareUnicodeCharacter{2240}{\ensuremath\wr} + \DeclareUnicodeCharacter{2243}{\ensuremath\simeq} + \DeclareUnicodeCharacter{2245}{\ensuremath\cong} + \DeclareUnicodeCharacter{2248}{\ensuremath\approx} + \DeclareUnicodeCharacter{224D}{\ensuremath\asymp} + \DeclareUnicodeCharacter{2250}{\ensuremath\doteq} + \DeclareUnicodeCharacter{2260}{\ensuremath\neq} + \DeclareUnicodeCharacter{226A}{\ensuremath\ll} + \DeclareUnicodeCharacter{226B}{\ensuremath\gg} + \DeclareUnicodeCharacter{227A}{\ensuremath\prec} + \DeclareUnicodeCharacter{227B}{\ensuremath\succ} + \DeclareUnicodeCharacter{2283}{\ensuremath\supset} + \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq} + \DeclareUnicodeCharacter{228E}{\ensuremath\uplus} + \DeclareUnicodeCharacter{228F}{\ensuremath\sqsubset} + \DeclareUnicodeCharacter{2290}{\ensuremath\sqsupset} + \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq} + \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq} + \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap} + \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup} + \DeclareUnicodeCharacter{2295}{\ensuremath\oplus} + \DeclareUnicodeCharacter{2296}{\ensuremath\ominus} + \DeclareUnicodeCharacter{2297}{\ensuremath\otimes} + \DeclareUnicodeCharacter{2298}{\ensuremath\oslash} + \DeclareUnicodeCharacter{2299}{\ensuremath\odot} + \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash} + \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv} + \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop} + \DeclareUnicodeCharacter{22A5}{\ensuremath\bot} + \DeclareUnicodeCharacter{22A8}{\ensuremath\models} + \DeclareUnicodeCharacter{22B4}{\ensuremath\unlhd} + \DeclareUnicodeCharacter{22B5}{\ensuremath\unrhd} + \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge} + \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee} + \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap} + \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup} + \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond} + \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot} + \DeclareUnicodeCharacter{22C6}{\ensuremath\star} + \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie} + \DeclareUnicodeCharacter{2308}{\ensuremath\lceil} + \DeclareUnicodeCharacter{2309}{\ensuremath\rceil} + \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor} + \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor} + \DeclareUnicodeCharacter{2322}{\ensuremath\frown} + \DeclareUnicodeCharacter{2323}{\ensuremath\smile} + + \DeclareUnicodeCharacter{25A1}{\ensuremath\Box} + \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle} + \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright} + \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown} + \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft} + \DeclareUnicodeCharacter{25C7}{\ensuremath\Diamond} + \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit} + \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit} + \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit} + \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit} + \DeclareUnicodeCharacter{266D}{\ensuremath\flat} + \DeclareUnicodeCharacter{266E}{\ensuremath\natural} + \DeclareUnicodeCharacter{266F}{\ensuremath\sharp} + \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc} + \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle} + \DeclareUnicodeCharacter{27C2}{\ensuremath\perp} + \DeclareUnicodeCharacter{27E8}{\ensuremath\langle} + \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow} + \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow} + \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow} + \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto} + \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus} + \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot} + \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus} + \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes} + \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus} + \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup} + \DeclareUnicodeCharacter{2A1D}{\ensuremath\Join} + \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg} + \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq} + \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq} + + \global\mathchardef\checkmark="1370 % actually the square root sign + \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark} +}% end of \utfeightchardefs + +% US-ASCII character definitions. +\def\asciichardefs{% nothing need be done + \relax +} + +% Latin1 (ISO-8859-1) character definitions. +\def\nonasciistringdefs{% + \setnonasciicharscatcode\active + \def\defstringchar##1{\def##1{\string##1}}% + % + \defstringchar^^80\defstringchar^^81\defstringchar^^82\defstringchar^^83% + \defstringchar^^84\defstringchar^^85\defstringchar^^86\defstringchar^^87% + \defstringchar^^88\defstringchar^^89\defstringchar^^8a\defstringchar^^8b% + \defstringchar^^8c\defstringchar^^8d\defstringchar^^8e\defstringchar^^8f% + % + \defstringchar^^90\defstringchar^^91\defstringchar^^92\defstringchar^^93% + \defstringchar^^94\defstringchar^^95\defstringchar^^96\defstringchar^^97% + \defstringchar^^98\defstringchar^^99\defstringchar^^9a\defstringchar^^9b% + \defstringchar^^9c\defstringchar^^9d\defstringchar^^9e\defstringchar^^9f% + % + \defstringchar^^a0\defstringchar^^a1\defstringchar^^a2\defstringchar^^a3% + \defstringchar^^a4\defstringchar^^a5\defstringchar^^a6\defstringchar^^a7% + \defstringchar^^a8\defstringchar^^a9\defstringchar^^aa\defstringchar^^ab% + \defstringchar^^ac\defstringchar^^ad\defstringchar^^ae\defstringchar^^af% + % + \defstringchar^^b0\defstringchar^^b1\defstringchar^^b2\defstringchar^^b3% + \defstringchar^^b4\defstringchar^^b5\defstringchar^^b6\defstringchar^^b7% + \defstringchar^^b8\defstringchar^^b9\defstringchar^^ba\defstringchar^^bb% + \defstringchar^^bc\defstringchar^^bd\defstringchar^^be\defstringchar^^bf% + % + \defstringchar^^c0\defstringchar^^c1\defstringchar^^c2\defstringchar^^c3% + \defstringchar^^c4\defstringchar^^c5\defstringchar^^c6\defstringchar^^c7% + \defstringchar^^c8\defstringchar^^c9\defstringchar^^ca\defstringchar^^cb% + \defstringchar^^cc\defstringchar^^cd\defstringchar^^ce\defstringchar^^cf% + % + \defstringchar^^d0\defstringchar^^d1\defstringchar^^d2\defstringchar^^d3% + \defstringchar^^d4\defstringchar^^d5\defstringchar^^d6\defstringchar^^d7% + \defstringchar^^d8\defstringchar^^d9\defstringchar^^da\defstringchar^^db% + \defstringchar^^dc\defstringchar^^dd\defstringchar^^de\defstringchar^^df% + % + \defstringchar^^e0\defstringchar^^e1\defstringchar^^e2\defstringchar^^e3% + \defstringchar^^e4\defstringchar^^e5\defstringchar^^e6\defstringchar^^e7% + \defstringchar^^e8\defstringchar^^e9\defstringchar^^ea\defstringchar^^eb% + \defstringchar^^ec\defstringchar^^ed\defstringchar^^ee\defstringchar^^ef% + % + \defstringchar^^f0\defstringchar^^f1\defstringchar^^f2\defstringchar^^f3% + \defstringchar^^f4\defstringchar^^f5\defstringchar^^f6\defstringchar^^f7% + \defstringchar^^f8\defstringchar^^f9\defstringchar^^fa\defstringchar^^fb% + \defstringchar^^fc\defstringchar^^fd\defstringchar^^fe\defstringchar^^ff% +} + + +% define all the unicode characters we know about, for the sake of @U. +\utfeightchardefs + + +% Make non-ASCII characters printable again for compatibility with +% existing Texinfo documents that may use them, even without declaring a +% document encoding. +% +\setnonasciicharscatcode \other + + +\message{formatting,} + +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be very finicky about underfull hboxes, either. +\hbadness = 6666 + +% Following George Bush, get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; +% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; +% 7) physical page height; 8) physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + % if we don't reset these, they will remain at "1 true in" of + % whatever layout pdftex was dumped with. + \pdfhorigin = 1 true in + \pdfvorigin = 1 true in + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{607.2pt}{6in}% that's 46 lines + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {-.2in}{0in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @smallerbook to reset parameters for 6x9 trim size. +% (Just testing, parameters still in flux.) +\def\smallerbook{{\globaldefs = 1 + \parskip = 1.5pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.4in}{4.8in}% + {-.2in}{-.4in}% + {0pt}{14pt}% + {9in}{6in}% + % + \lispnarrowing = 0.25in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .4cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{673.2pt}{160mm}% that's 51 lines + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1\relax + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +\def^^L{\par} % remove \outer, so ^L can appear in an @comment + +% DEL is a comment character, in case @c does not suffice. +\catcode`\^^? = 14 + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other \def\normaldoublequote{"} +\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix +\catcode`\+=\other \def\normalplus{+} +\catcode`\<=\other \def\normalless{<} +\catcode`\>=\other \def\normalgreater{>} +\catcode`\^=\other \def\normalcaret{^} +\catcode`\_=\other \def\normalunderscore{_} +\catcode`\|=\other \def\normalverticalbar{|} +\catcode`\~=\other \def\normaltilde{~} + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde +\chardef\hatchar=`\^ +\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +\let\realunder=_ +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} + +\chardef \less=`\< +\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless +\chardef \gtr=`\> +\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr +\catcode`\+=\active \def+{{\tt \char 43}} +\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix +\catcode`\-=\active \let-=\normaldash + + +% used for headline/footline in the output routine, in case the page +% breaks in the middle of an @tex block. +\def\texinfochars{% + \let< = \activeless + \let> = \activegtr + \let~ = \activetilde + \let^ = \activehat + \markupsetuplqdefault \markupsetuprqdefault + \let\b = \strong + \let\i = \smartitalic + % in principle, all other definitions in \tex have to be undone too. +} + +% Used sometimes to turn off (effectively) the active characters even after +% parsing them. +\def\turnoffactive{% + \normalturnoffactive + \otherbackslash +} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \realbackslash is an actual character `\' with catcode other, and +% \doublebackslash is two of them (for the pdf outlines). +{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} + +% In Texinfo, backslash is an active character; it prints the backslash +% in fixed width font. +\catcode`\\=\active % @ for escape char from now on. + +% Print a typewriter backslash. For math mode, we can't simply use +% \backslashcurfont: the story here is that in math mode, the \char +% of \backslashcurfont ends up printing the roman \ from the math symbol +% font (because \char in math mode uses the \mathcode, and plain.tex +% sets \mathcode`\\="026E). Hence we use an explicit \mathchar, +% which is the decimal equivalent of "715c (class 7, e.g., use \fam; +% ignored family value; char position "5C). We can't use " for the +% usual hex value because it has already been made active. + +@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} +@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents. + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. We switch back and forth between these. +@gdef@rawbackslash{@let\=@backslashcurfont} +@gdef@otherbackslash{@let\=@realbackslash} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. +% +{@catcode`- = @active + @gdef@normalturnoffactive{% + @nonasciistringdefs + @let-=@normaldash + @let"=@normaldoublequote + @let$=@normaldollar %$ font-lock fix + @let+=@normalplus + @let<=@normalless + @let>=@normalgreater + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let~=@normaltilde + @let\=@ttbackslash + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces + } +} + +% 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 @fixbackslash turn them back on. +@catcode`+=@other @catcode`@_=@other + +% \enablebackslashhack - allow file to begin `\input texinfo' +% +% 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. +% If the file did not have a `\input texinfo', then it is turned off after +% the first line; otherwise the first `\' in the file would cause an error. +% This is used on the very last line of this file, texinfo.tex. +% We also use @c to call @fixbackslash, in case ends of lines are hidden. +{ +@catcode`@^=7 +@catcode`@^^M=13@gdef@enablebackslashhack{% + @global@let\ = @eatinput% + @catcode`@^^M=13% + @def@c{@fixbackslash@c}% + @def ^^M{@let^^M@secondlinenl}% + @gdef @secondlinenl{@let^^M@thirdlinenl}% + @gdef @thirdlinenl{@fixbackslash}% +}} + +{@catcode`@^=7 @catcode`@^^M=13% +@gdef@eatinput input texinfo#1^^M{@fixbackslash}} + +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @ttbackslash @fi + @catcode13=5 % regular end of line + @let@c=@texinfoc + % Also turn back on active characters that might appear in the input + % file name, in case not using a pre-dumped format. + @catcode`+=@active + @catcode`@_=@active + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets + % called at the beginning of every Texinfo file. Not opening texinfo.cnf + % directly in this file, texinfo.tex, makes it possible to make a format + % file for Texinfo. + % + @openin 1 texinfo.cnf + @ifeof 1 @else @input texinfo.cnf @fi + @closein 1 +} + + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These (along with & and #) are made active for url-breaking, so need +% active definitions as the normal characters. +@def@normaldot{.} +@def@normalquest{?} +@def@normalslash{/} + +% These look ok in all fonts, so just make them not special. +% @hashchar{} gets its own user-level command, because of #line. +@catcode`@& = @other @def@normalamp{&} +@catcode`@# = @other @def@normalhash{#} +@catcode`@% = @other @def@normalpercent{%} + +@let @hashchar = @normalhash + +@c Finally, make ` and ' active, so that txicodequoteundirected and +@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we +@c don't make ` and ' active, @code will not get them as active chars. +@c Do this last of all since we use ` in the previous @catcode assignments. +@catcode`@'=@active +@catcode`@`=@active +@markupsetuplqdefault +@markupsetuprqdefault + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message\\|emacs-page" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore +@enablebackslashhack diff --git a/doc/version.texi b/doc/version.texi new file mode 100644 index 0000000..d310273 --- /dev/null +++ b/doc/version.texi @@ -0,0 +1,11 @@ +@ignore +Copyright (C) 1988-2022 Free Software Foundation, Inc. +@end ignore + +@set EDITION 8.2 +@set VERSION 8.2 + +@set UPDATED 19 September 2022 +@set UPDATED-MONTH September 2022 + +@set LASTCHANGE Mon Sep 19 11:15:16 EDT 2022 diff --git a/emacs_keymap.c b/emacs_keymap.c new file mode 100644 index 0000000..02597da --- /dev/null +++ b/emacs_keymap.c @@ -0,0 +1,872 @@ +/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */ + +/* Copyright (C) 1987-2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (BUFSIZ) +#include +#endif /* !BUFSIZ */ + +#include "readline.h" + +/* An array of function pointers, one for each possible key. + If the type byte is ISKMAP, then the pointer is the address of + a keymap. */ + +KEYMAP_ENTRY_ARRAY emacs_standard_keymap = { + + /* Control keys. */ + { ISFUNC, rl_set_mark }, /* Control-@ */ + { ISFUNC, rl_beg_of_line }, /* Control-a */ + { ISFUNC, rl_backward_char }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, rl_delete }, /* Control-d */ + { ISFUNC, rl_end_of_line }, /* Control-e */ + { ISFUNC, rl_forward_char }, /* Control-f */ + { ISFUNC, rl_abort }, /* Control-g */ + { ISFUNC, rl_rubout }, /* Control-h */ + { ISFUNC, rl_complete }, /* Control-i */ + { ISFUNC, rl_newline }, /* Control-j */ + { ISFUNC, rl_kill_line }, /* Control-k */ + { ISFUNC, rl_clear_screen }, /* Control-l */ + { ISFUNC, rl_newline }, /* Control-m */ + { ISFUNC, rl_get_next_history }, /* Control-n */ + { ISFUNC, rl_operate_and_get_next }, /* Control-o */ + { ISFUNC, rl_get_previous_history }, /* Control-p */ + { ISFUNC, rl_quoted_insert }, /* Control-q */ + { ISFUNC, rl_reverse_search_history }, /* Control-r */ + { ISFUNC, rl_forward_search_history }, /* Control-s */ + { ISFUNC, rl_transpose_chars }, /* Control-t */ + { ISFUNC, rl_unix_line_discard }, /* Control-u */ + { ISFUNC, rl_quoted_insert }, /* Control-v */ + { ISFUNC, rl_unix_word_rubout }, /* Control-w */ + { ISKMAP, (rl_command_func_t *)emacs_ctlx_keymap }, /* Control-x */ + { ISFUNC, rl_yank }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + { ISKMAP, (rl_command_func_t *)emacs_meta_keymap }, /* Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, rl_char_search }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, rl_undo_command }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_insert }, /* SPACE */ + { ISFUNC, rl_insert }, /* ! */ + { ISFUNC, rl_insert }, /* " */ + { ISFUNC, rl_insert }, /* # */ + { ISFUNC, rl_insert }, /* $ */ + { ISFUNC, rl_insert }, /* % */ + { ISFUNC, rl_insert }, /* & */ + { ISFUNC, rl_insert }, /* ' */ + { ISFUNC, rl_insert }, /* ( */ + { ISFUNC, rl_insert }, /* ) */ + { ISFUNC, rl_insert }, /* * */ + { ISFUNC, rl_insert }, /* + */ + { ISFUNC, rl_insert }, /* , */ + { ISFUNC, rl_insert }, /* - */ + { ISFUNC, rl_insert }, /* . */ + { ISFUNC, rl_insert }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_insert }, /* 0 */ + { ISFUNC, rl_insert }, /* 1 */ + { ISFUNC, rl_insert }, /* 2 */ + { ISFUNC, rl_insert }, /* 3 */ + { ISFUNC, rl_insert }, /* 4 */ + { ISFUNC, rl_insert }, /* 5 */ + { ISFUNC, rl_insert }, /* 6 */ + { ISFUNC, rl_insert }, /* 7 */ + { ISFUNC, rl_insert }, /* 8 */ + { ISFUNC, rl_insert }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, rl_insert }, /* : */ + { ISFUNC, rl_insert }, /* ; */ + { ISFUNC, rl_insert }, /* < */ + { ISFUNC, rl_insert }, /* = */ + { ISFUNC, rl_insert }, /* > */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_insert }, /* A */ + { ISFUNC, rl_insert }, /* B */ + { ISFUNC, rl_insert }, /* C */ + { ISFUNC, rl_insert }, /* D */ + { ISFUNC, rl_insert }, /* E */ + { ISFUNC, rl_insert }, /* F */ + { ISFUNC, rl_insert }, /* G */ + { ISFUNC, rl_insert }, /* H */ + { ISFUNC, rl_insert }, /* I */ + { ISFUNC, rl_insert }, /* J */ + { ISFUNC, rl_insert }, /* K */ + { ISFUNC, rl_insert }, /* L */ + { ISFUNC, rl_insert }, /* M */ + { ISFUNC, rl_insert }, /* N */ + { ISFUNC, rl_insert }, /* O */ + { ISFUNC, rl_insert }, /* P */ + { ISFUNC, rl_insert }, /* Q */ + { ISFUNC, rl_insert }, /* R */ + { ISFUNC, rl_insert }, /* S */ + { ISFUNC, rl_insert }, /* T */ + { ISFUNC, rl_insert }, /* U */ + { ISFUNC, rl_insert }, /* V */ + { ISFUNC, rl_insert }, /* W */ + { ISFUNC, rl_insert }, /* X */ + { ISFUNC, rl_insert }, /* Y */ + { ISFUNC, rl_insert }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, rl_insert }, /* [ */ + { ISFUNC, rl_insert }, /* \ */ + { ISFUNC, rl_insert }, /* ] */ + { ISFUNC, rl_insert }, /* ^ */ + { ISFUNC, rl_insert }, /* _ */ + { ISFUNC, rl_insert }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, rl_insert }, /* a */ + { ISFUNC, rl_insert }, /* b */ + { ISFUNC, rl_insert }, /* c */ + { ISFUNC, rl_insert }, /* d */ + { ISFUNC, rl_insert }, /* e */ + { ISFUNC, rl_insert }, /* f */ + { ISFUNC, rl_insert }, /* g */ + { ISFUNC, rl_insert }, /* h */ + { ISFUNC, rl_insert }, /* i */ + { ISFUNC, rl_insert }, /* j */ + { ISFUNC, rl_insert }, /* k */ + { ISFUNC, rl_insert }, /* l */ + { ISFUNC, rl_insert }, /* m */ + { ISFUNC, rl_insert }, /* n */ + { ISFUNC, rl_insert }, /* o */ + { ISFUNC, rl_insert }, /* p */ + { ISFUNC, rl_insert }, /* q */ + { ISFUNC, rl_insert }, /* r */ + { ISFUNC, rl_insert }, /* s */ + { ISFUNC, rl_insert }, /* t */ + { ISFUNC, rl_insert }, /* u */ + { ISFUNC, rl_insert }, /* v */ + { ISFUNC, rl_insert }, /* w */ + { ISFUNC, rl_insert }, /* x */ + { ISFUNC, rl_insert }, /* y */ + { ISFUNC, rl_insert }, /* z */ + + /* Final punctuation. */ + { ISFUNC, rl_insert }, /* { */ + { ISFUNC, rl_insert }, /* | */ + { ISFUNC, rl_insert }, /* } */ + { ISFUNC, rl_insert }, /* ~ */ + { ISFUNC, rl_rubout }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Pure 8-bit characters (128 - 159). + These might be used in some + character sets. */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + + /* ISO Latin-1 characters (160 - 255) */ + { ISFUNC, rl_insert }, /* No-break space */ + { ISFUNC, rl_insert }, /* Inverted exclamation mark */ + { ISFUNC, rl_insert }, /* Cent sign */ + { ISFUNC, rl_insert }, /* Pound sign */ + { ISFUNC, rl_insert }, /* Currency sign */ + { ISFUNC, rl_insert }, /* Yen sign */ + { ISFUNC, rl_insert }, /* Broken bar */ + { ISFUNC, rl_insert }, /* Section sign */ + { ISFUNC, rl_insert }, /* Diaeresis */ + { ISFUNC, rl_insert }, /* Copyright sign */ + { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ + { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Not sign */ + { ISFUNC, rl_insert }, /* Soft hyphen */ + { ISFUNC, rl_insert }, /* Registered sign */ + { ISFUNC, rl_insert }, /* Macron */ + { ISFUNC, rl_insert }, /* Degree sign */ + { ISFUNC, rl_insert }, /* Plus-minus sign */ + { ISFUNC, rl_insert }, /* Superscript two */ + { ISFUNC, rl_insert }, /* Superscript three */ + { ISFUNC, rl_insert }, /* Acute accent */ + { ISFUNC, rl_insert }, /* Micro sign */ + { ISFUNC, rl_insert }, /* Pilcrow sign */ + { ISFUNC, rl_insert }, /* Middle dot */ + { ISFUNC, rl_insert }, /* Cedilla */ + { ISFUNC, rl_insert }, /* Superscript one */ + { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ + { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ + { ISFUNC, rl_insert }, /* Vulgar fraction one half */ + { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ + { ISFUNC, rl_insert }, /* Inverted questionk mark */ + { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin capital letter ae */ + { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Multiplication sign */ + { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ + { ISFUNC, rl_insert }, /* Latin small letter a with grave */ + { ISFUNC, rl_insert }, /* Latin small letter a with acute */ + { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin small letter ae */ + { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin small letter e with grave */ + { ISFUNC, rl_insert }, /* Latin small letter e with acute */ + { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter i with grave */ + { ISFUNC, rl_insert }, /* Latin small letter i with acute */ + { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with grave */ + { ISFUNC, rl_insert }, /* Latin small letter o with acute */ + { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Division sign */ + { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin small letter u with grave */ + { ISFUNC, rl_insert }, /* Latin small letter u with acute */ + { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter y with acute */ + { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ + { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ +#endif /* KEYMAP_SIZE > 128 */ +}; + +KEYMAP_ENTRY_ARRAY emacs_meta_keymap = { + + /* Meta keys. Just like above, but the high bit is set. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-f */ + { ISFUNC, rl_abort }, /* Meta-Control-g */ + { ISFUNC, rl_backward_kill_word }, /* Meta-Control-h */ + { ISFUNC, rl_tab_insert }, /* Meta-Control-i */ + { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-k */ + { ISFUNC, rl_clear_display }, /* Meta-Control-l */ + { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-q */ + { ISFUNC, rl_revert_line }, /* Meta-Control-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-x */ + { ISFUNC, rl_yank_nth_arg }, /* Meta-Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-z */ + + { ISFUNC, rl_complete }, /* Meta-Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-\ */ + { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_set_mark }, /* Meta-SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-" */ + { ISFUNC, rl_insert_comment }, /* Meta-# */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-$ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-% */ + { ISFUNC, rl_tilde_expand }, /* Meta-& */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-' */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-( */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-) */ + { ISFUNC, rl_insert_completions }, /* Meta-* */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-+ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-, */ + { ISFUNC, rl_digit_argument }, /* Meta-- */ + { ISFUNC, rl_yank_last_arg}, /* Meta-. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-/ */ + + /* Regular digits. */ + { ISFUNC, rl_digit_argument }, /* Meta-0 */ + { ISFUNC, rl_digit_argument }, /* Meta-1 */ + { ISFUNC, rl_digit_argument }, /* Meta-2 */ + { ISFUNC, rl_digit_argument }, /* Meta-3 */ + { ISFUNC, rl_digit_argument }, /* Meta-4 */ + { ISFUNC, rl_digit_argument }, /* Meta-5 */ + { ISFUNC, rl_digit_argument }, /* Meta-6 */ + { ISFUNC, rl_digit_argument }, /* Meta-7 */ + { ISFUNC, rl_digit_argument }, /* Meta-8 */ + { ISFUNC, rl_digit_argument }, /* Meta-9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-: */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-; */ + { ISFUNC, rl_beginning_of_history }, /* Meta-< */ + { ISFUNC, rl_possible_completions }, /* Meta-= */ + { ISFUNC, rl_end_of_history }, /* Meta-> */ + { ISFUNC, rl_possible_completions }, /* Meta-? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-@ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-A */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-B */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-C */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-D */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-E */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-F */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-G */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-H */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-I */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-J */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-K */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-L */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-M */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-N */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-O */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-P */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-Q */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-R */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-S */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-T */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-U */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-V */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-W */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-X */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-Y */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-Z */ + + /* Some more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-[ */ /* was rl_arrow_keys */ + { ISFUNC, rl_delete_horizontal_space }, /* Meta-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-^ */ + { ISFUNC, rl_yank_last_arg }, /* Meta-_ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-` */ + + /* Lowercase alphabet. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-a */ + { ISFUNC, rl_backward_word }, /* Meta-b */ + { ISFUNC, rl_capitalize_word }, /* Meta-c */ + { ISFUNC, rl_kill_word }, /* Meta-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-e */ + { ISFUNC, rl_forward_word }, /* Meta-f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-k */ + { ISFUNC, rl_downcase_word }, /* Meta-l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-m */ + { ISFUNC, rl_noninc_forward_search }, /* Meta-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-o */ /* was rl_arrow_keys */ + { ISFUNC, rl_noninc_reverse_search }, /* Meta-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-q */ + { ISFUNC, rl_revert_line }, /* Meta-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-s */ + { ISFUNC, rl_transpose_words }, /* Meta-t */ + { ISFUNC, rl_upcase_word }, /* Meta-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-x */ + { ISFUNC, rl_yank_pop }, /* Meta-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-{ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-| */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-} */ + { ISFUNC, rl_tilde_expand }, /* Meta-~ */ + { ISFUNC, rl_backward_kill_word }, /* Meta-rubout */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; + +KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = { + + /* Control keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ + { ISFUNC, rl_abort }, /* Control-g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ + { ISFUNC, rl_re_read_init_file }, /* Control-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ + { ISFUNC, rl_undo_command }, /* Control-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ + { ISFUNC, rl_exchange_point_and_mark }, /* Control-x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ + { ISFUNC, rl_start_kbd_macro }, /* ( */ + { ISFUNC, rl_end_kbd_macro }, /* ) */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ + + /* Regular digits. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 0 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 1 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 2 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 3 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 4 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 5 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 6 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 7 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 8 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_do_lowercase_version }, /* A */ + { ISFUNC, rl_do_lowercase_version }, /* B */ + { ISFUNC, rl_do_lowercase_version }, /* C */ + { ISFUNC, rl_do_lowercase_version }, /* D */ + { ISFUNC, rl_do_lowercase_version }, /* E */ + { ISFUNC, rl_do_lowercase_version }, /* F */ + { ISFUNC, rl_do_lowercase_version }, /* G */ + { ISFUNC, rl_do_lowercase_version }, /* H */ + { ISFUNC, rl_do_lowercase_version }, /* I */ + { ISFUNC, rl_do_lowercase_version }, /* J */ + { ISFUNC, rl_do_lowercase_version }, /* K */ + { ISFUNC, rl_do_lowercase_version }, /* L */ + { ISFUNC, rl_do_lowercase_version }, /* M */ + { ISFUNC, rl_do_lowercase_version }, /* N */ + { ISFUNC, rl_do_lowercase_version }, /* O */ + { ISFUNC, rl_do_lowercase_version }, /* P */ + { ISFUNC, rl_do_lowercase_version }, /* Q */ + { ISFUNC, rl_do_lowercase_version }, /* R */ + { ISFUNC, rl_do_lowercase_version }, /* S */ + { ISFUNC, rl_do_lowercase_version }, /* T */ + { ISFUNC, rl_do_lowercase_version }, /* U */ + { ISFUNC, rl_do_lowercase_version }, /* V */ + { ISFUNC, rl_do_lowercase_version }, /* W */ + { ISFUNC, rl_do_lowercase_version }, /* X */ + { ISFUNC, rl_do_lowercase_version }, /* Y */ + { ISFUNC, rl_do_lowercase_version }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ + { ISFUNC, rl_call_last_kbd_macro }, /* e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ + { ISFUNC, rl_backward_kill_line }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; diff --git a/examples/Inputrc b/examples/Inputrc new file mode 100644 index 0000000..a358bc4 --- /dev/null +++ b/examples/Inputrc @@ -0,0 +1,81 @@ +# My ~/.inputrc file is in -*- text -*- for easy editing with Emacs. +# +# Notice the various bindings which are conditionalized depending +# on which program is running, or what terminal is active. +# + +# Copyright (C) 1989-2009 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 3 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, see . +# + +# In all programs, all terminals, make sure this is bound. +"\C-x\C-r": re-read-init-file + +# Hp terminals (and some others) have ugly default behaviour for C-h. +"\C-h": backward-delete-char +"\e\C-h": backward-kill-word +"\C-xd": dump-functions + +# In xterm windows, make the arrow keys do the right thing. +$if TERM=xterm +"\e[A": previous-history +"\e[B": next-history +"\e[C": forward-char +"\e[D": backward-char + +# alternate arrow key prefix +"\eOA": previous-history +"\eOB": next-history +"\eOC": forward-char +"\eOD": backward-char + +# Under Xterm in Bash, we bind local Function keys to do something useful. +$if Bash +"\e[11~": "Function Key 1" +"\e[12~": "Function Key 2" +"\e[13~": "Function Key 3" +"\e[14~": "Function Key 4" +"\e[15~": "Function Key 5" + +# I know the following escape sequence numbers are 1 greater than +# the function key. Don't ask me why, I didn't design the xterm terminal. +"\e[17~": "Function Key 6" +"\e[18~": "Function Key 7" +"\e[19~": "Function Key 8" +"\e[20~": "Function Key 9" +"\e[21~": "Function Key 10" +$endif +$endif + +# For Bash, all terminals, add some Bash specific hacks. +$if Bash +"\C-xv": show-bash-version +"\C-x\C-e": shell-expand-line + +# Here is one for editing my path. +"\C-xp": "$PATH\C-x\C-e\C-e\"\C-aPATH=\":\C-b" + +# Make C-x r read my mail in emacs. +# "\C-xr": "emacs -f rmail\C-j" +$endif + +# For FTP, different hacks: +$if Ftp +"\C-xg": "get \M-?" +"\C-xt": "put \M-?" +"\M-.": yank-last-arg +$endif + +" ": self-insert diff --git a/examples/Makefile.in b/examples/Makefile.in new file mode 100644 index 0000000..291c6b7 --- /dev/null +++ b/examples/Makefile.in @@ -0,0 +1,193 @@ +# +# This is the Makefile for the readline examples subdirectory. +# +# Copyright (C) 1994,2008,2009 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 3 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, see . + +RL_LIBRARY_VERSION = @LIBVERSION@ + +SHELL = @MAKE_SHELL@ +RM = rm -f + +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +datarootdir = @datarootdir@ + +bindir = @bindir@ +srcdir = @srcdir@ +datadir = @datadir@ +VPATH = @srcdir@ +top_srcdir = @top_srcdir@ +#BUILD_DIR = . +BUILD_DIR = @BUILD_DIR@ +installdir = $(datadir)/readline + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ + +# Support an alternate destination root directory for package building +DESTDIR = + +DEFS = @DEFS@ +CC = @CC@ +CFLAGS = @CFLAGS@ +LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DREADLINE_LIBRARY -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I$(srcdir) -I$(top_srcdir) -I.. + +CCFLAGS = $(ASAN_CFLAGS) $(DEFS) $(LOCAL_CFLAGS) $(INCLUDES) $(CPPFLAGS) \ + $(CFLAGS) +LDFLAGS = -g -L.. @LDFLAGS@ $(ASAN_LDFLAGS) + +ASAN_XCFLAGS = -fsanitize=address -fno-omit-frame-pointer +ASAN_XLDFLAGS = -fsanitize=address + +READLINE_LIB = ../libreadline.a +HISTORY_LIB = ../libhistory.a + +TERMCAP_LIB = @TERMCAP_LIB@ + +.c.o: + ${RM} $@ + $(CC) $(CCFLAGS) -c $< + +SOURCES = excallback.c fileman.c histexamp.c manexamp.c rl-fgets.c rl.c \ + rlbasic.c rlcat.c rlevent.c rlptytest.c rltest.c rlversion.c \ + rltest2.c rl-callbacktest.c hist_erasedups.c hist_purgecmd.c \ + rlkeymaps.c rl-timeout.c + +EXECUTABLES = fileman$(EXEEXT) rltest$(EXEEXT) rl$(EXEEXT) rlcat$(EXEEXT) \ + rlevent$(EXEEXT) rlversion$(EXEEXT) histexamp$(EXEEXT) \ + rl-callbacktest$(EXEEXT) rlbasic$(EXEEXT) \ + hist_erasedups$(EXEEXT) hist_purgecmd$(EXEEXT) \ + rlkeymaps$(EXEEXT) rl-timeout$(EXEEXT) + +OBJECTS = fileman.o rltest.o rl.o rlevent.o rlcat.o rlversion.o histexamp.o \ + rltest2.o rl-callbacktest.o rlbasic.o hist_erasedups.o hist_purgecmd.o \ + rlkeymaps.o rl-timeout.o + +OTHEREXE = rlptytest$(EXEEXT) +OTHEROBJ = rlptytest.o + +all: $(EXECUTABLES) +everything: all + +asan: + ${MAKE} ${MFLAGS} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' all + +check: rlversion$(EXEEXT) + @echo Readline version: `rlversion$(EXEEXT)` + +installdirs: + -$(SHELL) $(top_srcdir)/support/mkdirs $(DESTDIR)$(installdir) + +install: installdirs + @for f in $(SOURCES); do \ + $(RM) $(DESTDIR)$(installdir)/$$f ; \ + $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(installdir) ; \ + done + +uninstall: + @for f in $(SOURCES); do \ + $(RM) $(DESTDIR)$(installdir)/$$f ; \ + done + -rmdir $(DESTDIR)$(installdir) + +rl$(EXEEXT): rl.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rl.o $(READLINE_LIB) $(TERMCAP_LIB) + +rlbasic$(EXEEXT): rlbasic.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlbasic.o $(READLINE_LIB) $(TERMCAP_LIB) + +rlcat$(EXEEXT): rlcat.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlcat.o $(READLINE_LIB) $(TERMCAP_LIB) + +rlevent$(EXEEXT): rlevent.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlevent.o $(READLINE_LIB) $(TERMCAP_LIB) + +rlkeymaps$(EXEEXT): rlkeymaps.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlkeymaps.o $(READLINE_LIB) $(TERMCAP_LIB) + +fileman$(EXEEXT): fileman.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ fileman.o $(READLINE_LIB) $(TERMCAP_LIB) + +rltest$(EXEEXT): rltest.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rltest.o $(READLINE_LIB) $(TERMCAP_LIB) + +rltest2$(EXEEXT): rltest2.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rltest2.o $(READLINE_LIB) $(TERMCAP_LIB) + +rl-callbacktest$(EXEEXT): rl-callbacktest.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rl-callbacktest.o $(READLINE_LIB) $(TERMCAP_LIB) + +rlptytest$(EXEEXT): rlptytest.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlptytest.o $(READLINE_LIB) $(TERMCAP_LIB) $(LIBUTIL) + +rl-timeout$(EXEEXT): rl-timeout.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rl-timeout.o $(READLINE_LIB) $(TERMCAP_LIB) + +rlversion$(EXEEXT): rlversion.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlversion.o $(READLINE_LIB) $(TERMCAP_LIB) + +histexamp$(EXEEXT): histexamp.o $(HISTORY_LIB) + $(CC) $(LDFLAGS) -o $@ histexamp.o -lhistory $(TERMCAP_LIB) + +hist_erasedups$(EXEEXT): hist_erasedups.o $(HISTORY_LIB) + $(CC) $(LDFLAGS) -o $@ hist_erasedups.o -lhistory $(TERMCAP_LIB) + +hist_purgecmd$(EXEEXT): hist_purgecmd.o $(HISTORY_LIB) + $(CC) $(LDFLAGS) -o $@ hist_purgecmd.o -lhistory $(TERMCAP_LIB) + +clean mostlyclean: + $(RM) $(OBJECTS) $(OTHEROBJ) + $(RM) $(EXECUTABLES) $(OTHEREXE) *.exe + +distclean maintainer-clean: clean + $(RM) Makefile + +fileman.o: fileman.c +rltest.o: rltest.c +rltest2.o: rltest2.c +rl.o: rl.c +rlversion.o: rlversion.c +histexamp.o: histexamp.c +hist_erasedups.o: hist_erasedups.c +hist_purgecmd.o: hist_purgecmd.c +rlbasic.o: rlbasic.c +rlkeymaps.o: rlkeymaps.c +rlcat.o: rlcat.c +rlptytest.o: rlptytest.c +rl-callbacktest.o: rl-callbacktest.c +rl-timeout.o: rl-timeout.c + +fileman.o: $(top_srcdir)/readline.h +rltest.o: $(top_srcdir)/readline.h +rltest2.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h +rl.o: $(top_srcdir)/readline.h +rlversion.o: $(top_srcdir)/readline.h +histexamp.o: $(top_srcdir)/history.h +hist_erasedups.o: $(top_srcdir)/history.h +hist_purgecmd.o: $(top_srcdir)/history.h +rlbasic.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h +rlcat.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h +rlptytest.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h +rl-callbacktest.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h +rl-timeout.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h diff --git a/examples/autoconf/BASH_CHECK_LIB_TERMCAP b/examples/autoconf/BASH_CHECK_LIB_TERMCAP new file mode 100644 index 0000000..0a09883 --- /dev/null +++ b/examples/autoconf/BASH_CHECK_LIB_TERMCAP @@ -0,0 +1,41 @@ +AC_DEFUN([BASH_CHECK_LIB_TERMCAP], +[ +if test "X$bash_cv_termcap_lib" = "X"; then +_bash_needmsg=yes +else +AC_MSG_CHECKING(which library has the termcap functions) +_bash_needmsg= +fi +AC_CACHE_VAL(bash_cv_termcap_lib, +[AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc, + [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap, + [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo, + [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses, + [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses, + [AC_CHECK_LIB(ncursesw, tgetent, bash_cv_termcap_lib=libncursesw, + bash_cv_termcap_lib=gnutermcap)])])])])])]) +if test "X$_bash_needmsg" = "Xyes"; then +AC_MSG_CHECKING(which library has the termcap functions) +fi +AC_MSG_RESULT(using $bash_cv_termcap_lib) +if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then +LDFLAGS="$LDFLAGS -L./lib/termcap" +TERMCAP_LIB="./lib/termcap/libtermcap.a" +TERMCAP_DEP="./lib/termcap/libtermcap.a" +elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then +TERMCAP_LIB=-ltermcap +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libtinfo; then +TERMCAP_LIB=-ltinfo +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libncurses; then +TERMCAP_LIB=-lncurses +TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libc; then +TERMCAP_LIB= +TERMCAP_DEP= +else +TERMCAP_LIB=-lcurses +TERMCAP_DEP= +fi +]) diff --git a/examples/autoconf/RL_LIB_READLINE_VERSION b/examples/autoconf/RL_LIB_READLINE_VERSION new file mode 100644 index 0000000..cc158a8 --- /dev/null +++ b/examples/autoconf/RL_LIB_READLINE_VERSION @@ -0,0 +1,119 @@ +dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB +dnl require: +dnl AC_PROG_CC +dnl BASH_CHECK_LIB_TERMCAP + +AC_DEFUN([RL_LIB_READLINE_VERSION], +[ +AC_REQUIRE([BASH_CHECK_LIB_TERMCAP]) + +AC_MSG_CHECKING([version of installed readline library]) + +# What a pain in the ass this is. + +# save cpp and ld options +_save_CFLAGS="$CFLAGS" +_save_LDFLAGS="$LDFLAGS" +_save_LIBS="$LIBS" + +# Don't set ac_cv_rl_prefix if the caller has already assigned a value. This +# allows the caller to do something like $_rl_prefix=$withval if the user +# specifies --with-installed-readline=PREFIX as an argument to configure + +if test -z "$ac_cv_rl_prefix"; then +test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix} +fi + +eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include +eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib + +LIBS="$LIBS -lreadline ${TERMCAP_LIB}" +CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}" +LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}" + +AC_CACHE_VAL(ac_cv_rl_version, +[AC_TRY_RUN([ +#include +#include +#include + +extern int rl_gnu_readline_p; + +main() +{ + FILE *fp; + fp = fopen("conftest.rlv", "w"); + if (fp == 0) + exit(1); + if (rl_gnu_readline_p != 1) + fprintf(fp, "0.0\n"); + else + fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0"); + fclose(fp); + exit(0); +} +], +ac_cv_rl_version=`cat conftest.rlv`, +ac_cv_rl_version='0.0', +ac_cv_rl_version='4.2')]) + +CFLAGS="$_save_CFLAGS" +LDFLAGS="$_save_LDFLAGS" +LIBS="$_save_LIBS" + +RL_MAJOR=0 +RL_MINOR=0 + +# ( +case "$ac_cv_rl_version" in +2*|3*|4*|5*|6*|7*|8*|9*) + RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'` + RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'` + ;; +esac + +# ((( +case $RL_MAJOR in +[[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;; +[[0-9]]) _RL_MAJOR=0$RL_MAJOR ;; +*) _RL_MAJOR=00 ;; +esac + +# ((( +case $RL_MINOR in +[[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;; +[[0-9]]) _RL_MINOR=0$RL_MINOR ;; +*) _RL_MINOR=00 ;; +esac + +RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}" + +# Readline versions greater than 4.2 have these defines in readline.h + +if test $ac_cv_rl_version = '0.0' ; then + AC_MSG_WARN([Could not test version of installed readline library.]) +elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then + # set these for use by the caller + RL_PREFIX=$ac_cv_rl_prefix + RL_LIBDIR=$ac_cv_rl_libdir + RL_INCLUDEDIR=$ac_cv_rl_includedir + AC_MSG_RESULT($ac_cv_rl_version) +else + +AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library]) +AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library]) +AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library]) + +AC_SUBST(RL_VERSION) +AC_SUBST(RL_MAJOR) +AC_SUBST(RL_MINOR) + +# set these for use by the caller +RL_PREFIX=$ac_cv_rl_prefix +RL_LIBDIR=$ac_cv_rl_libdir +RL_INCLUDEDIR=$ac_cv_rl_includedir + +AC_MSG_RESULT($ac_cv_rl_version) + +fi +]) diff --git a/examples/autoconf/wi_LIB_READLINE b/examples/autoconf/wi_LIB_READLINE new file mode 100644 index 0000000..c738322 --- /dev/null +++ b/examples/autoconf/wi_LIB_READLINE @@ -0,0 +1,76 @@ +dnl Borut Razem +dnl +dnl This macro checks for the presence of the readline library. +dnl It works also in cross-compilation environment. +dnl +dnl To get it into the aclocal.m4 dnl file, do this: +dnl aclocal -I . --verbose +dnl +dnl The --verbose will show all of the files that are searched +dnl for .m4 macros. + +AC_DEFUN([wi_LIB_READLINE], [ + dnl check for the readline.h header file + + AC_CHECK_HEADER(readline/readline.h) + + if test "$ac_cv_header_readline_readline_h" = yes; then + dnl check the readline version + + cat > conftest.$ac_ext < +#include +wi_LIB_READLINE_VERSION RL_VERSION_MAJOR RL_VERSION_MINOR +EOF + + wi_READLINE_VERSION=$($CPP $CPPFLAGS conftest.$ac_ext | sed -n -e "s/^wi_LIB_READLINE_VERSION *\([[0-9\]][[0-9\]]*\) *\([[0-9\]][[0-9\]]*\)$/\1.\2/p") + rm -rf conftest* + + if test -n "$wi_READLINE_VERSION"; then + wi_MAJOR=$(expr $wi_READLINE_VERSION : '\([[0-9]][[0-9]]*\)\.') + wi_MINOR=$(expr $wi_READLINE_VERSION : '[[0-9]][[0-9]]*\.\([[0-9]][[0-9]]*$\)') + if test $wi_MINOR -lt 10; then + wi_MINOR=$(expr $wi_MINOR \* 10) + fi + wi_READLINE_VERSION=$(expr $wi_MAJOR \* 100 + $wi_MINOR) + else + wi_READLINE_VERSION=-1 + fi + + dnl check for the readline library + + ac_save_LIBS="$LIBS" + # Note: $LIBCURSES is permitted to be empty. + + for LIBREADLINE in "-lreadline.dll" "-lreadline" "-lreadline $LIBCURSES" "-lreadline -ltermcap" "-lreadline -lncurses" "-lreadline -lcurses" + do + AC_MSG_CHECKING([for GNU Readline library $LIBREADLINE]) + + LIBS="$ac_save_LIBS $LIBREADLINE" + + AC_TRY_LINK([ + /* includes */ + #include + #include + ],[ + /* function-body */ + int dummy = rl_completion_append_character; /* rl_completion_append_character appeared in version 2.1 */ + readline(NULL); + ],[ + wi_cv_lib_readline=yes + AC_MSG_RESULT(yes) + ],[ + wi_cv_lib_readline=no + AC_MSG_RESULT(no) + ]) + + if test "$wi_cv_lib_readline" = yes; then + AC_SUBST(LIBREADLINE) + AC_DEFINE_UNQUOTED(HAVE_LIBREADLINE, $wi_READLINE_VERSION, [Readline]) + break + fi + done + + LIBS="$ac_save_LIBS" + fi +]) diff --git a/examples/excallback.c b/examples/excallback.c new file mode 100644 index 0000000..923c923 --- /dev/null +++ b/examples/excallback.c @@ -0,0 +1,200 @@ +/* +From: Jeff Solomon +Date: Fri, 9 Apr 1999 10:13:27 -0700 (PDT) +To: chet@po.cwru.edu +Subject: new readline example +Message-ID: <14094.12094.527305.199695@mrclean.Stanford.EDU> + +Chet, + +I've been using readline 4.0. Specifically, I've been using the perl +version Term::ReadLine::Gnu. It works great. + +Anyway, I've been playing around the alternate interface and I wanted +to contribute a little C program, callback.c, to you that you could +use as an example of the alternate interface in the /examples +directory of the readline distribution. + +My example shows how, using the alternate interface, you can +interactively change the prompt (which is very nice imo). Also, I +point out that you must roll your own terminal setting when using the +alternate interface because readline depreps (using your parlance) the +terminal while in the user callback. I try to demostrate what I mean +with an example. I've included the program below. + +To compile, I just put the program in the examples directory and made +the appropriate changes to the EXECUTABLES and OBJECTS line and added +an additional target 'callback'. + +I compiled on my Sun Solaris2.6 box using Sun's cc. + +Let me know what you think. + +Jeff +*/ +/* +Copyright (C) 1999 Jeff Solomon +*/ + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include +#include /* xxx - should make this more general */ + +#include + +#ifdef READLINE_LIBRARY +# include "readline.h" +#else +# include +#endif + +#ifndef STDIN_FILENO +# define STDIN_FILENO 0 +#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; + + setlocale (LC_ALL, ""); + + /* Adjust the terminal slightly before the handler is installed. Disable + * canonical mode processing and set the input character time flag to be + * non-blocking. + */ + if( tcgetattr(STDIN_FILENO, &term) < 0 ) { + perror("tcgetattr"); + exit(1); + } + old_lflag = term.c_lflag; + old_vtime = term.c_cc[VTIME]; + term.c_lflag &= ~ICANON; + term.c_cc[VTIME] = 1; + /* COMMENT LINE BELOW - see above */ + if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { + perror("tcsetattr"); + exit(1); + } + + rl_add_defun("change-prompt", change_prompt, CTRL('t')); + rl_callback_handler_install(get_prompt(), process_line); + + while(1) { + FD_ZERO(&fds); + FD_SET(fileno(stdin), &fds); + + if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) { + perror("select"); + exit(1); + } + + if( FD_ISSET(fileno(stdin), &fds) ) { + rl_callback_read_char(); + } + } +} + +void +process_line(char *line) +{ + if( line == NULL ) { + fprintf(stderr, "\n", line); + + /* reset the old terminal setting before exiting */ + term.c_lflag = old_lflag; + term.c_cc[VTIME] = old_vtime; + if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { + perror("tcsetattr"); + exit(1); + } + exit(0); + } + + if( strcmp(line, "sleep") == 0 ) { + sleep(3); + } else { + fprintf(stderr, "|%s|\n", line); + } + + free (line); +} + +int +change_prompt(void) +{ + /* toggle the prompt variable */ + prompt = !prompt; + + /* save away the current contents of the line */ + strcpy(line_buf, rl_line_buffer); + + /* install a new handler which will change the prompt and erase the current line */ + rl_callback_handler_install(get_prompt(), process_line); + + /* insert the old text on the new line */ + rl_insert_text(line_buf); + + /* redraw the current line - this is an undocumented function. It invokes the + * redraw-current-line command. + */ + rl_refresh_line(0, 0); +} + +char * +get_prompt(void) +{ + /* The prompts can even be different lengths! */ + sprintf(prompt_buf, "%s", + prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> "); + return prompt_buf; +} diff --git a/examples/fileman.c b/examples/fileman.c new file mode 100644 index 0000000..2a8b097 --- /dev/null +++ b/examples/fileman.c @@ -0,0 +1,506 @@ +/* fileman.c - file manager example for readline library. */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +/* 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 +#endif + +#include +#ifdef HAVE_SYS_FILE_H +# include +#endif +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include + +#if defined (HAVE_STRING_H) +# include +#else /* !HAVE_STRING_H */ +# include +#endif /* !HAVE_STRING_H */ + +#ifdef HAVE_STDLIB_H +# include +#endif + +#include + +#ifdef READLINE_LIBRARY +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern char *xmalloc PARAMS((size_t)); + +void initialize_readline PARAMS((void)); +void too_dangerous PARAMS((char *)); + +int execute_line PARAMS((char *)); +int valid_argument PARAMS((char *, char *)); + +/* The names of functions that actually do the manipulation. */ +int com_list PARAMS((char *)); +int com_view PARAMS((char *)); +int com_rename PARAMS((char *)); +int com_stat PARAMS((char *)); +int com_pwd PARAMS((char *)); +int com_delete PARAMS((char *)); +int com_help PARAMS((char *)); +int com_cd PARAMS((char *)); +int com_quit PARAMS((char *)); + +/* A structure which contains information on the commands this program + can understand. */ + +typedef struct { + char *name; /* User printable name of the function. */ + rl_icpfunc_t *func; /* Function to call to do the job. */ + char *doc; /* Documentation for this function. */ +} COMMAND; + +COMMAND commands[] = { + { "cd", com_cd, "Change to directory DIR" }, + { "delete", com_delete, "Delete FILE" }, + { "help", com_help, "Display this text" }, + { "?", com_help, "Synonym for `help'" }, + { "list", com_list, "List files in DIR" }, + { "ls", com_list, "Synonym for `list'" }, + { "pwd", com_pwd, "Print the current working directory" }, + { "quit", com_quit, "Quit using Fileman" }, + { "rename", com_rename, "Rename FILE to NEWNAME" }, + { "stat", com_stat, "Print out statistics on FILE" }, + { "view", com_view, "View the contents of FILE" }, + { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } +}; + +/* Forward declarations. */ +char *stripwhite (); +COMMAND *find_command (); + +/* The name of this program, as taken from argv[0]. */ +char *progname; + +/* When non-zero, this global means the user is done using this program. */ +int done; + +char * +dupstr (s) + char *s; +{ + char *r; + + r = xmalloc (strlen (s) + 1); + strcpy (r, s); + return (r); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *line, *s; + + progname = argv[0]; + + initialize_readline (); /* Bind our completer. */ + + /* Loop reading and executing lines until the user quits. */ + for ( ; done == 0; ) + { + line = readline ("FileMan: "); + + if (!line) + break; + + /* Remove leading and trailing whitespace from the line. + Then, if there is anything left, add it to the history list + and execute it. */ + s = stripwhite (line); + + if (*s) + { + add_history (s); + execute_line (s); + } + + free (line); + } + exit (0); +} + +/* Execute a command line. */ +int +execute_line (line) + char *line; +{ + register int i; + COMMAND *command; + char *word; + + /* Isolate the command word. */ + i = 0; + while (line[i] && whitespace (line[i])) + i++; + word = line + i; + + while (line[i] && !whitespace (line[i])) + i++; + + if (line[i]) + line[i++] = '\0'; + + command = find_command (word); + + if (!command) + { + fprintf (stderr, "%s: No such command for FileMan.\n", word); + return (-1); + } + + /* Get argument to command, if any. */ + while (whitespace (line[i])) + i++; + + word = line + i; + + /* Call the function. */ + return ((*(command->func)) (word)); +} + +/* Look up NAME as the name of a command, and return a pointer to that + command. Return a NULL pointer if NAME isn't a command name. */ +COMMAND * +find_command (name) + char *name; +{ + register int i; + + for (i = 0; commands[i].name; i++) + if (strcmp (name, commands[i].name) == 0) + return (&commands[i]); + + return ((COMMAND *)NULL); +} + +/* Strip whitespace from the start and end of STRING. Return a pointer + into STRING. */ +char * +stripwhite (string) + char *string; +{ + register char *s, *t; + + for (s = string; whitespace (*s); s++) + ; + + if (*s == 0) + return (s); + + t = s + strlen (s) - 1; + while (t > s && whitespace (*t)) + t--; + *++t = '\0'; + + return s; +} + +/* **************************************************************** */ +/* */ +/* Interface to Readline Completion */ +/* */ +/* **************************************************************** */ + +char *command_generator PARAMS((const char *, int)); +char **fileman_completion PARAMS((const char *, int, int)); + +/* Tell the GNU Readline library how to complete. We want to try to complete + on command names if this is the first word in the line, or on filenames + if not. */ +void +initialize_readline () +{ + /* Allow conditional parsing of the ~/.inputrc file. */ + rl_readline_name = "FileMan"; + + /* Tell the completer that we want a crack first. */ + rl_attempted_completion_function = fileman_completion; +} + +/* Attempt to complete on the contents of TEXT. START and END bound the + region of rl_line_buffer that contains the word to complete. TEXT is + the word to complete. We can use the entire contents of rl_line_buffer + in case we want to do some simple parsing. Return the array of matches, + or NULL if there aren't any. */ +char ** +fileman_completion (text, start, end) + const char *text; + int start, end; +{ + char **matches; + + matches = (char **)NULL; + + /* If this word is at the start of the line, then it is a command + to complete. Otherwise it is the name of a file in the current + directory. */ + if (start == 0) + matches = rl_completion_matches (text, command_generator); + + return (matches); +} + +/* Generator function for command completion. STATE lets us know whether + to start from scratch; without any state (i.e. STATE == 0), then we + start at the top of the list. */ +char * +command_generator (text, state) + const char *text; + int state; +{ + static int list_index, len; + char *name; + + /* If this is a new word to complete, initialize now. This includes + saving the length of TEXT for efficiency, and initializing the index + variable to 0. */ + if (!state) + { + list_index = 0; + len = strlen (text); + } + + /* Return the next name which partially matches from the command list. */ + while (name = commands[list_index].name) + { + list_index++; + + if (strncmp (name, text, len) == 0) + return (dupstr(name)); + } + + /* If no names matched, then return NULL. */ + return ((char *)NULL); +} + +/* **************************************************************** */ +/* */ +/* FileMan Commands */ +/* */ +/* **************************************************************** */ + +/* String to pass to system (). This is for the LIST, VIEW and RENAME + commands. */ +static char syscom[1024]; + +/* List the file(s) named in arg. */ +int +com_list (arg) + char *arg; +{ + if (!arg) + arg = ""; + + sprintf (syscom, "ls -FClg %s", arg); + return (system (syscom)); +} + +int +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)); +} + +int +com_rename (arg) + char *arg; +{ + too_dangerous ("rename"); + return (1); +} + +int +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 %lu byte%s in length.\n", + arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + (unsigned long)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); +} + +int +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. */ +int +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'. Possibilities 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. */ +int +com_cd (arg) + char *arg; +{ + if (chdir (arg) == -1) + { + perror (arg); + return 1; + } + + com_pwd (""); + return (0); +} + +/* Print out the current working directory. */ +int +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. */ +int +com_quit (arg) + char *arg; +{ + done = 1; + return (0); +} + +/* Function which tells you that you can't do this. */ +void +too_dangerous (caller) + char *caller; +{ + fprintf (stderr, + "%s: Too dangerous for me to distribute. Write it yourself.\n", + caller); +} + +/* Return non-zero if ARG is a valid argument for CALLER, else print + an error message and return zero. */ +int +valid_argument (caller, arg) + char *caller, *arg; +{ + if (!arg || !*arg) + { + fprintf (stderr, "%s: Argument required.\n", caller); + return (0); + } + + return (1); +} diff --git a/examples/hist_erasedups.c b/examples/hist_erasedups.c new file mode 100644 index 0000000..f820eba --- /dev/null +++ b/examples/hist_erasedups.c @@ -0,0 +1,121 @@ +/* hist_erasedups -- remove all duplicate entries from history file */ + +/* Copyright (C) 2011 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ +#ifndef READLINE_LIBRARY +#define READLINE_LIBRARY 1 +#endif + +#include +#include +#include + +#ifdef READLINE_LIBRARY +# include "history.h" +#else +# include +#endif + +#include + +#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)) + +int hist_erasedups (void); + +static void +usage() +{ + fprintf (stderr, "hist_erasedups: usage: hist_erasedups [-t] [filename]\n"); + exit (2); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *fn; + int r; + + while ((r = getopt (argc, argv, "t")) != -1) + { + switch (r) + { + case 't': + history_write_timestamps = 1; + break; + default: + usage (); + } + } + argv += optind; + argc -= optind; + + fn = argc ? argv[0] : getenv ("HISTFILE"); + if (fn == 0) + { + fprintf (stderr, "hist_erasedups: no history file\n"); + usage (); + } + + if ((r = read_history (fn)) != 0) + { + fprintf (stderr, "hist_erasedups: read_history: %s: %s\n", fn, strerror (r)); + exit (1); + } + + hist_erasedups (); + + if ((r = write_history (fn)) != 0) + { + fprintf (stderr, "hist_erasedups: write_history: %s: %s\n", fn, strerror (r)); + exit (1); + } + + exit (0); +} + +int +hist_erasedups () +{ + int r, n; + HIST_ENTRY *h, *temp; + + using_history (); + while (h = previous_history ()) + { + r = where_history (); + for (n = 0; n < r; n++) + { + temp = history_get (n+history_base); + if (STREQ (h->line, temp->line)) + { + remove_history (n); + r--; /* have to get one fewer now */ + n--; /* compensate for above increment */ + history_offset--; /* moving backwards in history list */ + } + } + } + using_history (); + + return r; +} diff --git a/examples/hist_purgecmd.c b/examples/hist_purgecmd.c new file mode 100644 index 0000000..7992d81 --- /dev/null +++ b/examples/hist_purgecmd.c @@ -0,0 +1,151 @@ +/* hist_purgecmd -- remove all instances of command or pattern from history + file */ + +/* Copyright (C) 2011 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ +#ifndef READLINE_LIBRARY +#define READLINE_LIBRARY 1 +#endif + +#include +#include +#include + +#include + +#ifdef READLINE_LIBRARY +# include "history.h" +#else +# include +#endif + +#include + +#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)) + +#define PURGE_REGEXP 0x01 + +int hist_purgecmd (char *, int); + +static void +usage() +{ + fprintf (stderr, "hist_purgecmd: usage: hist_purgecmd [-r] [-t] [-f filename] command-spec\n"); + exit (2); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *fn; + int r, flags; + + flags = 0; + fn = 0; + while ((r = getopt (argc, argv, "f:rt")) != -1) + { + switch (r) + { + case 'f': + fn = optarg; + break; + case 'r': + flags |= PURGE_REGEXP; + break; + case 't': + history_write_timestamps = 1; + break; + default: + usage (); + } + } + argv += optind; + argc -= optind; + + if (fn == 0) + fn = getenv ("HISTFILE"); + if (fn == 0) + { + fprintf (stderr, "hist_purgecmd: no history file\n"); + usage (); + } + + if ((r = read_history (fn)) != 0) + { + fprintf (stderr, "hist_purgecmd: read_history: %s: %s\n", fn, strerror (r)); + exit (1); + } + + for (r = 0; r < argc; r++) + hist_purgecmd (argv[r], flags); + + if ((r = write_history (fn)) != 0) + { + fprintf (stderr, "hist_purgecmd: write_history: %s: %s\n", fn, strerror (r)); + exit (1); + } + + exit (0); +} + +int +hist_purgecmd (cmd, flags) + char *cmd; + int flags; +{ + int r, n, rflags; + HIST_ENTRY *temp; + regex_t regex = { 0 }; + + if (flags & PURGE_REGEXP) + { + rflags = REG_EXTENDED|REG_NOSUB; + if (regcomp (®ex, cmd, rflags)) + { + fprintf (stderr, "hist_purgecmd: %s: invalid regular expression\n", cmd); + return -1; + } + } + + r = 0; + using_history (); + r = where_history (); + for (n = 0; n < r; n++) + { + temp = history_get (n+history_base); + if (((flags & PURGE_REGEXP) && (regexec (®ex, temp->line, 0, 0, 0) == 0)) || + ((flags & PURGE_REGEXP) == 0 && STREQ (temp->line, cmd))) + { + remove_history (n); + r--; /* have to get one fewer now */ + n--; /* compensate for above increment */ + history_offset--; /* moving backwards in history list */ + } + } + using_history (); + + if (flags & PURGE_REGEXP) + regfree (®ex); + + return r; +} diff --git a/examples/histexamp.c b/examples/histexamp.c new file mode 100644 index 0000000..309d769 --- /dev/null +++ b/examples/histexamp.c @@ -0,0 +1,128 @@ +/* histexamp.c - history library example program. */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#include + +#ifdef READLINE_LIBRARY +# include "history.h" +#else +# include +#endif + +#include +#include +#include + +int +main (argc, argv) + int argc; + char **argv; +{ + char line[1024], *t; + int len, done; + + line[0] = 0; + done = 0; + + using_history (); + while (!done) + { + printf ("history$ "); + fflush (stdout); + t = fgets (line, sizeof (line) - 1, stdin); + if (t && *t) + { + len = strlen (t); + if (t[len - 1] == '\n') + t[len - 1] = '\0'; + } + + if (!t) + strcpy (line, "quit"); + + if (line[0]) + { + char *expansion; + int result; + + using_history (); + + result = history_expand (line, &expansion); + if (result) + fprintf (stderr, "%s\n", expansion); + + if (result < 0 || result == 2) + { + free (expansion); + continue; + } + + add_history (expansion); + strncpy (line, expansion, sizeof (line) - 1); + free (expansion); + } + + if (strcmp (line, "quit") == 0) + done = 1; + else if (strcmp (line, "save") == 0) + write_history ("history_file"); + else if (strcmp (line, "read") == 0) + read_history ("history_file"); + else if (strcmp (line, "list") == 0) + { + register HIST_ENTRY **the_list; + register int i; + time_t tt; + char timestr[128]; + + the_list = history_list (); + if (the_list) + for (i = 0; the_list[i]; i++) + { + tt = history_get_time (the_list[i]); + if (tt) + strftime (timestr, sizeof (timestr), "%a %R", localtime(&tt)); + else + strcpy (timestr, "??"); + printf ("%d: %s: %s\n", i + history_base, timestr, the_list[i]->line); + } + } + else if (strncmp (line, "delete", 6) == 0) + { + int which; + if ((sscanf (line + 6, "%d", &which)) == 1) + { + HIST_ENTRY *entry = remove_history (which); + if (!entry) + fprintf (stderr, "No such entry %d\n", which); + else + { + free (entry->line); + free (entry); + } + } + else + { + fprintf (stderr, "non-numeric arg given to `delete'\n"); + } + } + } +} diff --git a/examples/manexamp.c b/examples/manexamp.c new file mode 100644 index 0000000..351c628 --- /dev/null +++ b/examples/manexamp.c @@ -0,0 +1,111 @@ +/* manexamp.c -- The examples which appear in the documentation are here. */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#include +#include + +/* **************************************************************** */ +/* */ +/* How to Emulate gets () */ +/* */ +/* **************************************************************** */ + +/* A static variable for holding the line. */ +static char *line_read = (char *)NULL; + +/* Read a string, and return a pointer to it. Returns NULL on EOF. */ +char * +rl_gets () +{ + /* If the buffer has already been allocated, return the memory + to the free pool. */ + if (line_read) + { + free (line_read); + line_read = (char *)NULL; + } + + /* Get a line from the user. */ + line_read = readline (""); + + /* If the line has any text in it, save it on the history. */ + if (line_read && *line_read) + add_history (line_read); + + return (line_read); +} + +/* **************************************************************** */ +/* */ +/* Writing a Function to be Called by Readline. */ +/* */ +/* **************************************************************** */ + +/* Invert the case of the COUNT following characters. */ +invert_case_line (count, key) + int count, key; +{ + register int start, end; + + start = rl_point; + + if (count < 0) + { + direction = -1; + count = -count; + } + else + direction = 1; + + /* Find the end of the range to modify. */ + end = start + (count * direction); + + /* Force it to be within range. */ + if (end > rl_end) + end = rl_end; + else if (end < 0) + end = -1; + + if (start > end) + { + int temp = start; + start = end; + end = temp; + } + + if (start == end) + return; + + /* Tell readline that we are modifying the line, so save the undo + information. */ + rl_modifying (start, end); + + for (; start != end; start += direction) + { + if (_rl_uppercase_p (rl_line_buffer[start])) + rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]); + else if (_rl_lowercase_p (rl_line_buffer[start])) + rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]); + } + + /* Move point to on top of the last character changed. */ + rl_point = end - direction; +} diff --git a/examples/readlinebuf.h b/examples/readlinebuf.h new file mode 100644 index 0000000..c8f3a7b --- /dev/null +++ b/examples/readlinebuf.h @@ -0,0 +1,139 @@ +/******************************************************************************* + * $Revision: 1.2 $ + * $Date: 2001/09/11 06:19:36 $ + * $Author: vyzo $ + * + * Contents: A streambuf which uses the GNU readline library for line I/O + * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu] + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ******************************************************************************/ + +#ifndef _READLINEBUF_H_ +#define _READLINEBUF_H_ + +#include +#include +#include +#include +#include + +#include +#include + +#if (defined __GNUC__) && (__GNUC__ < 3) +#include +#else +#include +using std::streamsize; +using std::streambuf; +#endif + +class readlinebuf : public streambuf { +public: +#if (defined __GNUC__) && (__GNUC__ < 3) + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; +#endif + static const int_type eof = EOF; // this is -1 + static const int_type not_eof = 0; + +private: + const char* prompt_; + bool history_; + char* line_; + int low_; + int high_; + +protected: + + virtual int_type showmanyc() const { return high_ - low_; } + + virtual streamsize xsgetn( char_type* buf, streamsize n ) { + int rd = n > (high_ - low_)? (high_ - low_) : n; + memcpy( buf, line_, rd ); + low_ += rd; + + if ( rd < n ) { + low_ = high_ = 0; + free( line_ ); // free( NULL ) is a noop + line_ = readline( prompt_ ); + if ( line_ ) { + high_ = strlen( line_ ); + if ( history_ && high_ ) add_history( line_ ); + rd += xsgetn( buf + rd, n - rd ); + } + } + + return rd; + } + + virtual int_type underflow() { + if ( high_ == low_ ) { + low_ = high_ = 0; + free( line_ ); // free( NULL ) is a noop + line_ = readline( prompt_ ); + if ( line_ ) { + high_ = strlen( line_ ); + if ( history_ && high_ ) add_history( line_ ); + } + } + + if ( low_ < high_ ) return line_[low_]; + else return eof; + } + + virtual int_type uflow() { + int_type c = underflow(); + if ( c != eof ) ++low_; + return c; + } + + virtual int_type pbackfail( int_type c = eof ) { + if ( low_ > 0 ) --low_; + else if ( c != eof ) { + if ( high_ > 0 ) { + char* nl = (char*)realloc( line_, high_ + 1 ); + if ( nl ) { + line_ = (char*)memcpy( nl + 1, line_, high_ ); + high_ += 1; + line_[0] = char( c ); + } else return eof; + } else { + assert( !line_ ); + line_ = (char*)malloc( sizeof( char ) ); + *line_ = char( c ); + high_ = 1; + } + } else return eof; + + return not_eof; + } + +public: + readlinebuf( const char* prompt = NULL, bool history = true ) + : prompt_( prompt ), history_( history ), + line_( NULL ), low_( 0 ), high_( 0 ) { + setbuf( 0, 0 ); + } + + +}; + +#endif diff --git a/examples/rl-callbacktest.c b/examples/rl-callbacktest.c new file mode 100644 index 0000000..7febacd --- /dev/null +++ b/examples/rl-callbacktest.c @@ -0,0 +1,115 @@ +/* Standard include files. stdio.h is required. */ +#include +#include +#include + +/* Used for select(2) */ +#include +#include + +#include + +#include +#include + +#include + +/* Standard readline include files. */ +#if defined (READLINE_LIBRARY) +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern int errno; + +static void cb_linehandler (char *); +static void signandler (int); + +int running, sigwinch_received; +const char *prompt = "rltest$ "; + +/* Handle SIGWINCH and window size changes when readline is not active and + reading a character. */ +static void +sighandler (int sig) +{ + sigwinch_received = 1; +} + +/* Callback function called for each line when accept-line executed, EOF + seen, or EOF character read. This sets a flag and returns; it could + also call exit(3). */ +static void +cb_linehandler (char *line) +{ + /* Can use ^D (stty eof) or `exit' to exit. */ + if (line == NULL || strcmp (line, "exit") == 0) + { + if (line == 0) + printf ("\n"); + printf ("exit\n"); + /* This function needs to be called to reset the terminal settings, + and calling it from the line handler keeps one extra prompt from + being displayed. */ + rl_callback_handler_remove (); + + running = 0; + } + else + { + if (*line) + add_history (line); + printf ("input line: %s\n", line); + free (line); + } +} + +int +main (int c, char **v) +{ + fd_set fds; + int r; + + setlocale (LC_ALL, ""); + + /* Handle SIGWINCH */ + signal (SIGWINCH, sighandler); + + /* Install the line handler. */ + rl_callback_handler_install (prompt, cb_linehandler); + + /* Enter a simple event loop. This waits until something is available + to read on readline's input stream (defaults to standard input) and + calls the builtin character read callback to read it. It does not + have to modify the user's terminal settings. */ + running = 1; + while (running) + { + FD_ZERO (&fds); + FD_SET (fileno (rl_instream), &fds); + + r = select (FD_SETSIZE, &fds, NULL, NULL, NULL); + if (r < 0 && errno != EINTR) + { + perror ("rltest: select"); + rl_callback_handler_remove (); + break; + } + if (sigwinch_received) + { + rl_resize_terminal (); + sigwinch_received = 0; + } + if (r < 0) + continue; + + if (FD_ISSET (fileno (rl_instream), &fds)) + rl_callback_read_char (); + } + + printf ("rltest: Event loop has exited\n"); + return 0; +} diff --git a/examples/rl-fgets.c b/examples/rl-fgets.c new file mode 100644 index 0000000..5512b94 --- /dev/null +++ b/examples/rl-fgets.c @@ -0,0 +1,374 @@ +/* +Date: Tue, 16 Mar 2004 19:38:40 -0800 +From: Harold Levy +Subject: fgets(stdin) --> readline() redirector +To: chet@po.cwru.edu + +Hi Chet, + +Here is something you may find useful enough to include in the readline +distribution. It is a shared library that redirects calls to fgets(stdin) +to readline() via LD_PRELOAD, and it supports a custom prompt and list of +command names. Many people have asked me for this file, so I thought I'd +pass it your way in hope of just including it with readline to begin with. + +Best Regards, + +-Harold +*/ + +/****************************************************************************** +******************************************************************************* + + FILE NAME: fgets.c TARGET: libfgets.so + AUTHOR: Harold Levy VERSION: 1.0 + hlevy@synopsys.com + + ABSTRACT: Customize fgets() behavior via LD_PRELOAD in the following ways: + + -- If fgets(stdin) is called, redirect to GNU readline() to obtain + command-line editing, file-name completion, history, etc. + + -- A list of commands for command-name completion can be configured by + setting the environment-variable FGETS_COMMAND_FILE to a file containing + the list of commands to be used. + + -- Command-line editing with readline() works best when the prompt string + is known; you can set this with the FGETS_PROMPT environment variable. + + -- There special strings that libfgets will interpret as internal commands: + + _fgets_reset_ reset the command list + + _fgets_dump_ dump status + + _fgets_debug_ toggle debug messages + + HOW TO BUILD: Here are examples of how to build libfgets.so on various + platforms; you will have to add -I and -L flags to configure access to + the readline header and library files. + + (32-bit builds with gcc) + AIX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline -ltermcap + HP-UX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldld -lreadline + Linux: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline + SunOS: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lgen -lreadline + + (64-bit builds without gcc) + SunOS: SUNWspro/bin/cc -D_LARGEFILE64_SOURCE=1 -xtarget=ultra -xarch=v9 \ + -KPIC fgets.c -Bdynamic -lc -ldl -lgen -ltermcap -lreadline + + HOW TO USE: Different operating systems have different levels of support + for the LD_PRELOAD concept. The generic method for 32-bit platforms is to + put libtermcap.so, libfgets.so, and libreadline.so (with absolute paths) + in the LD_PRELOAD environment variable, and to put their parent directories + in the LD_LIBRARY_PATH environment variable. Unfortunately there is no + generic method for 64-bit platforms; e.g. for 64-bit SunOS, you would have + to build both 32-bit and 64-bit libfgets and libreadline libraries, and + use the LD_FLAGS_32 and LD_FLAGS_64 environment variables with preload and + library_path configurations (a mix of 32-bit and 64-bit calls are made under + 64-bit SunOS). + + EXAMPLE WRAPPER: Here is an example shell script wrapper around the + program "foo" that uses fgets() for command-line input: + + #!/bin/csh + #### replace this with the libtermcap.so directory: + set dir1 = "/usr/lib" + #### replace this with the libfgets.so directory: + set dir2 = "/usr/fgets" + #### replace this with the libreadline.so directory: + set dir3 = "/usr/local/lib" + set lib1 = "${dir1}/libtermcap.so" + set lib2 = "${dir2}/libfgets.so" + set lib3 = "${dir3}/libreadline.so" + if ( "${?LD_PRELOAD}" ) then + setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}:${LD_PRELOAD}" + else + setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}" + endif + if ( "${?LD_LIBRARY_PATH}" ) then + setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}:${LD_LIBRARY_PATH}" + else + setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}" + endif + setenv FGETS_COMMAND_FILE "${dir2}/foo.commands" + setenv FGETS_PROMPT "foo> " + exec "foo" $* + + Copyright (C)©2003-2004 Harold Levy. + + This code links to the GNU readline library, and as such is bound by the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 2 or (at your option) any later version. + + The GNU General Public License is often shipped with GNU software, and is + generally kept in a file called COPYING or LICENSE. If you do not have a + copy of the license, write to the Free Software Foundation, 59 Temple Place, + Suite 330, Boston, MA 02111 USA. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + +******************************************************************************* +******************************************************************************/ + + + +#include +#include +#include +#include +#include + +#include +#include + + + +/* for dynamically connecting to the native fgets() */ +#if defined(RTLD_NEXT) +#define REAL_LIBC RTLD_NEXT +#else +#define REAL_LIBC ((void *) -1L) +#endif +typedef char * ( * fgets_t ) ( char * s, int n, FILE * stream ) ; + + + +/* private data */ +/* -- writeable data is stored in the shared library's data segment + -- every process that uses the shared library gets a private memory copy of + its entire data segment + -- static data in the shared library is not copied to the application + -- only read-only (i.e. 'const') data is stored in the shared library's + text segment +*/ +static char ** my_fgets_names = NULL ; +static int my_fgets_number_of_names = 0 ; +static int my_fgets_debug_flag = 0 ; + + + +/* invoked with _fgets_reset_ */ +static void +my_fgets_reset ( + void +) { + if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { + int i ; + if ( my_fgets_debug_flag ) { + printf ( "libfgets: removing command list\n" ) ; + } + for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { + if ( my_fgets_names[i] ) free ( my_fgets_names[i] ) ; + } + free ( my_fgets_names ) ; + } + my_fgets_names = NULL ; + my_fgets_number_of_names = 0 ; +} + + + +/* invoked with _fgets_dump_ */ +static void +my_fgets_dump ( + void +) { + char * s ; + printf ( "\n" ) ; + s = getenv ( "FGETS_PROMPT" ) ; + printf ( "FGETS_PROMPT = %s\n", s ? s : "" ) ; + s = getenv ( "FGETS_COMMAND_FILE" ) ; + printf ( "FGETS_COMMAND_FILE = %s\n", s ? s : "" ) ; + printf ( "debug flag = %d\n", my_fgets_debug_flag ) ; + printf ( "#commands = %d\n", my_fgets_number_of_names ) ; + if ( my_fgets_debug_flag ) { + if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { + int i ; + for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { + printf ( "%s\n", my_fgets_names[i] ) ; + } + } + } + printf ( "\n" ) ; +} + + + +/* invoked with _fgets_debug_ */ +static void +my_fgets_debug_toggle ( + void +) { + my_fgets_debug_flag = my_fgets_debug_flag ? 0 : 1 ; + if ( my_fgets_debug_flag ) { + printf ( "libfgets: debug flag = %d\n", my_fgets_debug_flag ) ; + } +} + + + +/* read the command list if needed, return the i-th name */ +static char * +my_fgets_lookup ( + int index +) { + if ( (! my_fgets_names) || (! my_fgets_number_of_names) ) { + char * fname ; + FILE * fp ; + fgets_t _fgets ; + int i ; + char buf1[256], buf2[256] ; + fname = getenv ( "FGETS_COMMAND_FILE" ) ; + if ( ! fname ) { + if ( my_fgets_debug_flag ) { + printf ( "libfgets: empty or unset FGETS_COMMAND_FILE\n" ) ; + } + return NULL ; + } + fp = fopen ( fname, "r" ) ; + if ( ! fp ) { + if ( my_fgets_debug_flag ) { + printf ( "libfgets: cannot open '%s' for reading\n", fname ) ; + } + return NULL ; + } + _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; + if ( ! _fgets ) { + fprintf ( stderr, + "libfgets: failed to dynamically link to native fgets()\n" + ) ; + return NULL ; + } + for ( i = 0 ; _fgets(buf1,255,fp) ; i ++ ) ; + if ( ! i ) { fclose(fp) ; return NULL ; } + my_fgets_names = (char**) calloc ( i, sizeof(char*) ) ; + rewind ( fp ) ; + i = 0 ; + while ( _fgets(buf1,255,fp) ) { + buf1[255] = 0 ; + if ( 1 == sscanf(buf1,"%s",buf2) ) { + my_fgets_names[i] = strdup(buf2) ; + i ++ ; + } + } + fclose ( fp ) ; + my_fgets_number_of_names = i ; + if ( my_fgets_debug_flag ) { + printf ( "libfgets: successfully read %d commands\n", i ) ; + } + } + if ( index < my_fgets_number_of_names ) { + return my_fgets_names[index] ; + } else { + return NULL ; + } +} + + + +/* generate a list of partial name matches for readline() */ +static char * +my_fgets_generator ( + const char * text, + int state +) +{ + static int list_index, len ; + char * name ; + if ( ! state ) { + list_index = 0 ; + len = strlen ( text ) ; + } + while ( ( name = my_fgets_lookup(list_index) ) ) { + list_index ++ ; + if ( ! strncmp ( name, text, len ) ) { + return ( strdup ( name ) ) ; + } + } + return ( NULL ) ; +} + + + +/* partial name completion callback for readline() */ +static char ** +my_fgets_completion ( + const char * text, + int start, + int end +) +{ + char ** matches ; + matches = NULL ; + if ( ! start ) { + matches = rl_completion_matches ( text, my_fgets_generator ) ; + } + return ( matches ) ; +} + + + +/* fgets() intercept */ +char * +fgets ( + char * s, + int n, + FILE * stream +) +{ + if ( ! s ) return NULL ; + if ( stream == stdin ) { + char * prompt ; + char * my_fgets_line ; + rl_already_prompted = 1 ; + rl_attempted_completion_function = my_fgets_completion ; + rl_catch_signals = 1 ; + rl_catch_sigwinch = 1 ; + rl_set_signals () ; + prompt = getenv ( "FGETS_PROMPT" ) ; + for ( + my_fgets_line = 0 ; ! my_fgets_line ; my_fgets_line=readline(prompt) + ) ; + if ( ! strncmp(my_fgets_line, "_fgets_reset_", 13) ) { + my_fgets_reset () ; + free ( my_fgets_line ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + if ( ! strncmp(my_fgets_line, "_fgets_dump_", 12) ) { + my_fgets_dump () ; + free ( my_fgets_line ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + if ( ! strncmp(my_fgets_line, "_fgets_debug_", 13) ) { + my_fgets_debug_toggle () ; + free ( my_fgets_line ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + (void) strncpy ( s, my_fgets_line, n-1 ) ; + (void) strcat ( s, "\n" ) ; + if ( *my_fgets_line ) add_history ( my_fgets_line ) ; + free ( my_fgets_line ) ; + return ( s ) ; + } else { + static fgets_t _fgets ; + _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; + if ( ! _fgets ) { + fprintf ( stderr, + "libfgets: failed to dynamically link to native fgets()\n" + ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + return ( + _fgets ( s, n, stream ) + ) ; + } +} diff --git a/examples/rl-test-timeout b/examples/rl-test-timeout new file mode 100644 index 0000000..2c9de1a --- /dev/null +++ b/examples/rl-test-timeout @@ -0,0 +1,6 @@ +./rl-timeout readline1 0.5 +./rl-timeout readline2 0.25 + +./rl-timeout callback1 0.5 +./rl-timeout callback2 0.5 + diff --git a/examples/rl-timeout.c b/examples/rl-timeout.c new file mode 100644 index 0000000..b8a24ba --- /dev/null +++ b/examples/rl-timeout.c @@ -0,0 +1,245 @@ +/* rl-timeout: test various readline builtin timeouts. */ + +/* Copyright (C) 2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +/* Standard include files. stdio.h is required. */ +#include +#include +#include +#include + +/* Used for select(2) */ +#include +#include + +#include +#include + +/* Standard readline include files. */ +#if defined (READLINE_LIBRARY) +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern int errno; + +static void cb_linehandler (char *); + +int timeout_secs = 1, timeout_usecs = 0; +int running; +const char *prompt = "rl-timeout$ "; + +/* **************************************************************** */ +/* */ +/* Example 1: readline () with rl_readline_state */ +/* */ +/* **************************************************************** */ + +void +rltest_timeout_readline1 () +{ + const char *temp; + + rl_set_timeout (timeout_secs, timeout_usecs); + temp = readline (prompt); + if (RL_ISSTATE (RL_STATE_TIMEOUT)) + printf ("timeout\n"); + else if (temp == NULL) + printf ("no input line\n"); + else + printf ("input line: %s\n", temp); + free ((void *) temp); +} + +/* **************************************************************** */ +/* */ +/* Example 2: readline () with rl_timeout_event_hook */ +/* */ +/* **************************************************************** */ + +static int +timeout_handler () +{ + printf ("timeout\n"); + return READERR; +} + +void +rltest_timeout_readline2 () +{ + const char *temp; + + rl_set_timeout (timeout_secs, timeout_usecs); + rl_timeout_event_hook = timeout_handler; + temp = readline (prompt); + if (temp == NULL) + printf ("no input line\n"); + else + printf ("input line: %s\n", temp); + free ((void *)temp); +} + +/* **************************************************************** */ +/* */ +/* Example 3: rl_callback_* () with rl_timeout_remaining */ +/* */ +/* **************************************************************** */ + +/* Callback function called for each line when accept-line executed, EOF + seen, or EOF character read. This sets a flag and returns; it could + also call exit(3). */ +static void +cb_linehandler (char *line) +{ + /* Can use ^D (stty eof) or `exit' to exit. */ + if (line == NULL || strcmp (line, "exit") == 0) + { + if (line == 0) + printf ("\n"); + printf ("exit\n"); + /* This function needs to be called to reset the terminal settings, + and calling it from the line handler keeps one extra prompt from + being displayed. */ + rl_callback_handler_remove (); + + running = 0; + } + else + { + if (*line) + add_history (line); + printf ("input line: %s\n", line); + free (line); + } +} + +void +rltest_timeout_callback1 () +{ + fd_set fds; + int r; + unsigned sec, usec; + + rl_set_timeout (timeout_secs, timeout_usecs); + rl_callback_handler_install (prompt, cb_linehandler); + running = 1; + while (running) + { + FD_ZERO (&fds); + FD_SET (fileno (rl_instream), &fds); + r = rl_timeout_remaining (&sec, &usec); + if (r == 1) + { + struct timeval timeout = {sec, usec}; + r = select (FD_SETSIZE, &fds, NULL, NULL, &timeout); + } + if (r < 0 && errno != EINTR) + { + perror ("rl-timeout: select"); + rl_callback_handler_remove (); + break; + } + else if (r == 0) + { + printf ("rl-timeout: timeout\n"); + rl_callback_handler_remove (); + break; + } + + if (FD_ISSET (fileno (rl_instream), &fds)) + rl_callback_read_char (); + } + + printf ("rl-timeout: Event loop has exited\n"); +} + +/* **************************************************************** */ +/* */ +/* Example 4: rl_callback_* () with rl_timeout_event_hook */ +/* */ +/* **************************************************************** */ + +static int +cb_timeouthandler () +{ + printf ("timeout\n"); + rl_callback_handler_remove (); + running = 0; + return READERR; +} + +void +rltest_timeout_callback2 () +{ + int r; + + rl_set_timeout (timeout_secs, timeout_usecs); + rl_timeout_event_hook = cb_timeouthandler; + rl_callback_handler_install (prompt, cb_linehandler); + running = 1; + while (running) + rl_callback_read_char (); + + printf ("rl-timeout: Event loop has exited\n"); +} + +int +main (int argc, char **argv) +{ + if (argc >= 2) + { + if (argc >= 3) + { + double timeout = atof (argv[2]); + if (timeout <= 0.0) + { + fprintf (stderr, "rl-timeout: specify a positive number for timeout.\n"); + return 2; + } + else if (timeout > UINT_MAX) + { + fprintf (stderr, "rl-timeout: timeout too large.\n"); + return 2; + } + timeout_secs = (unsigned) timeout; + timeout_usecs = (unsigned) ((timeout - timeout_secs) * 1000000 + 0.5); + } + + if (strcmp (argv[1], "readline1") == 0) + rltest_timeout_readline1 (); + else if (strcmp (argv[1], "readline2") == 0) + rltest_timeout_readline2 (); + else if (strcmp (argv[1], "callback1") == 0) + rltest_timeout_callback1 (); + else if (strcmp (argv[1], "callback2") == 0) + rltest_timeout_callback2 (); + else + return 2; + } + else + { + fprintf (stderr, "usage: rl-timeout [readline1 | readline2 | callback1 | callback2] [timeout]\n"); + return 2; + } + return 0; +} diff --git a/examples/rl.c b/examples/rl.c new file mode 100644 index 0000000..39e5b8e --- /dev/null +++ b/examples/rl.c @@ -0,0 +1,166 @@ +/* + * rl - command-line interface to read a line from the standard input + * (or another fd) using readline. + * + * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] + */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include + +#ifdef HAVE_STDLIB_H +# include +#else +extern void exit(); +#endif + +#ifdef HAVE_LOCALE_H +# include +#endif + +#if defined (READLINE_LIBRARY) +# include "posixstat.h" +# include "readline.h" +# include "history.h" +#else +# include +# include +# include +#endif + +extern int optind; +extern char *optarg; + +#if !defined (strchr) && !defined (__STDC__) +extern char *strrchr(); +#endif + +static char *progname; +static char *deftext; + +static int +set_deftext () +{ + if (deftext) + { + rl_insert_text (deftext); + deftext = (char *)NULL; + rl_startup_hook = (rl_hook_func_t *)NULL; + } + return 0; +} + +static void +usage() +{ + fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", + progname, progname); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *temp, *prompt; + struct stat sb; + int opt, fd, nch; + FILE *ifp; + + progname = strrchr(argv[0], '/'); + if (progname == 0) + progname = argv[0]; + else + progname++; + +#ifdef HAVE_SETLOCALE + setlocale (LC_ALL, ""); +#endif + + /* defaults */ + prompt = "readline$ "; + fd = nch = 0; + deftext = (char *)0; + + while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF) + { + switch (opt) + { + case 'p': + prompt = optarg; + break; + case 'u': + fd = atoi(optarg); + if (fd < 0) + { + fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg); + exit (2); + } + break; + case 'd': + deftext = optarg; + break; + case 'n': + nch = atoi(optarg); + if (nch < 0) + { + fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg); + exit (2); + } + break; + default: + usage (); + exit (2); + } + } + + if (fd != 0) + { + if (fstat (fd, &sb) < 0) + { + fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd); + exit (1); + } + ifp = fdopen (fd, "r"); + rl_instream = ifp; + } + + if (deftext && *deftext) + rl_startup_hook = set_deftext; + + if (nch > 0) + rl_num_chars_to_read = nch; + + temp = readline (prompt); + + /* Test for EOF. */ + if (temp == 0) + exit (1); + + printf ("%s\n", temp); + exit (0); +} diff --git a/examples/rlbasic.c b/examples/rlbasic.c new file mode 100644 index 0000000..1ce4da9 --- /dev/null +++ b/examples/rlbasic.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +#ifdef HAVE_LOCALE_H +# include +#endif + +#if defined (READLINE_LIBRARY) +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +int +main (int c, char **v) +{ + char *input; + +#ifdef HAVE_SETLOCALE + setlocale (LC_ALL, ""); +#endif + + for (;;) { + input = readline ((char *)NULL); + if (input == 0) + break; + printf ("%s\n", input); + if (strcmp (input, "exit") == 0) + break; + free (input); + } + exit (0); +} diff --git a/examples/rlcat.c b/examples/rlcat.c new file mode 100644 index 0000000..f1b0362 --- /dev/null +++ b/examples/rlcat.c @@ -0,0 +1,187 @@ +/* + * rlcat - cat(1) using readline + * + * usage: rlcat + */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include "posixstat.h" + +#include +#include +#include +#include + +#ifdef HAVE_STDLIB_H +# include +#else +extern void exit(); +#endif + +#ifdef HAVE_LOCALE_H +# include +#endif + +#ifndef errno +extern int errno; +#endif + +#if defined (READLINE_LIBRARY) +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern int optind; +extern char *optarg; + +static int stdcat(); + +static char *progname; +static int vflag; + +static void +usage() +{ + fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *temp; + int opt, Vflag, Nflag; + +#ifdef HAVE_SETLOCALE + setlocale (LC_ALL, ""); +#endif + + progname = strrchr(argv[0], '/'); + if (progname == 0) + progname = argv[0]; + else + progname++; + + vflag = Vflag = Nflag = 0; + while ((opt = getopt(argc, argv, "vEVN")) != EOF) + { + switch (opt) + { + case 'v': + vflag = 1; + break; + case 'V': + Vflag = 1; + break; + case 'E': + Vflag = 0; + break; + case 'N': + Nflag = 1; + break; + default: + usage (); + exit (2); + } + } + + argc -= optind; + argv += optind; + + if (isatty(0) == 0 || argc || Nflag) + return stdcat(argc, argv); + + rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs"); + while (temp = readline ("")) + { + if (*temp) + add_history (temp); + printf ("%s\n", temp); + } + + return (ferror (stdout)); +} + +static int +fcopy(fp) + FILE *fp; +{ + int c; + char *x; + + while ((c = getc(fp)) != EOF) + { + if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0) + { + x = rl_untranslate_keyseq (c); + if (fputs (x, stdout) == EOF) + return 1; + } + else if (putchar (c) == EOF) + return 1; + } + return (ferror (stdout)); +} + +int +stdcat (argc, argv) + int argc; + char **argv; +{ + int i, fd, r; + char *s; + FILE *fp; + + if (argc == 0) + return (fcopy(stdin)); + + for (i = 0, r = 1; i < argc; i++) + { + if (*argv[i] == '-' && argv[i][1] == 0) + fp = stdin; + else + { + fp = fopen (argv[i], "r"); + if (fp == 0) + { + fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno)); + continue; + } + } + r = fcopy (fp); + if (fp != stdin) + fclose(fp); + } + return r; +} diff --git a/examples/rlevent.c b/examples/rlevent.c new file mode 100644 index 0000000..1b7f4eb --- /dev/null +++ b/examples/rlevent.c @@ -0,0 +1,181 @@ +/* + * rl - command-line interface to read a line from the standard input + * (or another fd) using readline. + * + * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] + */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#else +extern int getopt(); +extern int sleep(); +#endif + +#include +#include + +#ifdef HAVE_STDLIB_H +# include +#else +extern void exit(); +#endif + +#ifdef HAVE_LOCALE_H +# include +#endif + +#if defined (READLINE_LIBRARY) +# include "posixstat.h" +# include "readline.h" +# include "history.h" +#else +# include +# include +# include +#endif + +extern int optind; +extern char *optarg; + +#if !defined (strchr) && !defined (__STDC__) +extern char *strrchr(); +#endif + +static char *progname; +static char *deftext; + +static int +event_hook () +{ + fprintf (stderr, "ding!\n"); + sleep (1); + return 0; +} + +static int +set_deftext () +{ + if (deftext) + { + rl_insert_text (deftext); + deftext = (char *)NULL; + rl_startup_hook = (rl_hook_func_t *)NULL; + } + return 0; +} + +static void +usage() +{ + fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", + progname, progname); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *temp, *prompt; + struct stat sb; + int opt, fd, nch; + FILE *ifp; + +#ifdef HAVE_SETLOCALE + setlocale (LC_ALL, ""); +#endif + + 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; + + rl_event_hook = event_hook; + temp = readline (prompt); + + /* Test for EOF. */ + if (temp == 0) + exit (1); + + printf ("%s\n", temp); + exit (0); +} diff --git a/examples/rlfe/ChangeLog b/examples/rlfe/ChangeLog new file mode 100644 index 0000000..ba41b2b --- /dev/null +++ b/examples/rlfe/ChangeLog @@ -0,0 +1,37 @@ +2004-11-04 Per Bothner + + * pty.c: Import from screen-4.0.2. + * configure.in, Makefile.in, config.h.in: Set up autoconf handling, + copying a bunk of stuff over from screen. + * rlfe.c: Use OpenPTY from pty.c instead of get_master_pty. + +2004-11-03 Per Bothner + + * rlfe.c: Get input emphasis (boldening) more robust. + + * rlfe.c: Various cleanups on comments and names. + +2003-11-07 Wolfgang Taeuber + + * Specify a history file and the size of the history file with command + * line options; use EDITOR/VISUAL to set vi/emacs preference. + +1999-09-03 Chet Ramey + + * fep.c: Memmove is not universally available. This patch assumes + that an autoconf test has been performed, and that memcpy is + available without checking. + + * fep.c: VDISCARD is not universally available, even when termios is. + + * fep.c: If a system doesn't have TIOCSCTTY, the first `open' + performed after setsid allocates a controlling terminal. The + original code would leave the child process running on the slave pty + without a controlling tty if TIOCSCTTY was not available. + + * fep.c: Most versions of SVR4, including solaris, don't allow + terminal ioctl calls on the master side of the pty. + +1999-08-28 Per Bothner + + * fep.c: Initial release. diff --git a/examples/rlfe/Makefile.in b/examples/rlfe/Makefile.in new file mode 100644 index 0000000..7d6fd53 --- /dev/null +++ b/examples/rlfe/Makefile.in @@ -0,0 +1,184 @@ +# +# Makefile template for rlfe +# +# See machine dependant config.h for more configuration options. +# + +srcdir = @srcdir@ +VPATH = @srcdir@ + +DESTDIR = + +# Where to install screen. + +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +# don't forget to change mandir and infodir in doc/Makefile. +bindir = $(exec_prefix)/bin + +VERSION = @VERSION@ +SCREEN = screen-$(VERSION) + +CC = @CC@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +#LDFLAGS = -L$(READLINE_DIR) +LDFLAGS = @LDFLAGS@ +LIBS = -lreadline -lhistory @LIBS@ + +CPP=@CPP@ +CPP_DEPEND=$(CC) -MM + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +AWK = @AWK@ + +OPTIONS= +#OPTIONS= -DDEBUG + +SHELL=/bin/sh + +CFILES= rlfe.c pty.c +HFILES= extern.h os.h screen.h +EXTRA_DIST=configure.in configure Makefile.in config.h.in ChangeLog README +OFILES= rlfe.o pty.o + +all: rlfe + +rlfe: $(OFILES) + $(CC) $(LDFLAGS) -o $@ $(OFILES) $(LIBS) + +rlfe-$(VERSION).tar.gz: + tar czf $@ $(CFILES) $(HFILES) $(EXTRA_DIST) + +.c.o: + $(CC) -c -I. -I$(srcdir) $(CPPFLAGS) $(M_CFLAGS) $(DEFS) $(OPTIONS) $(CFLAGS) $< + +install_bin: .version screen + -if [ -f $(DESTDIR)$(bindir)/$(SCREEN) ] && [ ! -f $(DESTDIR)$(bindir)/$(SCREEN).old ]; \ + then mv $(DESTDIR)$(bindir)/$(SCREEN) $(DESTDIR)$(bindir)/$(SCREEN).old; fi + $(INSTALL_PROGRAM) screen $(DESTDIR)$(bindir)/$(SCREEN) + -chown root $(DESTDIR)$(bindir)/$(SCREEN) && chmod 4755 $(DESTDIR)$(bindir)/$(SCREEN) +# This doesn't work if $(bindir)/screen is a symlink + -if [ -f $(DESTDIR)$(bindir)/screen ] && [ ! -f $(DESTDIR)$(bindir)/screen.old ]; then mv $(DESTDIR)$(bindir)/screen $(DESTDIR)$(bindir)/screen.old; fi + rm -f $(DESTDIR)$(bindir)/screen + (cd $(DESTDIR)$(bindir) && ln -sf $(SCREEN) screen) + cp $(srcdir)/utf8encodings/?? $(DESTDIR)$(SCREENENCODINGS) + +uninstall: .version + rm -f $(DESTDIR)$(bindir)/$(SCREEN) + rm -f $(DESTDIR)$(bindir)/screen + -mv $(DESTDIR)$(bindir)/screen.old $(DESTDIR)$(bindir)/screen + rm -f $(DESTDIR)$(ETCSCREENRC) + cd doc; $(MAKE) uninstall + +shadow: + mkdir shadow; + cd shadow; ln -s ../*.[ch] ../*.in ../*.sh ../configure ../doc ../terminfo ../etc . + rm -f shadow/term.h shadow/tty.c shadow/comm.h shadow/osdef.h + echo "install all Makefiles and config:" > shadow/Makefile + echo " rm -f config.cache" >> shadow/Makefile + echo " sh ./configure" >> shadow/Makefile + +term.h: term.c term.sh + AWK=$(AWK) srcdir=$(srcdir) sh $(srcdir)/term.sh + +kmapdef.c: term.h + +tty.c: tty.sh + sh $(srcdir)/tty.sh tty.c + +mostlyclean: + rm -f $(OFILES) rlfe *.o + +clean celan: mostlyclean + rm -f tty.c term.h comm.h osdef.h kmapdef.c core + +# Delete all files from the current directory that are created by +# configuring or building the program. +# building of term.h/comm.h requires awk. Keep it in the distribution +# we keep config.h, as this file knows where 'make dist' finds the ETCSCREENRC. +#distclean: mostlyclean +# rm -f $(SCREEN).tar $(SCREEN).tar.gz +# rm -f config.status Makefile +# rm -f osdef.h doc/Makefile + +maintainer-clean: + @echo "This command is not even intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + +# Delete everything from the current directory that can be +# reconstructed with this Makefile. +realclean: .version mostlyclean + rm -f $(SCREEN).tar $(SCREEN).tar.gz + rm -f config.status Makefile doc/Makefile + rm -f tty.c term.h comm.h osdef.h kmapdef.c + rm -f config.h + echo "install all Makefiles and config:" > Makefile + echo " sh ./configure" >> Makefile + +tags TAGS: $(CFILES) + -ctags *.sh $(CFILES) *.h + -ctags -e *.sh $(CFILES) *.h + +dist: .version $(SCREEN).tar.gz + + +# Perform self-tests (if any). +check: + +config: + rm -f config.cache + sh ./configure + + +############################################################################### + +.version: + @rev=`sed < $(srcdir)/patchlevel.h -n -e '/#define REV/s/#define REV *//p'`; \ + vers=`sed < $(srcdir)/patchlevel.h -n -e '/#define VERS/s/#define VERS *//p'`; \ + pat=`sed < $(srcdir)/patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL *//p'`; \ + if [ "$${rev}.$${vers}.$${pat}" != "$(VERSION)" ]; then \ + echo "This distribution is screen-$${rev}.$${vers}.$${pat}, but"; \ + echo "the Makefile is from $(VERSION). Please update!"; exit 1; fi + +############################################################################### + +mdepend: $(CFILES) term.h + @rm -f DEPEND ; \ + for i in ${CFILES} ; do \ + echo "$$i" ; \ + echo `echo "$$i" | sed -e 's/.c$$/.o/'`": $$i" `\ + cc -E $$i |\ + grep '^# .*"\./.*\.h"' |\ + (sort -t'"' -u -k 2,2 2>/dev/null || sort -t'"' -u +1 -2) |\ + sed -e 's/.*"\.\/\(.*\)".*/\1/'\ + ` >> DEPEND ; \ + done + +depend: depend.in + ./config.status || ./configure + +depend.in: $(CFILES) term.h + cp Makefile.in Makefile.in~ + sed -e '/\#\#\# Dependencies/q' < Makefile.in > tmp_make + for i in $(CFILES); do echo $$i; $(CPP_DEPEND) $$i >> tmp_make; done + mv tmp_make Makefile.in + +Makefile makefile: config.status $(srcdir)/Makefile.in + CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status + +config.status: $(srcdir)/configure + $(SHELL) ./config.status --recheck + +$(srcdir)/configure: $(srcdir)/configure.in + cd $(srcdir) && autoconf + +############################################################################### + +### Dependencies: +pty.o: pty.c config.h diff --git a/examples/rlfe/README b/examples/rlfe/README new file mode 100644 index 0000000..9e1f689 --- /dev/null +++ b/examples/rlfe/README @@ -0,0 +1,78 @@ +rlfe (ReadLine Front-End) is a "universal wrapper" around readline. +You specify an interactive program to run (typically a shell), and +readline is used to edit input lines. + +There are other such front-ends; what distinguishes this one is that +it monitors the state of the inferior pty, and if the inferior program +switches its terminal to raw mode, then rlfe passes your characters +through directly. This basically means you can run your entire +session (including bash and terminal-mode emacs) under rlfe. + +FEATURES + +* Can use all readline commands (and history) in commands that +read input lines in "canonical mode" - even 'cat'! + +* Automatically switches between "readline-editing mode" and "raw mode" +depending on the terminal mode. If the inferior program invokes +readline itself, it will do its own line editing. (The inferior +readline will not know about rlfe, and it will have its own history.) +You can even run programs like 'emavs -nw' and 'vi' under rlfe. +The goal is you could leave rlfe always on without even knowing +about it. (We're not quite there, but it works tolerably well.) + +* The input line (after any prompt) is changed to bold-face. + +INSTALL + +The usual: ./configure && make && make install + +Note so far rlfe has only been tested on GNU Linux (Fedora Core 2) +and Mac OS X (10.3). + +This assumes readline header files and libraries are in the default +places. If not, you can create a link named readline pointing to the +readline sources. To link with libreadline.a and libhistory.a +you can copy or link them, or add LDFLAGS='-/path/to/readline' to +the make command-line. + +USAGE + +Just run it. That by default runs bash. You can run some other +command by giving it as command-line arguments. + +There are a few tweaks: -h allows you to name the history file, +and -s allows you to specify its size. It default to "emacs" mode, +but if the the environment variable EDITOR is set to "vi" that +mode is chosen. + +ISSUES + +* The mode switching depends on the terminal mode set by the inferior +program. Thus ssh/telnet/screen-type programs will typically be in +raw mode, so rlfe won't be much use, even if remote programs run in +canonical mode. The work-around is to run rlfe on the remote end. + +* Echo supression and prompt recognition are somewhat fragile. +(A protocol so that the o/s tty code can reliably communicate its +state to rlfe could solve this problem, and the previous one.) + +* See the intro to rlfe.c for more notes. + +* Assumes a VT100-compatible terminal, though that could be generalized +if anybody cares. + +* Requires ncurses. + +* It would be useful to integrate rlfe's logic in a terminal emulator. +That would make it easier to reposition the edit position with a mouse, +integrate cut-and-paste with the system clipboard, and more robustly +handle escape sequence and multi-byte characters more robustly. + +AUTHOR + +Per Bothner + +LICENSE + +GPL. diff --git a/examples/rlfe/config.h.in b/examples/rlfe/config.h.in new file mode 100644 index 0000000..a843fec --- /dev/null +++ b/examples/rlfe/config.h.in @@ -0,0 +1,383 @@ +/* Copyright 2004 Per Bothner + * Based on config.h from screen-4.0.2. + * Copyright (c) 1993-2000 + * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) + * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) + * Copyright (c) 1987 Oliver Laumann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING); if not, write to the + * Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + **************************************************************** + * $Id: config.h.in,v 1.12 1994/05/31 12:31:36 mlschroe Exp $ FAU + */ + + + + + +/********************************************************************** + * + * User Configuration Section + */ + + +/* + * define PTYMODE if you do not like the default of 0622, which allows + * public write to your pty. + * define PTYGROUP to some numerical group-id if you do not want the + * tty to be in "your" group. + * Note, screen is unable to change mode or group of the pty if it + * is not installed with sufficient privilege. (e.g. set-uid-root) + * define PTYROFS if the /dev/pty devices are mounted on a read-only + * filesystem so screen should not even attempt to set mode or group + * even if running as root (e.g. on TiVo). + */ +#undef PTYMODE +#undef PTYGROUP +#undef PTYROFS + +/* + * If screen is NOT installed set-uid root, screen can provide tty + * security by exclusively locking the ptys. While this keeps other + * users from opening your ptys, it also keeps your own subprocesses + * from being able to open /dev/tty. Define LOCKPTY to add this + * exclusive locking. + */ +#undef LOCKPTY + + +/********************************************************************** + * + * End of User Configuration Section + * + * Rest of this file is modified by 'configure' + * Change at your own risk! + * + */ + +/* + * Some defines to identify special unix variants + */ +#ifndef SVR4 +#undef SVR4 +#endif + +#ifndef _POSIX_SOURCE +#undef _POSIX_SOURCE +#endif + +/* + * Define POSIX if your system supports IEEE Std 1003.1-1988 (POSIX). + */ +#undef POSIX + +/* + * Define TERMIO if you have struct termio instead of struct sgttyb. + * This is usually the case for SVID systems, where BSD uses sgttyb. + * POSIX systems should define this anyway, even though they use + * struct termios. + */ +#undef TERMIO + +/* + * Define CYTERMIO if you have cyrillic termio modes. + */ +#undef CYTERMIO + +/* + * Define TERMINFO if your machine emulates the termcap routines + * with the terminfo database. + * Thus the .screenrc file is parsed for + * the command 'terminfo' and not 'termcap'. + */ +#undef TERMINFO + +/* + * If your library does not define ospeed, define this. + */ +#undef NEED_OSPEED + +/* + * Define SYSV if your machine is SYSV complient (Sys V, HPUX, A/UX) + */ +#ifndef SYSV +#undef SYSV +#endif + +/* + * Define SIGVOID if your signal handlers return void. On older + * systems, signal returns int, but on newer ones, it returns void. + */ +#undef SIGVOID + +/* + * Define USESIGSET if you have sigset for BSD 4.1 reliable signals. + */ +#undef USESIGSET + +/* + * Define SYSVSIGS if signal handlers must be reinstalled after + * they have been called. + */ +#undef SYSVSIGS + +/* + * Define BSDWAIT if your system defines a 'union wait' in + * + * Only allow BSDWAIT i.e. wait3 on nonposix systems, since + * posix implies wait(3) and waitpid(3). vdlinden@fwi.uva.nl + * + */ +#ifndef POSIX +#undef BSDWAIT +#endif + +/* + * On RISCOS we prefer wait2() over wait3(). rouilj@sni-usa.com + */ +#ifdef BSDWAIT +#undef USE_WAIT2 +#endif + +/* + * Define if you have the utempter utmp helper program + */ +#undef HAVE_UTEMPTER + +/* + * If ttyslot() breaks getlogin() by returning indexes to utmp entries + * of type DEAD_PROCESS, then our getlogin() replacement should be + * selected by defining BUGGYGETLOGIN. + */ +#undef BUGGYGETLOGIN + +/* + * If your system has the calls setreuid() and setregid(), + * define HAVE_SETREUID. Otherwise screen will use a forked process to + * safely create output files without retaining any special privileges. + */ +#undef HAVE_SETREUID + +/* + * If your system supports BSD4.4's seteuid() and setegid(), define + * HAVE_SETEUID. + */ +#undef HAVE_SETEUID + +/* + * If you want the "time" command to display the current load average + * define LOADAV. Maybe you must install screen with the needed + * privileges to read /dev/kmem. + * Note that NLIST_ stuff is only checked, when getloadavg() is not available. + */ +#undef LOADAV + +#undef LOADAV_NUM +#undef LOADAV_TYPE +#undef LOADAV_SCALE +#undef LOADAV_GETLOADAVG +#undef LOADAV_UNIX +#undef LOADAV_AVENRUN +#undef LOADAV_USE_NLIST64 + +#undef NLIST_DECLARED +#undef NLIST_STRUCT +#undef NLIST_NAME_UNION + +/* + * If your system has the new format /etc/ttys (like 4.3 BSD) and the + * getttyent(3) library functions, define GETTTYENT. + */ +#undef GETTTYENT + +/* + * Define USEBCOPY if the bcopy/memcpy from your system's C library + * supports the overlapping of source and destination blocks. When + * undefined, screen uses its own (probably slower) version of bcopy(). + * + * SYSV machines may have a working memcpy() -- Oh, this is + * quite unlikely. Tell me if you see one. + * "But then, memmove() should work, if at all available" he thought... + * Boing, never say "works everywhere" unless you checked SCO UNIX. + * Their memove fails the test in the configure script. Sigh. (Juergen) + */ +#undef USEBCOPY +#undef USEMEMCPY +#undef USEMEMMOVE + +/* + * If your system has vsprintf() and requires the use of the macros in + * "varargs.h" to use functions with variable arguments, + * define USEVARARGS. + */ +#undef USEVARARGS + +/* + * If your system has strerror() define this. + */ +#undef HAVE_STRERROR + +/* + * If the select return value doesn't treat a descriptor that is + * usable for reading and writing as two hits, define SELECT_BROKEN. + */ +#undef SELECT_BROKEN + +/* + * Define this if your system supports named pipes. + */ +#undef NAMEDPIPE + +/* + * Define this if your system exits select() immediatly if a pipe is + * opened read-only and no writer has opened it. + */ +#undef BROKEN_PIPE + +/* + * Define this if the unix-domain socket implementation doesn't + * create a socket in the filesystem. + */ +#undef SOCK_NOT_IN_FS + +/* + * If your system has setenv() and unsetenv() define USESETENV + */ +#undef USESETENV + +/* + * If your system does not come with a setenv()/putenv()/getenv() + * functions, you may bring in our own code by defining NEEDPUTENV. + */ +#undef NEEDPUTENV + +/* + * If the passwords are stored in a shadow file and you want the + * builtin lock to work properly, define SHADOWPW. + */ +#undef SHADOWPW + +/* + * If you are on a SYS V machine that restricts filename length to 14 + * characters, you may need to enforce that by setting NAME_MAX to 14 + */ +#undef NAME_MAX /* KEEP_UNDEF_HERE override system value */ +#undef NAME_MAX + +/* + * define HAVE_RENAME if your system has a rename() function + */ +#undef HAVE_RENAME + +/* + * define HAVE__EXIT if your system has the _exit() call. + */ +#undef HAVE__EXIT + +/* + * define HAVE_LSTAT if your system has symlinks and the lstat() call. + */ +#undef HAVE_LSTAT + +/* + * define HAVE_UTIMES if your system has the utimes() call. + */ +#undef HAVE_UTIMES + +/* + * define HAVE_FCHOWN if your system has the fchown() call. + */ +#undef HAVE_FCHOWN + +/* + * define HAVE_FCHMOD if your system has the fchmod() call. + */ +#undef HAVE_FCHMOD + +/* + * define HAVE_VSNPRINTF if your system has vsnprintf() (GNU lib). + */ +#undef HAVE_VSNPRINTF + +/* + * define HAVE_GETCWD if your system has the getcwd() call. + */ +#undef HAVE_GETCWD + +/* + * define HAVE_SETLOCALE if your system has the setlocale() call. + */ +#undef HAVE_SETLOCALE + +/* + * define HAVE_STRFTIME if your system has the strftime() call. + */ +#undef HAVE_STRFTIME + +/* + * define HAVE_NL_LANGINFO if your system has the nl_langinfo() call + * and defines CODESET. + */ +#undef HAVE_NL_LANGINFO + +/* + * Newer versions of Solaris include fdwalk, which can greatly improve + * the startup time of screen; otherwise screen spends a lot of time + * closing file descriptors. + */ +#undef HAVE_FDWALK + +/* + * define HAVE_DEV_PTC if you have a /dev/ptc character special + * device. + */ +#undef HAVE_DEV_PTC + +/* + * define HAVE_SVR4_PTYS if you have a /dev/ptmx character special + * device and support the ptsname(), grantpt(), unlockpt() functions. + */ +#undef HAVE_SVR4_PTYS + +/* + * define HAVE_GETPT if you have the getpt() function. + */ +#undef HAVE_GETPT + +/* + * define HAVE_OPENPTY if your system has the openpty() call. + */ +#undef HAVE_OPENPTY + +/* + * define PTYRANGE0 and or PTYRANGE1 if you want to adapt screen + * to unusual environments. E.g. For SunOs the defaults are "qpr" and + * "0123456789abcdef". For SunOs 4.1.2 + * #define PTYRANGE0 "pqrstuvwxyzPQRST" + * is recommended by Dan Jacobson. + */ +#undef PTYRANGE0 +#undef PTYRANGE1 + +#define USEVARARGS + +#undef HAVE_SYS_STROPTS_H + +#undef HAVE_SYS_WAIT_H + +#undef HAVE_SGTTY_H + +#undef HAVE_SYS_SELECT_H diff --git a/examples/rlfe/configure b/examples/rlfe/configure new file mode 100755 index 0000000..3928331 --- /dev/null +++ b/examples/rlfe/configure @@ -0,0 +1,5637 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="rlfe.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +XTERMPATH +WRITEPATH +AWK +EGREP +GREP +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +VERSION +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_pty_mode +with_pty_group +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +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=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$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 ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=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 ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# 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 the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pty-mode=mode default mode for ptys + --with-pty-group=group default group for ptys + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* 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_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_config_headers="$ac_config_headers config.h" + +VERSION=0.4 + + + +old_CFLAGS="$CFLAGS" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_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 $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +if test $ac_cv_c_compiler_gnu = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 +$as_echo_n "checking whether $CC needs -traditional... " >&6; } +if ${ac_cv_prog_gcc_traditional+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_pattern="Autoconf.*'x'" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then : + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then : + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 +$as_echo "$ac_cv_prog_gcc_traditional" >&6; } + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if ${ac_cv_search_strerror+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' cposix; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_strerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_strerror+:} false; then : + break +fi +done +if ${ac_cv_search_strerror+:} false; then : + +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 +$as_echo "$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main(){exit(0);} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + +if test $CC != cc ; then +echo "Your $CC failed - restarting with CC=cc" 1>&6 + +echo "" 1>&6 + +CC=cc +export CC +exec $0 $configure_args +fi + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main(){exit(0);} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + exec 5>&2 +eval $ac_link +echo "CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;" 1>&6 + +echo "$ac_compile" 1>&6 + +as_fn_error $? "Can't run the compiler - sorry" "$LINENO" 5 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +main() +{ + int __something_strange_(); + __something_strange_(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + as_fn_error $? "Your compiler does not set the exit status - sorry" "$LINENO" 5 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + + +if test -f etc/toolcheck; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for buggy tools..." >&5 +$as_echo "$as_me: checking for buggy tools..." >&6;} +sh etc/toolcheck 1>&6 +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for System V..." >&5 +$as_echo "$as_me: checking for System V..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +int +main () +{ +int x = SIGCHLD | FNDELAY; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + $as_echo "#define SYSV 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Solaris 2.x..." >&5 +$as_echo "$as_me: checking for Solaris 2.x..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined(SVR4) && defined(sun) + yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + LIBS="$LIBS -lsocket -lnsl -lkstat" +fi +rm -f conftest* + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking select..." >&5 +$as_echo "$as_me: checking select..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +select(0, 0, 0, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + LIBS="$LIBS -lnet -lnsl" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking select with $LIBS..." >&5 +$as_echo "$as_me: checking select with $LIBS..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +select(0, 0, 0, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + as_fn_error $? "!!! no select - no screen" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking select return value..." >&5 +$as_echo "$as_me: checking select return value..." >&6;} +if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +char *nam = "/tmp/conftest$$"; + +#ifdef NAMEDPIPE + +#ifndef O_NONBLOCK +#define O_NONBLOCK O_NDELAY +#endif +#ifndef S_IFIFO +#define S_IFIFO 0010000 +#endif + + +main() +{ +#ifdef FD_SET + fd_set f; +#else + int f; +#endif + +#ifdef __FreeBSD__ +/* From Andrew A. Chernov (ache@astral.msk.su): + * opening RDWR fifo fails in BSD 4.4, but select return values are + * right. + */ + exit(0); +#endif + (void)alarm(5); +#ifdef POSIX + if (mkfifo(nam, 0777)) +#else + if (mknod(nam, S_IFIFO|0777, 0)) +#endif + exit(1); + close(0); + if (open(nam, O_RDWR | O_NONBLOCK)) + exit(1); + if (write(0, "TEST", 4) == -1) + exit(1); + +#else + +#include +#include +#include + +main() +{ + int s1, s2, l; + struct sockaddr_un a; +#ifdef FD_SET + fd_set f; +#else + int f; +#endif + + (void)alarm(5); + if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + exit(1); + a.sun_family = AF_UNIX; + strcpy(a.sun_path, nam); + (void) unlink(nam); + if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1) + exit(1); + if (listen(s1, 2)) + exit(1); + if (fork() == 0) + { + if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + kill(getppid(), 3); + (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2); + if (write(s2, "HELLO", 5) == -1) + kill(getppid(), 3); + exit(0); + } + l = sizeof(a); + close(0); + if (accept(s1, (struct sockaddr *)&a, &l)) + exit(1); +#endif + + +#ifdef FD_SET + FD_SET(0, &f); +#else + f = 1; +#endif + if (select(1, &f, 0, 0, 0) == -1) + exit(1); + if (select(1, &f, &f, 0, 0) != 2) + exit(1); + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo "- select is ok" 1>&6 + +else + echo "- select can't count" 1>&6 + $as_echo "#define SELECT_BROKEN 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent..." >&5 +$as_echo "$as_me: checking for tgetent..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +tgetent((char *)0, (char *)0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + olibs="$LIBS" +LIBS="-lcurses $olibs" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libcurses..." >&5 +$as_echo "$as_me: checking libcurses..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifdef __hpux +__sorry_hpux_libcurses_is_totally_broken_in_10_10(); +#else +tgetent((char *)0, (char *)0); +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + LIBS="-ltermcap $olibs" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libtermcap..." >&5 +$as_echo "$as_me: checking libtermcap..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +tgetent((char *)0, (char *)0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + LIBS="-ltermlib $olibs" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libtermlib..." >&5 +$as_echo "$as_me: checking libtermlib..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +tgetent((char *)0, (char *)0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + LIBS="-lncurses $olibs" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libncurses..." >&5 +$as_echo "$as_me: checking libncurses..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +tgetent((char *)0, (char *)0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + as_fn_error $? "!!! no tgetent - no screen" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +extern char *tgoto(); +main() +{ + exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo "- you use the termcap database" 1>&6 + +else + echo "- you use the terminfo database" 1>&6 + $as_echo "#define TERMINFO 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ospeed..." >&5 +$as_echo "$as_me: checking ospeed..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +extern short ospeed; +int +main () +{ +ospeed=5; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + $as_echo "#define NEED_OSPEED 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc..." >&5 +$as_echo "$as_me: checking for /dev/ptc..." >&6;} +if test -r /dev/ptc; then +$as_echo "#define HAVE_DEV_PTC 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SVR4 ptys..." >&5 +$as_echo "$as_me: checking for SVR4 ptys..." >&6;} +sysvr4ptys= +if test -c /dev/ptmx ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +ptsname(0);grantpt(0);unlockpt(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + $as_echo "#define HAVE_SVR4_PTYS 1" >>confdefs.h + +sysvr4ptys=1 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +for ac_func in getpt +do : + ac_fn_c_check_func "$LINENO" "getpt" "ac_cv_func_getpt" +if test "x$ac_cv_func_getpt" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETPT 1 +_ACEOF + +fi +done + + +if test -z "$sysvr4ptys"; then +for ac_func in openpty +do : + ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" +if test "x$ac_cv_func_openpty" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OPENPTY 1 +_ACEOF + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 +$as_echo_n "checking for openpty in -lutil... " >&6; } +if ${ac_cv_lib_util_openpty+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_util_openpty=yes +else + ac_cv_lib_util_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 +$as_echo "$ac_cv_lib_util_openpty" >&6; } +if test "x$ac_cv_lib_util_openpty" = xyes; then : + $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h + LIBS="$LIBS -lutil" +fi + +fi +done + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ptyranges..." >&5 +$as_echo "$as_me: checking for ptyranges..." >&6;} +if test -d /dev/ptym ; then +pdir='/dev/ptym' +else +pdir='/dev' +fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef M_UNIX + yes; +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + ptys=`echo /dev/ptyp??` +else + ptys=`echo $pdir/pty??` +fi +rm -f conftest* + +if test "$ptys" != "$pdir/pty??" ; then +p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'` +p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'` +cat >>confdefs.h <<_ACEOF +#define PTYRANGE0 "$p0" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PTYRANGE1 "$p1" +_ACEOF + +fi + + +# Check whether --with-pty-mode was given. +if test "${with_pty_mode+set}" = set; then : + withval=$with_pty_mode; ptymode="${withval}" +fi + + +# Check whether --with-pty-group was given. +if test "${with_pty_group+set}" = set; then : + withval=$with_pty_group; ptygrp="${withval}" +fi + +test -n "$ptymode" || ptymode=0620 +if test -n "$ptygrp" ; then +cat >>confdefs.h <<_ACEOF +#define PTYMODE $ptymode +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PTYGROUP $ptygrp +_ACEOF + +else + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking default tty permissions/group..." >&5 +$as_echo "$as_me: checking default tty permissions/group..." >&6;} +rm -f conftest_grp +if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +main() +{ + struct stat sb; + char *x,*ttyname(); + int om, m; + FILE *fp; + + if (!(x = ttyname(0))) exit(1); + if (stat(x, &sb)) exit(1); + om = sb.st_mode; + if (om & 002) exit(0); + m = system("mesg y"); + if (m == -1 || m == 127) exit(1); + if (stat(x, &sb)) exit(1); + m = sb.st_mode; + if (chmod(x, om)) exit(1); + if (m & 002) exit(0); + if (sb.st_gid == getgid()) exit(1); + if (!(fp=fopen("conftest_grp", "w"))) + exit(1); + fprintf(fp, "%d\n", sb.st_gid); + fclose(fp); + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + + if test -f conftest_grp; then + ptygrp=`cat conftest_grp` + echo "- pty mode: $ptymode, group: $ptygrp" 1>&6 + + cat >>confdefs.h <<_ACEOF +#define PTYMODE $ptymode +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define PTYGROUP $ptygrp +_ACEOF + + else + echo "- ptys are world accessable" 1>&6 + + fi + +else + + WRITEPATH='' + XTERMPATH='' + # Extract the first word of "write", so it can be a program name with args. +set dummy write; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_WRITEPATH+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $WRITEPATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_WRITEPATH="$WRITEPATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_WRITEPATH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +WRITEPATH=$ac_cv_path_WRITEPATH +if test -n "$WRITEPATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WRITEPATH" >&5 +$as_echo "$WRITEPATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "xterm", so it can be a program name with args. +set dummy xterm; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XTERMPATH+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XTERMPATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_XTERMPATH="$XTERMPATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_XTERMPATH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XTERMPATH=$ac_cv_path_XTERMPATH +if test -n "$XTERMPATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XTERMPATH" >&5 +$as_echo "$XTERMPATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + found= + if test -n "$WRITEPATH$XTERMPATH"; then + findfollow= + lsfollow= + found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null` + if test -n "$found"; then + findfollow=-follow + lsfollow=L + fi + if test -n "$XTERMPATH"; then + ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'` + if test tty != "$ptygrpn"; then + XTERMPATH= + fi + fi + fi + if test -n "$WRITEPATH$XTERMPATH"; then + found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print` + if test -n "$found"; then + ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'` + echo "- pty mode: $ptymode, group: $ptygrp" 1>&6 + + cat >>confdefs.h <<_ACEOF +#define PTYMODE $ptymode +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define PTYGROUP $ptygrp +_ACEOF + + else + echo "- ptys are world accessable" 1>&6 + + fi + else + echo "- can't determine - assume ptys are world accessable" 1>&6 + + fi + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +rm -f conftest_grp +fi + +if test -n "$posix" ; then + +echo "assuming posix signal definition" 1>&6 + +$as_echo "#define SIGVOID 1" >>confdefs.h + + +else + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers..." >&5 +$as_echo "$as_me: checking return type of signal handlers..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#ifdef signal +#undef signal +#endif +extern void (*signal ()) (); +int +main () +{ +int i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define SIGVOID 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sigset..." >&5 +$as_echo "$as_me: checking sigset..." >&6;} +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main () +{ + +#ifdef SIGVOID +sigset(0, (void (*)())0); +#else +sigset(0, (int (*)())0); +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + $as_echo "#define USESIGSET 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking signal implementation..." >&5 +$as_echo "$as_me: checking signal implementation..." >&6;} +if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +#ifndef SIGCLD +#define SIGCLD SIGCHLD +#endif +#ifdef USESIGSET +#define signal sigset +#endif + +int got; + +#ifdef SIGVOID +void +#endif +hand() +{ + got++; +} + +main() +{ + /* on hpux we use sigvec to get bsd signals */ +#ifdef __hpux + (void)signal(SIGCLD, hand); + kill(getpid(), SIGCLD); + kill(getpid(), SIGCLD); + if (got < 2) + exit(1); +#endif + exit(0); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + $as_echo "#define SYSVSIGS 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in sys/stropts.h sys/wait.h sgtty.h sys/select.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in term.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "term.h" "ac_cv_header_term_h" "$ac_includes_default" +if test "x$ac_cv_header_term_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TERM_H 1 +_ACEOF + +fi + +done + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# 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. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #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. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/examples/rlfe/configure.in b/examples/rlfe/configure.in new file mode 100644 index 0000000..ad7ce65 --- /dev/null +++ b/examples/rlfe/configure.in @@ -0,0 +1,442 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(rlfe.c) +AC_CONFIG_HEADER(config.h) +VERSION=0.4 +AC_SUBST(VERSION) + +dnl +dnl Define some useful macros +dnl +AC_DEFUN([AC_PROGRAM_SOURCE], +[AC_REQUIRE([AC_PROG_CPP])AC_PROVIDE([$0])cat > conftest.c <&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out" +. ./conftest.out +rm -f conftest* +])dnl +dnl +define(AC_NOTE, +[echo "$1" 1>&AC_FD_MSG +])dnl + +old_CFLAGS="$CFLAGS" +AC_PROG_CC +AC_PROG_CPP +AC_PROG_GCC_TRADITIONAL +AC_ISC_POSIX + +AC_TRY_RUN(main(){exit(0);},,[ +if test $CC != cc ; then +AC_NOTE(Your $CC failed - restarting with CC=cc) +AC_NOTE() +CC=cc +export CC +exec $0 $configure_args +fi +]) + +AC_TRY_RUN(main(){exit(0);},, +exec 5>&2 +eval $ac_link +AC_NOTE(CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;) +AC_NOTE($ac_compile) +AC_MSG_ERROR(Can't run the compiler - sorry)) + +AC_TRY_RUN([ +main() +{ + int __something_strange_(); + __something_strange_(0); +} +],AC_MSG_ERROR(Your compiler does not set the exit status - sorry)) + +AC_PROG_AWK + +if test -f etc/toolcheck; then +AC_CHECKING(for buggy tools) +sh etc/toolcheck 1>&AC_FD_MSG +fi + +dnl +dnl **** special unix variants **** +dnl + +AC_CHECKING(for System V) +AC_TRY_COMPILE( +[#include +#include +#include ], [int x = SIGCHLD | FNDELAY;], , AC_DEFINE(SYSV)) + +AC_CHECKING(for Solaris 2.x) +AC_EGREP_CPP(yes, +[#if defined(SVR4) && defined(sun) + yes +#endif +], LIBS="$LIBS -lsocket -lnsl -lkstat") + +dnl +dnl **** select() **** +dnl + +AC_CHECKING(select) +AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, +LIBS="$LIBS -lnet -lnsl" +AC_CHECKING(select with $LIBS) +AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, +AC_MSG_ERROR(!!! no select - no screen)) +) +dnl +dnl **** check the select implementation **** +dnl + +AC_CHECKING(select return value) +AC_TRY_RUN([ +#include +#include +#include + +char *nam = "/tmp/conftest$$"; + +#ifdef NAMEDPIPE + +#ifndef O_NONBLOCK +#define O_NONBLOCK O_NDELAY +#endif +#ifndef S_IFIFO +#define S_IFIFO 0010000 +#endif + + +main() +{ +#ifdef FD_SET + fd_set f; +#else + int f; +#endif + +#ifdef __FreeBSD__ +/* From Andrew A. Chernov (ache@astral.msk.su): + * opening RDWR fifo fails in BSD 4.4, but select return values are + * right. + */ + exit(0); +#endif + (void)alarm(5); +#ifdef POSIX + if (mkfifo(nam, 0777)) +#else + if (mknod(nam, S_IFIFO|0777, 0)) +#endif + exit(1); + close(0); + if (open(nam, O_RDWR | O_NONBLOCK)) + exit(1); + if (write(0, "TEST", 4) == -1) + exit(1); + +#else + +#include +#include +#include + +main() +{ + int s1, s2, l; + struct sockaddr_un a; +#ifdef FD_SET + fd_set f; +#else + int f; +#endif + + (void)alarm(5); + if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + exit(1); + a.sun_family = AF_UNIX; + strcpy(a.sun_path, nam); + (void) unlink(nam); + if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1) + exit(1); + if (listen(s1, 2)) + exit(1); + if (fork() == 0) + { + if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + kill(getppid(), 3); + (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2); + if (write(s2, "HELLO", 5) == -1) + kill(getppid(), 3); + exit(0); + } + l = sizeof(a); + close(0); + if (accept(s1, (struct sockaddr *)&a, &l)) + exit(1); +#endif + + +#ifdef FD_SET + FD_SET(0, &f); +#else + f = 1; +#endif + if (select(1, &f, 0, 0, 0) == -1) + exit(1); + if (select(1, &f, &f, 0, 0) != 2) + exit(1); + exit(0); +} +],AC_NOTE(- select is ok), +AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN)) + +dnl +dnl **** termcap or terminfo **** +dnl +AC_CHECKING(for tgetent) +AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, +olibs="$LIBS" +LIBS="-lcurses $olibs" +AC_CHECKING(libcurses) +AC_TRY_LINK(,[ +#ifdef __hpux +__sorry_hpux_libcurses_is_totally_broken_in_10_10(); +#else +tgetent((char *)0, (char *)0); +#endif +],, +LIBS="-ltermcap $olibs" +AC_CHECKING(libtermcap) +AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, +LIBS="-ltermlib $olibs" +AC_CHECKING(libtermlib) +AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, +LIBS="-lncurses $olibs" +AC_CHECKING(libncurses) +AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, +AC_MSG_ERROR(!!! no tgetent - no screen)))))) + +AC_TRY_RUN([ +extern char *tgoto(); +main() +{ + exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1); +}], AC_NOTE(- you use the termcap database), +AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO)) +AC_CHECKING(ospeed) +AC_TRY_LINK(extern short ospeed;,ospeed=5;,,AC_DEFINE(NEED_OSPEED)) + +dnl +dnl **** PTY specific things **** +dnl +AC_CHECKING(for /dev/ptc) +if test -r /dev/ptc; then +AC_DEFINE(HAVE_DEV_PTC) +fi + +AC_CHECKING(for SVR4 ptys) +sysvr4ptys= +if test -c /dev/ptmx ; then +AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS) +sysvr4ptys=1]) +fi + +AC_CHECK_FUNCS(getpt) + +dnl check for openpty() +if test -z "$sysvr4ptys"; then +AC_CHECK_FUNCS(openpty,, +[AC_CHECK_LIB(util,openpty, [AC_DEFINE(HAVE_OPENPTY)] [LIBS="$LIBS -lutil"])]) +fi + +AC_CHECKING(for ptyranges) +if test -d /dev/ptym ; then +pdir='/dev/ptym' +else +pdir='/dev' +fi +dnl SCO uses ptyp%d +AC_EGREP_CPP(yes, +[#ifdef M_UNIX + yes; +#endif +], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`) +dnl if test -c /dev/ptyp19; then +dnl ptys=`echo /dev/ptyp??` +dnl else +dnl ptys=`echo $pdir/pty??` +dnl fi +if test "$ptys" != "$pdir/pty??" ; then +p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'` +p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'` +AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0") +AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1") +fi + +dnl **** pty mode/group handling **** +dnl +dnl support provided by Luke Mewburn , 931222 +AC_ARG_WITH(pty-mode, [ --with-pty-mode=mode default mode for ptys], [ ptymode="${withval}" ]) +AC_ARG_WITH(pty-group, [ --with-pty-group=group default group for ptys], [ ptygrp="${withval}" ]) +test -n "$ptymode" || ptymode=0620 +if test -n "$ptygrp" ; then +AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) +AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) +else + +AC_CHECKING(default tty permissions/group) +rm -f conftest_grp +AC_TRY_RUN([ +#include +#include +#include +main() +{ + struct stat sb; + char *x,*ttyname(); + int om, m; + FILE *fp; + + if (!(x = ttyname(0))) exit(1); + if (stat(x, &sb)) exit(1); + om = sb.st_mode; + if (om & 002) exit(0); + m = system("mesg y"); + if (m == -1 || m == 127) exit(1); + if (stat(x, &sb)) exit(1); + m = sb.st_mode; + if (chmod(x, om)) exit(1); + if (m & 002) exit(0); + if (sb.st_gid == getgid()) exit(1); + if (!(fp=fopen("conftest_grp", "w"))) + exit(1); + fprintf(fp, "%d\n", sb.st_gid); + fclose(fp); + exit(0); +} +],[ + if test -f conftest_grp; then + ptygrp=`cat conftest_grp` + AC_NOTE([- pty mode: $ptymode, group: $ptygrp]) + AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) + AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) + else + AC_NOTE(- ptys are world accessable) + fi +],[ + WRITEPATH='' + XTERMPATH='' + AC_PATH_PROG(WRITEPATH, write) + AC_PATH_PROG(XTERMPATH, xterm) + found= + if test -n "$WRITEPATH$XTERMPATH"; then + findfollow= + lsfollow= + found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null` + if test -n "$found"; then + findfollow=-follow + lsfollow=L + fi + if test -n "$XTERMPATH"; then + ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'` + if test tty != "$ptygrpn"; then + XTERMPATH= + fi + fi + fi + if test -n "$WRITEPATH$XTERMPATH"; then + found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print` + if test -n "$found"; then + ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'` + AC_NOTE([- pty mode: $ptymode, group: $ptygrp]) + AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) + AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) + else + AC_NOTE(- ptys are world accessable) + fi + else + AC_NOTE(- can't determine - assume ptys are world accessable) + fi + ] +) +rm -f conftest_grp +fi + +dnl +dnl **** signal handling **** +dnl +if test -n "$posix" ; then + +dnl POSIX has reliable signals with void return type. +AC_NOTE(assuming posix signal definition) +AC_DEFINE(SIGVOID) + +else + +AC_CHECKING(return type of signal handlers) +AC_TRY_COMPILE( +[#include +#include +#ifdef signal +#undef signal +#endif +extern void (*signal ()) ();], [int i;], AC_DEFINE(SIGVOID)) +AC_CHECKING(sigset) +AC_TRY_LINK([ +#include +#include +],[ +#ifdef SIGVOID +sigset(0, (void (*)())0); +#else +sigset(0, (int (*)())0); +#endif +], AC_DEFINE(USESIGSET)) +AC_CHECKING(signal implementation) +AC_TRY_RUN([ +#include +#include + +#ifndef SIGCLD +#define SIGCLD SIGCHLD +#endif +#ifdef USESIGSET +#define signal sigset +#endif + +int got; + +#ifdef SIGVOID +void +#endif +hand() +{ + got++; +} + +main() +{ + /* on hpux we use sigvec to get bsd signals */ +#ifdef __hpux + (void)signal(SIGCLD, hand); + kill(getpid(), SIGCLD); + kill(getpid(), SIGCLD); + if (got < 2) + exit(1); +#endif + exit(0); +} +],,AC_DEFINE(SYSVSIGS)) + +fi + +AC_CHECK_HEADERS(sys/stropts.h sys/wait.h sgtty.h sys/select.h) +AC_CHECK_HEADERS(term.h) + +AC_OUTPUT(Makefile) diff --git a/examples/rlfe/extern.h b/examples/rlfe/extern.h new file mode 100644 index 0000000..2fe5025 --- /dev/null +++ b/examples/rlfe/extern.h @@ -0,0 +1,40 @@ +/* Copyright (c) 1993-2002 + * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) + * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) + * Copyright (c) 1987 Oliver Laumann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING); if not, write to the + * Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + **************************************************************** + * $Id: extern.h,v 1.18 1994/05/31 12:31:57 mlschroe Exp $ FAU + */ + +#if !defined(__GNUC__) || __GNUC__ < 2 +#undef __attribute__ +#define __attribute__(x) +#endif + +#if !defined (__P) +# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) +# define __P(protos) protos +# else +# define __P(protos) () +# endif +#endif + +/* pty.c */ +extern int OpenPTY __P((char **)); +extern void InitPTY __P((int)); diff --git a/examples/rlfe/os.h b/examples/rlfe/os.h new file mode 100644 index 0000000..df06c75 --- /dev/null +++ b/examples/rlfe/os.h @@ -0,0 +1,531 @@ +/* Copyright (c) 1993-2002 + * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) + * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) + * Copyright (c) 1987 Oliver Laumann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING); if not, write to the + * Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + **************************************************************** + * $Id: os.h,v 1.10 1994/05/31 12:32:22 mlschroe Exp $ FAU + */ + +#include +#include + +#include + +/* In strict ANSI mode, HP-UX machines define __hpux but not hpux */ +#if defined(__hpux) && !defined(hpux) +# define hpux +#endif + +#if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux) +# include +#endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */ + +#ifdef ISC +# ifdef ENAMETOOLONG +# undef ENAMETOOLONG +# endif +# ifdef ENOTEMPTY +# undef ENOTEMPTY +# endif +# include +# include +#endif + +#ifdef sun +# define getpgrp __getpgrp +# define exit __exit +#endif +#ifdef POSIX +# include +# if defined(__STDC__) +# include +# endif /* __STDC__ */ +#endif /* POSIX */ +#ifdef sun +# undef getpgrp +# undef exit +#endif /* sun */ + +#ifndef linux /* all done in */ +extern int errno; +#endif /* linux */ +#ifndef HAVE_STRERROR +/* No macros, please */ +#undef strerror +#endif + +#if !defined(SYSV) && !defined(linux) +# ifdef NEWSOS +# define strlen ___strlen___ +# include +# undef strlen +# else /* NEWSOS */ +# include +# endif /* NEWSOS */ +#else /* SYSV */ +# if defined(SVR4) || defined(NEWSOS) +# define strlen ___strlen___ +# include +# undef strlen +# if !defined(NEWSOS) && !defined(__hpux) + extern size_t strlen(const char *); +# endif +# else /* SVR4 */ +# include +# endif /* SVR4 */ +#endif /* SYSV */ + +#ifdef USEVARARGS +# if defined(__STDC__) +# include +# define VA_LIST(var) va_list var; +# define VA_DOTS ... +# define VA_DECL +# define VA_START(ap, fmt) va_start(ap, fmt) +# define VA_ARGS(ap) ap +# define VA_END(ap) va_end(ap) +# else +# include +# define VA_LIST(var) va_list var; +# define VA_DOTS va_alist +# define VA_DECL va_dcl +# define VA_START(ap, fmt) va_start(ap) +# define VA_ARGS(ap) ap +# define VA_END(ap) va_end(ap) +# endif +#else +# define VA_LIST(var) +# define VA_DOTS p1, p2, p3, p4, p5, p6 +# define VA_DECL unsigned long VA_DOTS; +# define VA_START(ap, fmt) +# define VA_ARGS(ap) VA_DOTS +# define VA_END(ap) +# undef vsnprintf +# define vsnprintf xsnprintf +#endif + +#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX) +# include +#endif +#include + +#ifdef M_UNIX /* SCO */ +# include +# include +# define ftruncate(fd, s) chsize(fd, s) +#endif + +#ifdef SYSV +# define index strchr +# define rindex strrchr +# define bzero(poi,len) memset(poi,0,len) +# define bcmp memcmp +# define killpg(pgrp,sig) kill( -(pgrp), sig) +#endif + +#ifndef HAVE_GETCWD +# define getcwd(b,l) getwd(b) +#endif + +#ifndef USEBCOPY +# ifdef USEMEMMOVE +# define bcopy(s,d,len) memmove(d,s,len) +# else +# ifdef USEMEMCPY +# define bcopy(s,d,len) memcpy(d,s,len) +# else +# define NEED_OWN_BCOPY +# define bcopy xbcopy +# endif +# endif +#endif + +#ifdef hpux +# define setreuid(ruid, euid) setresuid(ruid, euid, -1) +# define setregid(rgid, egid) setresgid(rgid, egid, -1) +#endif + +#if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) +# define USE_SETEUID +#endif + +#if !defined(HAVE__EXIT) && !defined(_exit) +#define _exit(x) exit(x) +#endif + +#ifndef HAVE_UTIMES +# define utimes utime +#endif + +#ifdef BUILTIN_TELNET +# include +# include +#endif + +#if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME)) +# undef USE_LOCALE +#endif + +/***************************************************************** + * terminal handling + */ + +#if defined (POSIX) || defined (__FreeBSD__) +# include +# ifdef hpux +# include +# endif /* hpux */ +# ifdef NCCS +# define MAXCC NCCS +# else +# define MAXCC 256 +# endif +#else /* POSIX */ +# ifdef TERMIO +# include +# ifdef NCC +# define MAXCC NCC +# else +# define MAXCC 256 +# endif +# ifdef CYTERMIO +# include +# endif +# else /* TERMIO */ +# if defined (HAVE_SGTTY_H) +# include +# endif +# endif /* TERMIO */ +#endif /* POSIX */ + +#ifndef VDISABLE +# ifdef _POSIX_VDISABLE +# define VDISABLE _POSIX_VDISABLE +# else +# define VDISABLE 0377 +# endif /* _POSIX_VDISABLE */ +#endif /* !VDISABLE */ + + +/* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD) + * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE) + * to hold the whole packet at first read(). + * (Marc Boucher) + * + * matthew green: + * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100 + * + * Joe Traister: On AIX4, programs like irc won't work if screen + * uses TIOCPKT (select fails to return on pty read). + */ +#if defined(sgi) || defined(DGUX) || defined(_IBMR2) +# undef TIOCPKT +#endif + +/* linux ncurses is broken, we have to use our own tputs */ +#if defined(linux) && defined(TERMINFO) +# define tputs xtputs +#endif + +/* Alexandre Oliva: SVR4 style ptys don't work with osf */ +#ifdef __osf__ +# undef HAVE_SVR4_PTYS +#endif + +/***************************************************************** + * utmp handling + */ + +#ifdef GETUTENT + typedef char *slot_t; +#else + typedef int slot_t; +#endif + +#if defined(UTMPOK) || defined(BUGGYGETLOGIN) +# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux) +# include +# define UTMPFILE UTMPX_FILE +# define utmp utmpx +# define getutent getutxent +# define getutid getutxid +# define getutline getutxline +# define pututline pututxline +# define setutent setutxent +# define endutent endutxent +# define ut_time ut_xtime +# else /* SVR4 */ +# include +# endif /* SVR4 */ +# ifdef apollo + /* + * We don't have GETUTENT, so we dig into utmp ourselves. + * But we save the permanent filedescriptor and + * open utmp just when we need to. + * This code supports an unsorted utmp. jw. + */ +# define UTNOKEEP +# endif /* apollo */ + +# ifndef UTMPFILE +# ifdef UTMP_FILE +# define UTMPFILE UTMP_FILE +# else +# ifdef _PATH_UTMP +# define UTMPFILE _PATH_UTMP +# else +# define UTMPFILE "/etc/utmp" +# endif /* _PATH_UTMP */ +# endif +# endif + +#endif /* UTMPOK || BUGGYGETLOGIN */ + +#if !defined(UTMPOK) && defined(USRLIMIT) +# undef USRLIMIT +#endif + +#ifdef LOGOUTOK +# ifndef LOGINDEFAULT +# define LOGINDEFAULT 0 +# endif +#else +# ifdef LOGINDEFAULT +# undef LOGINDEFAULT +# endif +# define LOGINDEFAULT 1 +#endif + + +/***************************************************************** + * file stuff + */ + +#ifndef F_OK +#define F_OK 0 +#endif +#ifndef X_OK +#define X_OK 1 +#endif +#ifndef W_OK +#define W_OK 2 +#endif +#ifndef R_OK +#define R_OK 4 +#endif + +#ifndef S_IFIFO +#define S_IFIFO 0010000 +#endif +#ifndef S_IREAD +#define S_IREAD 0000400 +#endif +#ifndef S_IWRITE +#define S_IWRITE 0000200 +#endif +#ifndef S_IEXEC +#define S_IEXEC 0000100 +#endif + +#if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO) +#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) +#endif +#if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK) +#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) +#endif +#if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR) +#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) +#endif +#if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR) +#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif +#if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK) +#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) +#endif + +/* + * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK: + * + * O_NONBLOCK Same as O_NDELAY above. + * + * on the very same SunOS 4.1.3, I traced the open system call and found + * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked, + * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through. + * + * For this simple reason I now favour O_NDELAY. jw. 4.5.95 + */ +#if defined(sun) && !defined(SVR4) +# undef O_NONBLOCK +#endif + +#if !defined(O_NONBLOCK) && defined(O_NDELAY) +# define O_NONBLOCK O_NDELAY +#endif + +#if !defined(FNBLOCK) && defined(FNONBLOCK) +# define FNBLOCK FNONBLOCK +#endif +#if !defined(FNBLOCK) && defined(FNDELAY) +# define FNBLOCK FNDELAY +#endif +#if !defined(FNBLOCK) && defined(O_NONBLOCK) +# define FNBLOCK O_NONBLOCK +#endif + +#ifndef POSIX +#undef mkfifo +#define mkfifo(n,m) mknod(n,S_IFIFO|(m),0) +#endif + +#if !defined(HAVE_LSTAT) && !defined(lstat) +# define lstat stat +#endif + +/***************************************************************** + * signal handling + */ + +#ifdef SIGVOID +# define SIGRETURN +# define sigret_t void +#else +# define SIGRETURN return 0; +# define sigret_t int +#endif + +/* Geeeee, reverse it? */ +#if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT) +# define SIGHASARG +#endif + +#ifdef SIGHASARG +# define SIGPROTOARG (int) +# define SIGDEFARG (sigsig) int sigsig; +# define SIGARG 0 +#else +# define SIGPROTOARG (void) +# define SIGDEFARG () +# define SIGARG +#endif + +#ifndef SIGCHLD +#define SIGCHLD SIGCLD +#endif + +#if defined(POSIX) || defined(hpux) +# define signal xsignal +#else +# ifdef USESIGSET +# define signal sigset +# endif /* USESIGSET */ +#endif + +/* used in screen.c and attacher.c */ +#ifndef NSIG /* kbeal needs these w/o SYSV */ +# define NSIG 32 +#endif /* !NSIG */ + + +/***************************************************************** + * Wait stuff + */ + +#if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX) +# include +#endif + +#ifndef WTERMSIG +# ifndef BSDWAIT /* if wait is NOT a union: */ +# define WTERMSIG(status) (status & 0177) +# else +# define WTERMSIG(status) status.w_T.w_Termsig +# endif +#endif + +#ifndef WSTOPSIG +# ifndef BSDWAIT /* if wait is NOT a union: */ +# define WSTOPSIG(status) ((status >> 8) & 0377) +# else +# define WSTOPSIG(status) status.w_S.w_Stopsig +# endif +#endif + +/* NET-2 uses WCOREDUMP */ +#if defined(WCOREDUMP) && !defined(WIFCORESIG) +# define WIFCORESIG(status) WCOREDUMP(status) +#endif + +#ifndef WIFCORESIG +# ifndef BSDWAIT /* if wait is NOT a union: */ +# define WIFCORESIG(status) (status & 0200) +# else +# define WIFCORESIG(status) status.w_T.w_Coredump +# endif +#endif + +#ifndef WEXITSTATUS +# ifndef BSDWAIT /* if wait is NOT a union: */ +# define WEXITSTATUS(status) ((status >> 8) & 0377) +# else +# define WEXITSTATUS(status) status.w_T.w_Retcode +# endif +#endif + + +/***************************************************************** + * select stuff + */ + +#if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_) || defined (__INTERIX) +#include /* for timeval + FD... */ +#endif + +/* + * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93 + * tschmidt@vax.micron.com + */ +#ifndef FD_SET +# ifndef SUNOS3 +typedef struct fd_set { int fds_bits[1]; } fd_set; +# endif +# define FD_ZERO(fd) ((fd)->fds_bits[0] = 0) +# define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b)) +# define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b)) +# define FD_SETSIZE 32 +#endif + + +/***************************************************************** + * user defineable stuff + */ + +#ifndef TERMCAP_BUFSIZE +# define TERMCAP_BUFSIZE 2048 +#endif + +#ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +#endif + +/* + * you may try to vary this value. Use low values if your (VMS) system + * tends to choke when pasting. Use high values if you want to test + * how many characters your pty's can buffer. + */ +#define IOSIZE 4096 diff --git a/examples/rlfe/pty.c b/examples/rlfe/pty.c new file mode 100644 index 0000000..5562720 --- /dev/null +++ b/examples/rlfe/pty.c @@ -0,0 +1,388 @@ +/* Copyright (c) 1993-2002 + * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) + * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) + * Copyright (c) 1987 Oliver Laumann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING); if not, write to the + * Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + **************************************************************** + */ +#include "config.h" + +#include +#include +#include +#include + +#include + +#include "screen.h" + +#ifndef sun +# include +#endif + +/* for solaris 2.1, Unixware (SVR4.2) and possibly others */ +#if defined (HAVE_SVR4_PTYS) && defined (HAVE_SYS_STROPTS_H) +# include +#endif + +#if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL) +# include +#endif + +#ifdef ISC +# include +# include +# include +#endif + +#ifdef sgi +# include +#endif /* sgi */ + +#include "extern.h" + +/* + * if no PTYRANGE[01] is in the config file, we pick a default + */ +#ifndef PTYRANGE0 +# define PTYRANGE0 "qpr" +#endif +#ifndef PTYRANGE1 +# define PTYRANGE1 "0123456789abcdef" +#endif + +/* SVR4 pseudo ttys don't seem to work with SCO-5 */ +#ifdef M_UNIX +# undef HAVE_SVR4_PTYS +#endif + +extern int eff_uid; + +/* used for opening a new pty-pair: */ +static char PtyName[32], TtyName[32]; + +#if !(defined(sequent) || defined(_SEQUENT_) || defined(HAVE_SVR4_PTYS)) +# ifdef hpux +static char PtyProto[] = "/dev/ptym/ptyXY"; +static char TtyProto[] = "/dev/pty/ttyXY"; +# else +# ifdef M_UNIX +static char PtyProto[] = "/dev/ptypXY"; +static char TtyProto[] = "/dev/ttypXY"; +# else +static char PtyProto[] = "/dev/ptyXY"; +static char TtyProto[] = "/dev/ttyXY"; +# endif +# endif /* hpux */ +#endif + +static void initmaster __P((int)); + +#if defined(sun) +/* sun's utmp_update program opens the salve side, thus corrupting + */ +int pty_preopen = 1; +#else +int pty_preopen = 0; +#endif + +/* + * Open all ptys with O_NOCTTY, just to be on the safe side + * (RISCos mips breaks otherwise) + */ +#ifndef O_NOCTTY +# define O_NOCTTY 0 +#endif + +/***************************************************************/ + +static void +initmaster(f) +int f; +{ +#ifdef POSIX + tcflush(f, TCIOFLUSH); +#else +# ifdef TIOCFLUSH + (void) ioctl(f, TIOCFLUSH, (char *) 0); +# endif +#endif +#ifdef LOCKPTY + (void) ioctl(f, TIOCEXCL, (char *) 0); +#endif +} + +void +InitPTY(f) +int f; +{ + if (f < 0) + return; +#if defined(I_PUSH) && defined(HAVE_SVR4_PTYS) && !defined(sgi) && !defined(linux) && !defined(__osf__) && !defined(M_UNIX) + if (ioctl(f, I_PUSH, "ptem")) + Panic(errno, "InitPTY: cannot I_PUSH ptem"); + if (ioctl(f, I_PUSH, "ldterm")) + Panic(errno, "InitPTY: cannot I_PUSH ldterm"); +# ifdef sun + if (ioctl(f, I_PUSH, "ttcompat")) + Panic(errno, "InitPTY: cannot I_PUSH ttcompat"); +# endif +#endif +} + +/***************************************************************/ + +#if defined(OSX) && !defined(PTY_DONE) +#define PTY_DONE +int +OpenPTY(ttyn) +char **ttyn; +{ + register int f; + if ((f = open_controlling_pty(TtyName)) < 0) + return -1; + initmaster(f); + *ttyn = TtyName; + return f; +} +#endif + +/***************************************************************/ + +#if (defined(sequent) || defined(_SEQUENT_)) && !defined(PTY_DONE) +#define PTY_DONE +int +OpenPTY(ttyn) +char **ttyn; +{ + char *m, *s; + register int f; + + if ((f = getpseudotty(&s, &m)) < 0) + return -1; +#ifdef _SEQUENT_ + fvhangup(s); +#endif + strncpy(PtyName, m, sizeof(PtyName)); + strncpy(TtyName, s, sizeof(TtyName)); + initmaster(f); + *ttyn = TtyName; + return f; +} +#endif + +/***************************************************************/ + +#if defined(__sgi) && !defined(PTY_DONE) +#define PTY_DONE +int +OpenPTY(ttyn) +char **ttyn; +{ + int f; + char *name, *_getpty(); + sigret_t (*sigcld)__P(SIGPROTOARG); + + /* + * SIGCHLD set to SIG_DFL for _getpty() because it may fork() and + * exec() /usr/adm/mkpts + */ + sigcld = signal(SIGCHLD, SIG_DFL); + name = _getpty(&f, O_RDWR | O_NONBLOCK, 0600, 0); + signal(SIGCHLD, sigcld); + + if (name == 0) + return -1; + initmaster(f); + *ttyn = name; + return f; +} +#endif + +/***************************************************************/ + +#if defined(MIPS) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE) +#define PTY_DONE +int +OpenPTY(ttyn) +char **ttyn; +{ + register int f; + struct stat buf; + + strcpy(PtyName, "/dev/ptc"); + if ((f = open(PtyName, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) + return -1; + if (fstat(f, &buf) < 0) + { + close(f); + return -1; + } + sprintf(TtyName, "/dev/ttyq%d", minor(buf.st_rdev)); + initmaster(f); + *ttyn = TtyName; + return f; +} +#endif + +/***************************************************************/ + +#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) +#define PTY_DONE +int +OpenPTY(ttyn) +char **ttyn; +{ + register int f; + char *m, *ptsname(); + int unlockpt __P((int)), grantpt __P((int)); +#if defined(HAVE_GETPT) && defined(linux) + int getpt __P((void)); +#endif + sigret_t (*sigcld)__P(SIGPROTOARG); + + strcpy(PtyName, "/dev/ptmx"); +#if defined(HAVE_GETPT) && defined(linux) + if ((f = getpt()) == -1) +#else + if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1) +#endif + return -1; + + /* + * SIGCHLD set to SIG_DFL for grantpt() because it fork()s and + * exec()s pt_chmod + */ + sigcld = signal(SIGCHLD, SIG_DFL); + if ((m = ptsname(f)) == NULL || grantpt(f) || unlockpt(f)) + { + signal(SIGCHLD, sigcld); + close(f); + return -1; + } + signal(SIGCHLD, sigcld); + strncpy(TtyName, m, sizeof(TtyName)); + initmaster(f); + *ttyn = TtyName; + return f; +} +#endif + +/***************************************************************/ + +#if defined(_AIX) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE) +#define PTY_DONE + +int +OpenPTY(ttyn) +char **ttyn; +{ + register int f; + + /* a dumb looking loop replaced by mycrofts code: */ + strcpy (PtyName, "/dev/ptc"); + if ((f = open (PtyName, O_RDWR | O_NOCTTY)) < 0) + return -1; + strncpy(TtyName, ttyname(f), sizeof(TtyName)); + if (eff_uid && access(TtyName, R_OK | W_OK)) + { + close(f); + return -1; + } + initmaster(f); +# ifdef _IBMR2 + pty_preopen = 1; +# endif + *ttyn = TtyName; + return f; +} +#endif + +/***************************************************************/ + +#if defined(HAVE_OPENPTY) && !defined(PTY_DONE) +#define PTY_DONE +int +OpenPTY(ttyn) +char **ttyn; +{ + int f, s; + if (openpty(&f, &s, TtyName, NULL, NULL) != 0) + return -1; + close(s); + initmaster(f); + pty_preopen = 1; + *ttyn = TtyName; + return f; +} +#endif + +/***************************************************************/ + +#ifndef PTY_DONE +int +OpenPTY(ttyn) +char **ttyn; +{ + register char *p, *q, *l, *d; + register int f; + + debug("OpenPTY: Using BSD style ptys.\n"); + strcpy(PtyName, PtyProto); + strcpy(TtyName, TtyProto); + for (p = PtyName; *p != 'X'; p++) + ; + for (q = TtyName; *q != 'X'; q++) + ; + for (l = PTYRANGE0; (*p = *l) != '\0'; l++) + { + for (d = PTYRANGE1; (p[1] = *d) != '\0'; d++) + { + debug1("OpenPTY tries '%s'\n", PtyName); + if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1) + continue; + q[0] = *l; + q[1] = *d; + if (eff_uid && access(TtyName, R_OK | W_OK)) + { + close(f); + continue; + } +#if defined(sun) && defined(TIOCGPGRP) && !defined(SUNOS3) + /* Hack to ensure that the slave side of the pty is + * unused. May not work in anything other than SunOS4.1 + */ + { + int pgrp; + + /* tcgetpgrp does not work (uses TIOCGETPGRP)! */ + if (ioctl(f, TIOCGPGRP, (char *)&pgrp) != -1 || errno != EIO) + { + close(f); + continue; + } + } +#endif + initmaster(f); + *ttyn = TtyName; + return f; + } + } + return -1; +} +#endif diff --git a/examples/rlfe/rlfe.c b/examples/rlfe/rlfe.c new file mode 100644 index 0000000..f40b2dd --- /dev/null +++ b/examples/rlfe/rlfe.c @@ -0,0 +1,792 @@ +/* A front-end using readline to "cook" input lines. + * + * Copyright (C) 2004, 1999 Per Bothner + * + * This front-end program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * Some code from Johnson & Troan: "Linux Application Development" + * (Addison-Wesley, 1998) was used directly or for inspiration. + * + * 2003-11-07 Wolfgang Taeuber + * Specify a history file and the size of the history file with command + * line options; use EDITOR/VISUAL to set vi/emacs preference. + */ + +/* PROBLEMS/TODO: + * + * Only tested under GNU/Linux and Mac OS 10.x; needs to be ported. + * + * Switching between line-editing-mode vs raw-char-mode depending on + * what tcgetattr returns is inherently not robust, plus it doesn't + * work when ssh/telnetting in. A better solution is possible if the + * tty system can send in-line escape sequences indicating the current + * mode, echo'd input, etc. That would also allow a user preference + * to set different colors for prompt, input, stdout, and stderr. + * + * When running mc -c under the Linux console, mc does not recognize + * mouse clicks, which mc does when not running under rlfe. + * + * Pasting selected text containing tabs is like hitting the tab character, + * which invokes readline completion. We don't want this. I don't know + * if this is fixable without integrating rlfe into a terminal emulator. + * + * Echo suppression is a kludge, but can only be avoided with better kernel + * support: We need a tty mode to disable "real" echoing, while still + * letting the inferior think its tty driver to doing echoing. + * Stevens's book claims SCR$ and BSD4.3+ have TIOCREMOTE. + * + * The latest readline may have some hooks we can use to avoid having + * to back up the prompt. (See HAVE_ALREADY_PROMPTED.) + * + * Desirable readline feature: When in cooked no-echo mode (e.g. password), + * echo characters are they are types with '*', but remove them when done. + * + * Asynchronous output while we're editing an input line should be + * inserted in the output view *before* the input line, so that the + * lines being edited (with the prompt) float at the end of the input. + * + * A "page mode" option to emulate more/less behavior: At each page of + * output, pause for a user command. This required parsing the output + * to keep track of line lengths. It also requires remembering the + * output, if we want an option to scroll back, which suggests that + * this should be integrated with a terminal emulator like xterm. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "extern.h" + +#if defined (HAVE_SYS_WAIT_H) +# include +#endif + +#ifdef READLINE_LIBRARY +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +#ifndef COMMAND +#define COMMAND "/bin/bash" +#endif +#ifndef COMMAND_ARGS +#define COMMAND_ARGS COMMAND +#endif + +#ifndef ALT_COMMAND +#define ALT_COMMAND "/bin/sh" +#endif +#ifndef ALT_COMMAND_ARGS +#define ALT_COMMAND_ARGS ALT_COMMAND +#endif + +#ifndef HAVE_MEMMOVE +# if __GNUC__ > 1 +# define memmove(d, s, n) __builtin_memcpy(d, s, n) +# else +# define memmove(d, s, n) memcpy(d, s, n) +# endif +#else +# define memmove(d, s, n) memcpy(d, s, n) +#endif + +#define APPLICATION_NAME "rlfe" + +static int in_from_inferior_fd; +static int out_to_inferior_fd; +static void set_edit_mode (); +static void usage_exit (); +static char *hist_file = 0; +static int hist_size = 0; + +/* Unfortunately, we cannot safely display echo from the inferior process. + The reason is that the echo bit in the pty is "owned" by the inferior, + and if we try to turn it off, we could confuse the inferior. + Thus, when echoing, we get echo twice: First readline echoes while + we're actually editing. Then we send the line to the inferior, and the + terminal driver send back an extra echo. + The work-around is to remember the input lines, and when we see that + line come back, we supress the output. + A better solution (supposedly available on SVR4) would be a smarter + terminal driver, with more flags ... */ +#define ECHO_SUPPRESS_MAX 1024 +char echo_suppress_buffer[ECHO_SUPPRESS_MAX]; +int echo_suppress_start = 0; +int echo_suppress_limit = 0; + +/*#define DEBUG*/ + +#ifdef DEBUG +FILE *logfile = NULL; +#define DPRINT0(FMT) (fprintf(logfile, FMT), fflush(logfile)) +#define DPRINT1(FMT, V1) (fprintf(logfile, FMT, V1), fflush(logfile)) +#define DPRINT2(FMT, V1, V2) (fprintf(logfile, FMT, V1, V2), fflush(logfile)) +#else +#define DPRINT0(FMT) ((void) 0) /* Do nothing */ +#define DPRINT1(FMT, V1) ((void) 0) /* Do nothing */ +#define DPRINT2(FMT, V1, V2) ((void) 0) /* Do nothing */ +#endif + +struct termios orig_term; + +/* Pid of child process. */ +static pid_t child = -1; + +static void +sig_child (int signo) +{ + int status; + wait (&status); + if (hist_file != 0) + { + write_history (hist_file); + if (hist_size) + history_truncate_file (hist_file, hist_size); + } + DPRINT0 ("(Child process died.)\n"); + tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); + exit (0); +} + +volatile int propagate_sigwinch = 0; + +/* sigwinch_handler + * propagate window size changes from input file descriptor to + * master side of pty. + */ +void sigwinch_handler(int signal) { + propagate_sigwinch = 1; +} + + +/* get_slave_pty() returns an integer file descriptor. + * If it returns < 0, an error has occurred. + * Otherwise, it has returned the slave file descriptor. + */ + +int get_slave_pty(char *name) { + struct group *gptr; + gid_t gid; + int slave = -1; + + /* chown/chmod the corresponding pty, if possible. + * This will only work if the process has root permissions. + * Alternatively, write and exec a small setuid program that + * does just this. + */ + if ((gptr = getgrnam("tty")) != 0) { + gid = gptr->gr_gid; + } else { + /* if the tty group does not exist, don't change the + * group on the slave pty, only the owner + */ + gid = -1; + } + + /* Note that we do not check for errors here. If this is code + * where these actions are critical, check for errors! + */ + chown(name, getuid(), gid); + /* This code only makes the slave read/writeable for the user. + * If this is for an interactive shell that will want to + * receive "write" and "wall" messages, OR S_IWGRP into the + * second argument below. + */ + chmod(name, S_IRUSR|S_IWUSR); + + /* open the corresponding slave pty */ + slave = open(name, O_RDWR); + return (slave); +} + +/* Certain special characters, such as ctrl/C, we want to pass directly + to the inferior, rather than letting readline handle them. */ + +static char special_chars[20]; +static int special_chars_count; + +static void +add_special_char(int ch) +{ + if (ch != 0) + special_chars[special_chars_count++] = ch; +} + +static int eof_char; + +static int +is_special_char(int ch) +{ + int i; +#if 0 + if (ch == eof_char && rl_point == rl_end) + return 1; +#endif + for (i = special_chars_count; --i >= 0; ) + if (special_chars[i] == ch) + return 1; + return 0; +} + +static char buf[1024]; +/* buf[0 .. buf_count-1] is the what has been emitted on the current line. + It is used as the readline prompt. */ +static int buf_count = 0; + +int do_emphasize_input = 1; +int current_emphasize_input; + +char *start_input_mode = "\033[1m"; +char *end_input_mode = "\033[0m"; + +int num_keys = 0; + +static void maybe_emphasize_input (int on) +{ + if (on == current_emphasize_input + || (on && ! do_emphasize_input)) + return; + fprintf (rl_outstream, on ? start_input_mode : end_input_mode); + fflush (rl_outstream); + current_emphasize_input = on; +} + +static void +null_prep_terminal (int meta) +{ +} + +static void +null_deprep_terminal () +{ + maybe_emphasize_input (0); +} + +static int +pre_input_change_mode (void) +{ + return 0; +} + +char pending_special_char; + +static void +line_handler (char *line) +{ + if (line == NULL) + { + char buf[1]; + DPRINT0("saw eof!\n"); + buf[0] = '\004'; /* ctrl/d */ + write (out_to_inferior_fd, buf, 1); + } + else + { + static char enter[] = "\r"; + /* Send line to inferior: */ + int length = strlen (line); + if (length > ECHO_SUPPRESS_MAX-2) + { + echo_suppress_start = 0; + echo_suppress_limit = 0; + } + else + { + if (echo_suppress_limit + length > ECHO_SUPPRESS_MAX - 2) + { + if (echo_suppress_limit - echo_suppress_start + length + <= ECHO_SUPPRESS_MAX - 2) + { + memmove (echo_suppress_buffer, + echo_suppress_buffer + echo_suppress_start, + echo_suppress_limit - echo_suppress_start); + echo_suppress_limit -= echo_suppress_start; + echo_suppress_start = 0; + } + else + { + echo_suppress_limit = 0; + } + echo_suppress_start = 0; + } + memcpy (echo_suppress_buffer + echo_suppress_limit, + line, length); + echo_suppress_limit += length; + echo_suppress_buffer[echo_suppress_limit++] = '\r'; + echo_suppress_buffer[echo_suppress_limit++] = '\n'; + } + write (out_to_inferior_fd, line, length); + if (pending_special_char == 0) + { + write (out_to_inferior_fd, enter, sizeof(enter)-1); + if (*line) + add_history (line); + } + free (line); + } + rl_callback_handler_remove (); + buf_count = 0; + num_keys = 0; + if (pending_special_char != 0) + { + write (out_to_inferior_fd, &pending_special_char, 1); + pending_special_char = 0; + } +} + +/* Value of rl_getc_function. + Use this because readline should read from stdin, not rl_instream, + points to the pty (so readline has monitor its terminal modes). */ + +int +my_rl_getc (FILE *dummy) +{ + int ch = rl_getc (stdin); + if (is_special_char (ch)) + { + pending_special_char = ch; + return '\r'; + } + return ch; +} + +int +main(int argc, char** argv) +{ + char *path; + int i; + int master; + char *name; + int in_from_tty_fd; + struct sigaction act; + struct winsize ws; + struct termios t; + int maxfd; + fd_set in_set; + static char empty_string[1] = ""; + char *prompt = empty_string; + int ioctl_err = 0; + int arg_base = 1; + +#ifdef DEBUG + logfile = fopen("/tmp/rlfe.log", "w"); +#endif + + while (arg_base= argc ) + usage_exit(); + switch(argv[arg_base][1]) + { + case 'h': + arg_base++; + hist_file = argv[arg_base]; + break; + case 's': + arg_base++; + hist_size = atoi(argv[arg_base]); + if (hist_size<0) + usage_exit(); + break; + default: + usage_exit(); + } + arg_base++; + } + if (hist_file) + read_history (hist_file); + + set_edit_mode (); + + rl_readline_name = APPLICATION_NAME; + + if ((master = OpenPTY (&name)) < 0) + { + perror("ptypair: could not open master pty"); + exit(1); + } + + DPRINT1("pty name: '%s'\n", name); + + /* set up SIGWINCH handler */ + act.sa_handler = sigwinch_handler; + sigemptyset(&(act.sa_mask)); + act.sa_flags = 0; + if (sigaction(SIGWINCH, &act, NULL) < 0) + { + perror("ptypair: could not handle SIGWINCH "); + exit(1); + } + + if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) + { + perror("ptypair: could not get window size"); + exit(1); + } + + if ((child = fork()) < 0) + { + perror("cannot fork"); + exit(1); + } + + if (child == 0) + { + int slave; /* file descriptor for slave pty */ + + /* We are in the child process */ + close(master); + +#ifdef TIOCSCTTY + if ((slave = get_slave_pty(name)) < 0) + { + perror("ptypair: could not open slave pty"); + exit(1); + } +#endif + + /* We need to make this process a session group leader, because + * it is on a new PTY, and things like job control simply will + * not work correctly unless there is a session group leader + * and process group leader (which a session group leader + * automatically is). This also disassociates us from our old + * controlling tty. + */ + if (setsid() < 0) + { + perror("could not set session leader"); + } + + /* Tie us to our new controlling tty. */ +#ifdef TIOCSCTTY + if (ioctl(slave, TIOCSCTTY, NULL)) + { + perror("could not set new controlling tty"); + } +#else + if ((slave = get_slave_pty(name)) < 0) + { + perror("ptypair: could not open slave pty"); + exit(1); + } +#endif + + /* make slave pty be standard in, out, and error */ + dup2(slave, STDIN_FILENO); + dup2(slave, STDOUT_FILENO); + dup2(slave, STDERR_FILENO); + + /* at this point the slave pty should be standard input */ + if (slave > 2) + { + close(slave); + } + + /* Try to restore window size; failure isn't critical */ + if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0) + { + perror("could not restore window size"); + } + + /* now start the shell */ + { + static char* command_args[] = { COMMAND_ARGS, NULL }; + static char* alt_command_args[] = { ALT_COMMAND_ARGS, NULL }; + if (argc <= 1) + { + execvp (COMMAND, command_args); + execvp (ALT_COMMAND, alt_command_args); + } + else + execvp (argv[arg_base], &argv[arg_base]); + } + + /* should never be reached */ + exit(1); + } + + /* parent */ + signal (SIGCHLD, sig_child); + + /* Note that we only set termios settings for standard input; + * the master side of a pty is NOT a tty. + */ + tcgetattr(STDIN_FILENO, &orig_term); + + t = orig_term; + eof_char = t.c_cc[VEOF]; + /* add_special_char(t.c_cc[VEOF]);*/ + add_special_char(t.c_cc[VINTR]); + add_special_char(t.c_cc[VQUIT]); + add_special_char(t.c_cc[VSUSP]); +#if defined (VDISCARD) + add_special_char(t.c_cc[VDISCARD]); +#endif + + t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \ + ECHOK | ECHONL +#if defined (ECHOKE) + | ECHOKE +#endif +#if defined (ECHOPRT) + | ECHOPRT +#endif + ); + t.c_iflag &= ~ICRNL; + t.c_iflag |= IGNBRK; + t.c_cc[VMIN] = 1; + t.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSANOW, &t); + in_from_inferior_fd = master; + out_to_inferior_fd = master; + rl_instream = fdopen (master, "r"); + rl_getc_function = my_rl_getc; + + rl_prep_term_function = null_prep_terminal; + rl_deprep_term_function = null_deprep_terminal; + rl_pre_input_hook = pre_input_change_mode; + rl_callback_handler_install (prompt, line_handler); + + in_from_tty_fd = STDIN_FILENO; + FD_ZERO (&in_set); + maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd + : in_from_tty_fd; + for (;;) + { + int num; + FD_SET (in_from_inferior_fd, &in_set); + FD_SET (in_from_tty_fd, &in_set); + + num = select(maxfd+1, &in_set, NULL, NULL, NULL); + + if (propagate_sigwinch) + { + struct winsize ws; + if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) >= 0) + { + ioctl (master, TIOCSWINSZ, &ws); + } + propagate_sigwinch = 0; + continue; + } + + if (num <= 0) + { + perror ("select"); + exit (-1); + } + if (FD_ISSET (in_from_tty_fd, &in_set)) + { + extern int _rl_echoing_p; + struct termios term_master; + int do_canon = 1; + int do_icrnl = 1; + int ioctl_ret; + + DPRINT1("[tty avail num_keys:%d]\n", num_keys); + + /* If we can't get tty modes for the master side of the pty, we + can't handle non-canonical-mode programs. Always assume the + master is in canonical echo mode if we can't tell. */ + ioctl_ret = tcgetattr(master, &term_master); + + if (ioctl_ret >= 0) + { + do_canon = (term_master.c_lflag & ICANON) != 0; + do_icrnl = (term_master.c_lflag & ICRNL) != 0; + _rl_echoing_p = (term_master.c_lflag & ECHO) != 0; + DPRINT1 ("echo,canon,crnl:%03d\n", + 100 * _rl_echoing_p + + 10 * do_canon + + 1 * do_icrnl); + } + else + { + if (ioctl_err == 0) + DPRINT1("tcgetattr on master fd failed: errno = %d\n", errno); + ioctl_err = 1; + } + + if (do_canon == 0 && num_keys == 0) + { + char ch[10]; + int count = read (STDIN_FILENO, ch, sizeof(ch)); + DPRINT1("[read %d chars from stdin: ", count); + DPRINT2(" \"%.*s\"]\n", count, ch); + if (do_icrnl) + { + int i = count; + while (--i >= 0) + { + if (ch[i] == '\r') + ch[i] = '\n'; + } + } + maybe_emphasize_input (1); + write (out_to_inferior_fd, ch, count); + } + else + { + if (num_keys == 0) + { + int i; + /* Re-install callback handler for new prompt. */ + if (prompt != empty_string) + free (prompt); + if (prompt == NULL) + { + DPRINT0("New empty prompt\n"); + prompt = empty_string; + } + else + { + if (do_emphasize_input && buf_count > 0) + { + prompt = malloc (buf_count + strlen (end_input_mode) + + strlen (start_input_mode) + 5); + sprintf (prompt, "\001%s\002%.*s\001%s\002", + end_input_mode, + buf_count, buf, + start_input_mode); + } + else + { + prompt = malloc (buf_count + 1); + memcpy (prompt, buf, buf_count); + prompt[buf_count] = '\0'; + } + DPRINT1("New prompt '%s'\n", prompt); +#if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED */ + /* Doesn't quite work when do_emphasize_input is 1. */ + rl_already_prompted = buf_count > 0; +#else + if (buf_count > 0) + write (1, "\r", 1); +#endif + } + + rl_callback_handler_install (prompt, line_handler); + } + num_keys++; + maybe_emphasize_input (1); + rl_callback_read_char (); + } + } + else /* output from inferior. */ + { + int i; + int count; + int old_count; + if (buf_count > (sizeof(buf) >> 2)) + buf_count = 0; + count = read (in_from_inferior_fd, buf+buf_count, + sizeof(buf) - buf_count); + DPRINT2("read %d from inferior, buf_count=%d", count, buf_count); + DPRINT2(": \"%.*s\"", count, buf+buf_count); + maybe_emphasize_input (0); + if (count <= 0) + { + DPRINT0 ("(Connection closed by foreign host.)\n"); + tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); + exit (0); + } + old_count = buf_count; + + /* Look for any pending echo that we need to suppress. */ + while (echo_suppress_start < echo_suppress_limit + && count > 0 + && buf[buf_count] == echo_suppress_buffer[echo_suppress_start]) + { + count--; + buf_count++; + echo_suppress_start++; + } + DPRINT1("suppressed %d characters of echo.\n", buf_count-old_count); + + /* Write to the terminal anything that was not suppressed. */ + if (count > 0) + write (1, buf + buf_count, count); + + /* Finally, look for a prompt candidate. + * When we get around to going input (from the keyboard), + * we will consider the prompt to be anything since the last + * line terminator. So we need to save that text in the + * initial part of buf. However, anything before the + * most recent end-of-line is not interesting. */ + buf_count += count; +#if 1 + for (i = buf_count; --i >= old_count; ) +#else + for (i = buf_count - 1; i-- >= buf_count - count; ) +#endif + { + if (buf[i] == '\n' || buf[i] == '\r') + { + i++; + memmove (buf, buf+i, buf_count - i); + buf_count -= i; + break; + } + } + DPRINT2("-> i: %d, buf_count: %d\n", i, buf_count); + } + } +} + +static void set_edit_mode () +{ + int vi = 0; + char *shellopts; + + shellopts = getenv ("SHELLOPTS"); + while (shellopts != 0) + { + if (strncmp ("vi", shellopts, 2) == 0) + { + vi = 1; + break; + } + shellopts = strchr (shellopts + 1, ':'); + } + + if (!vi) + { + if (getenv ("EDITOR") != 0) + vi |= strcmp (getenv ("EDITOR"), "vi") == 0; + } + + if (vi) + rl_variable_bind ("editing-mode", "vi"); + else + rl_variable_bind ("editing-mode", "emacs"); +} + + +static void usage_exit () +{ + fprintf (stderr, "Usage: rlfe [-h histfile] [-s size] cmd [arg1] [arg2] ...\n\n"); + exit (1); +} diff --git a/examples/rlfe/screen.h b/examples/rlfe/screen.h new file mode 100644 index 0000000..5b040c3 --- /dev/null +++ b/examples/rlfe/screen.h @@ -0,0 +1,2 @@ +/* Dummy header to avoid modifying pty.c */ +#include "os.h" diff --git a/examples/rlkeymaps.c b/examples/rlkeymaps.c new file mode 100644 index 0000000..fef77b3 --- /dev/null +++ b/examples/rlkeymaps.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include + +#if defined (READLINE_LIBRARY) +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +int +main (int c, char **v) +{ + Keymap nmap, emacsmap, newemacs; + int r, errs; + + errs = 0; + nmap = rl_make_keymap (); + + r = rl_set_keymap_name ("emacs", nmap); + if (r >= 0) + { + fprintf (stderr, "rlkeymaps: error: able to rename `emacs' keymap\n"); + errs++; + } + + emacsmap = rl_get_keymap_by_name ("emacs"); + r = rl_set_keymap_name ("newemacs", emacsmap); + if (r >= 0) + { + fprintf (stderr, "rlkeymaps: error: able to set new name for emacs keymap\n"); + errs++; + } + + r = rl_set_keymap_name ("newemacs", nmap); + if (r < 0) + { + fprintf (stderr, "rlkeymaps: error: newemacs: could not set keymap name\n"); + errs++; + } + + newemacs = rl_copy_keymap (emacsmap); + r = rl_set_keymap_name ("newemacs", newemacs); + if (r < 0) + { + fprintf (stderr, "rlkeymaps: error: newemacs: could not set `newemacs' keymap to new map\n"); + errs++; + } + + r = rl_set_keymap_name ("emacscopy", newemacs); + if (r < 0) + { + fprintf (stderr, "rlkeymaps: error: emacscopy: could not rename created keymap\n"); + errs++; + } + + exit (errs); +} diff --git a/examples/rlptytest.c b/examples/rlptytest.c new file mode 100644 index 0000000..d170f62 --- /dev/null +++ b/examples/rlptytest.c @@ -0,0 +1,354 @@ +/* + * + * Another test harness for the readline callback interface. + * + * Author: Bob Rossi + */ + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#include +#include +#include +#include + +#include +#include + +#include + +#if 1 /* LINUX */ +#include +#else +#include +#endif + +#ifdef HAVE_LOCALE_H +# include +#endif + +#ifdef READLINE_LIBRARY +# include "readline.h" +#else +# include +#endif + +/** + * Master/Slave PTY used to keep readline off of stdin/stdout. + */ +static int masterfd = -1; +static int slavefd; + +void +sigint (s) + int s; +{ + tty_reset (STDIN_FILENO); + close (masterfd); + close (slavefd); + printf ("\n"); + exit (0); +} + +void +sigwinch (s) + int s; +{ + rl_resize_terminal (); +} + +static int +user_input() +{ + int size; + const int MAX = 1024; + char *buf = (char *)malloc(MAX+1); + + size = read (STDIN_FILENO, buf, MAX); + if (size == -1) + return -1; + + size = write (masterfd, buf, size); + if (size == -1) + return -1; + + return 0; +} + +static int +readline_input() +{ + const int MAX = 1024; + char *buf = (char *)malloc(MAX+1); + int size; + + size = read (masterfd, buf, MAX); + if (size == -1) + { + free( buf ); + buf = NULL; + return -1; + } + + buf[size] = 0; + + /* Display output from readline */ + if ( size > 0 ) + fprintf(stderr, "%s", buf); + + free( buf ); + buf = NULL; + return 0; +} + +static void +rlctx_send_user_command(char *line) +{ + /* This happens when rl_callback_read_char gets EOF */ + if ( line == NULL ) + return; + + if (strcmp (line, "exit") == 0) { + tty_reset (STDIN_FILENO); + close (masterfd); + close (slavefd); + printf ("\n"); + exit (0); + } + + /* Don't add the enter command */ + if ( line && *line != '\0' ) + add_history(line); +} + +static void +custom_deprep_term_function () +{ +} + +static int +init_readline (int inputfd, int outputfd) +{ + FILE *inputFILE, *outputFILE; + + inputFILE = fdopen (inputfd, "r"); + if (!inputFILE) + return -1; + + outputFILE = fdopen (outputfd, "w"); + if (!outputFILE) + return -1; + + rl_instream = inputFILE; + rl_outstream = outputFILE; + + /* Tell readline what the prompt is if it needs to put it back */ + rl_callback_handler_install("(rltest): ", rlctx_send_user_command); + + /* Set the terminal type to dumb so the output of readline can be + * understood by tgdb */ + if ( rl_reset_terminal("dumb") == -1 ) + return -1; + + /* For some reason, readline can not deprep the terminal. + * However, it doesn't matter because no other application is working on + * the terminal besides readline */ + rl_deprep_term_function = custom_deprep_term_function; + + using_history(); + read_history(".history"); + + return 0; +} + +static int +main_loop(void) +{ + fd_set rset; + int max; + + max = (masterfd > STDIN_FILENO) ? masterfd : STDIN_FILENO; + max = (max > slavefd) ? max : slavefd; + + for (;;) + { + /* Reset the fd_set, and watch for input from GDB or stdin */ + FD_ZERO(&rset); + + FD_SET(STDIN_FILENO, &rset); + FD_SET(slavefd, &rset); + FD_SET(masterfd, &rset); + + /* Wait for input */ + if (select(max + 1, &rset, NULL, NULL, NULL) == -1) + { + if (errno == EINTR) + continue; + else + return -1; + } + + /* Input received through the pty: Handle it + * Wrote to masterfd, slave fd has that input, alert readline to read it. + */ + if (FD_ISSET(slavefd, &rset)) + rl_callback_read_char(); + + /* Input received through the pty. + * Readline read from slavefd, and it wrote to the masterfd. + */ + if (FD_ISSET(masterfd, &rset)) + if ( readline_input() == -1 ) + return -1; + + /* Input received: Handle it, write to masterfd (input to readline) */ + if (FD_ISSET(STDIN_FILENO, &rset)) + if ( user_input() == -1 ) + return -1; + } + + return 0; +} + +/* The terminal attributes before calling tty_cbreak */ +static struct termios save_termios; +static struct winsize size; +static enum { RESET, TCBREAK } ttystate = RESET; + +/* tty_cbreak: Sets terminal to cbreak mode. Also known as noncanonical mode. + * 1. Signal handling is still turned on, so the user can still type those. + * 2. echo is off + * 3. Read in one char at a time. + * + * fd - The file descriptor of the terminal + * + * Returns: 0 on success, -1 on error + */ +int tty_cbreak(int fd){ + struct termios buf; + int ttysavefd = -1; + + if(tcgetattr(fd, &save_termios) < 0) + return -1; + + buf = save_termios; + buf.c_lflag &= ~(ECHO | ICANON); + buf.c_iflag &= ~(ICRNL | INLCR); + buf.c_cc[VMIN] = 1; + buf.c_cc[VTIME] = 0; + +#if defined (VLNEXT) && defined (_POSIX_VDISABLE) + buf.c_cc[VLNEXT] = _POSIX_VDISABLE; +#endif + +#if defined (VDSUSP) && defined (_POSIX_VDISABLE) + buf.c_cc[VDSUSP] = _POSIX_VDISABLE; +#endif + + /* enable flow control; only stty start char can restart output */ +#if 0 + buf.c_iflag |= (IXON|IXOFF); +#ifdef IXANY + buf.c_iflag &= ~IXANY; +#endif +#endif + + /* disable flow control; let ^S and ^Q through to pty */ + buf.c_iflag &= ~(IXON|IXOFF); +#ifdef IXANY + buf.c_iflag &= ~IXANY; +#endif + + if(tcsetattr(fd, TCSAFLUSH, &buf) < 0) + return -1; + + ttystate = TCBREAK; + ttysavefd = fd; + + /* set size */ + if(ioctl(fd, TIOCGWINSZ, (char *)&size) < 0) + return -1; + +#ifdef DEBUG + err_msg("%d rows and %d cols\n", size.ws_row, size.ws_col); +#endif + + return (0); +} + +int +tty_off_xon_xoff (int fd) +{ + struct termios buf; + int ttysavefd = -1; + + if(tcgetattr(fd, &buf) < 0) + return -1; + + buf.c_iflag &= ~(IXON|IXOFF); + + if(tcsetattr(fd, TCSAFLUSH, &buf) < 0) + return -1; + + return 0; +} + +/* tty_reset: Sets the terminal attributes back to their previous state. + * PRE: tty_cbreak must have already been called. + * + * fd - The file descrioptor of the terminal to reset. + * + * Returns: 0 on success, -1 on error + */ +int tty_reset(int fd) +{ + if(ttystate != TCBREAK) + return (0); + + if(tcsetattr(fd, TCSAFLUSH, &save_termios) < 0) + return (-1); + + ttystate = RESET; + + return 0; +} + +int +main() +{ + int val; + +#ifdef HAVE_SETLOCALE + setlocale (LC_ALL, ""); +#endif + + val = openpty (&masterfd, &slavefd, NULL, NULL, NULL); + if (val == -1) + return -1; + + val = tty_off_xon_xoff (masterfd); + if (val == -1) + return -1; + + signal (SIGWINCH, sigwinch); + signal (SIGINT, sigint); + + val = init_readline (slavefd, slavefd); + if (val == -1) + return -1; + + val = tty_cbreak (STDIN_FILENO); + if (val == -1) + return -1; + + val = main_loop (); + + tty_reset (STDIN_FILENO); + + if (val == -1) + return -1; + + return 0; +} diff --git a/examples/rltest.c b/examples/rltest.c new file mode 100644 index 0000000..8b7c00c --- /dev/null +++ b/examples/rltest.c @@ -0,0 +1,101 @@ +/* **************************************************************** */ +/* */ +/* Testing Readline */ +/* */ +/* **************************************************************** */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#include +#include + +#ifdef HAVE_STDLIB_H +# include +#else +extern void exit(); +#endif + +#ifdef HAVE_LOCALE_H +# include +#endif + +#ifdef READLINE_LIBRARY +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern HIST_ENTRY **history_list (); + +int +main () +{ + char *temp, *prompt; + int done; + +#ifdef HAVE_SETLOCALE + setlocale (LC_ALL, ""); +#endif + + temp = (char *)NULL; + prompt = "readline$ "; + done = 0; + + while (!done) + { + temp = readline (prompt); + + /* Test for EOF. */ + if (!temp) + exit (1); + + /* If there is anything on the line, print it and remember it. */ + if (*temp) + { + fprintf (stderr, "%s\r\n", temp); + add_history (temp); + } + + /* Check for `command' that we handle. */ + if (strcmp (temp, "quit") == 0) + done = 1; + + if (strcmp (temp, "list") == 0) + { + HIST_ENTRY **list; + register int i; + + list = history_list (); + if (list) + { + for (i = 0; list[i]; i++) + fprintf (stderr, "%d: %s\r\n", i, list[i]->line); + } + } + free (temp); + } + exit (0); +} diff --git a/examples/rlversion.c b/examples/rlversion.c new file mode 100644 index 0000000..f36567b --- /dev/null +++ b/examples/rlversion.c @@ -0,0 +1,49 @@ +/* + * rlversion -- print out readline's version number + */ + +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include "posixstat.h" + +#ifdef HAVE_STDLIB_H +# include +#else +extern void exit(); +#endif + +#ifdef READLINE_LIBRARY +# include "readline.h" +#else +# include +#endif + +int +main() +{ + printf ("%s\n", rl_library_version ? rl_library_version : "unknown"); + exit (0); +} diff --git a/examples/rlwrap-0.30.tar.gz b/examples/rlwrap-0.30.tar.gz new file mode 100644 index 0000000..73381a2 Binary files /dev/null and b/examples/rlwrap-0.30.tar.gz differ diff --git a/funmap.c b/funmap.c new file mode 100644 index 0000000..8b1cb40 --- /dev/null +++ b/funmap.c @@ -0,0 +1,273 @@ +/* funmap.c -- attach names to functions. */ + +/* Copyright (C) 1987-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if !defined (BUFSIZ) +#include +#endif /* BUFSIZ */ + +#if defined (HAVE_STDLIB_H) +# include +#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 (char **, char **); + +FUNMAP **funmap; +static int funmap_size; +static int funmap_entry; + +/* After initializing the function map, this is the index of the first + program specific function. */ +int funmap_program_specific_entry_start; + +static const FUNMAP default_funmap[] = { + { "abort", rl_abort }, + { "accept-line", rl_newline }, + { "arrow-key-prefix", rl_arrow_keys }, + { "backward-byte", rl_backward_byte }, + { "backward-char", rl_backward_char }, + { "backward-delete-char", rl_rubout }, + { "backward-kill-line", rl_backward_kill_line }, + { "backward-kill-word", rl_backward_kill_word }, + { "backward-word", rl_backward_word }, + { "beginning-of-history", rl_beginning_of_history }, + { "beginning-of-line", rl_beg_of_line }, + { "bracketed-paste-begin", rl_bracketed_paste_begin }, + { "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-display", rl_clear_display }, + { "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 }, + { "fetch-history", rl_fetch_history }, + { "forward-backward-delete-char", rl_rubout_or_delete }, + { "forward-byte", rl_forward_byte }, + { "forward-char", rl_forward_char }, + { "forward-search-history", rl_forward_search_history }, + { "forward-word", rl_forward_word }, + { "history-search-backward", rl_history_search_backward }, + { "history-search-forward", rl_history_search_forward }, + { "history-substring-search-backward", rl_history_substr_search_backward }, + { "history-substring-search-forward", rl_history_substr_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 }, + { "menu-complete-backward", rl_backward_menu_complete }, + { "next-history", rl_get_next_history }, + { "next-screen-line", rl_next_screen_line }, + { "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 }, + { "old-menu-complete", rl_old_menu_complete }, + { "operate-and-get-next", rl_operate_and_get_next }, + { "overwrite-mode", rl_overwrite_mode }, +#if defined (_WIN32) + { "paste-from-clipboard", rl_paste_from_clipboard }, +#endif + { "possible-completions", rl_possible_completions }, + { "previous-history", rl_get_previous_history }, + { "previous-screen-line", rl_previous_screen_line }, + { "print-last-kbd-macro", rl_print_last_kbd_macro }, + { "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 }, + { "skip-csi-sequence", rl_skip_csi_sequence }, + { "start-kbd-macro", rl_start_kbd_macro }, + { "tab-insert", rl_tab_insert }, + { "tilde-expand", rl_tilde_expand }, + { "transpose-chars", rl_transpose_chars }, + { "transpose-words", rl_transpose_words }, + { "tty-status", rl_tty_status }, + { "undo", rl_undo_command }, + { "universal-argument", rl_universal_argument }, + { "unix-filename-rubout", rl_unix_filename_rubout }, + { "unix-line-discard", rl_unix_line_discard }, + { "unix-word-rubout", rl_unix_word_rubout }, + { "upcase-word", rl_upcase_word }, + { "yank", rl_yank }, + { "yank-last-arg", rl_yank_last_arg }, + { "yank-nth-arg", rl_yank_nth_arg }, + { "yank-pop", rl_yank_pop }, + +#if defined (VI_MODE) + { "vi-append-eol", rl_vi_append_eol }, + { "vi-append-mode", rl_vi_append_mode }, + { "vi-arg-digit", rl_vi_arg_digit }, + { "vi-back-to-indent", rl_vi_back_to_indent }, + { "vi-backward-bigword", rl_vi_bWord }, + { "vi-backward-word", rl_vi_bword }, + { "vi-bWord", rl_vi_bWord }, + { "vi-bword", rl_vi_bword }, /* BEWARE: name matching is case insensitive */ + { "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-bigword", rl_vi_eWord }, + { "vi-end-word", rl_vi_end_word }, + { "vi-eof-maybe", rl_vi_eof_maybe }, + { "vi-eword", rl_vi_eword }, /* BEWARE: name matching is case insensitive */ + { "vi-fWord", rl_vi_fWord }, + { "vi-fetch-history", rl_vi_fetch_history }, + { "vi-first-print", rl_vi_first_print }, + { "vi-forward-bigword", rl_vi_fWord }, + { "vi-forward-word", rl_vi_fword }, + { "vi-fword", rl_vi_fword }, /* BEWARE: name matching is case insensitive */ + { "vi-goto-mark", rl_vi_goto_mark }, + { "vi-insert-beg", rl_vi_insert_beg }, + { "vi-insertion-mode", rl_vi_insert_mode }, + { "vi-match", rl_vi_match }, + { "vi-movement-mode", rl_vi_movement_mode }, + { "vi-next-word", rl_vi_next_word }, + { "vi-overstrike", rl_vi_overstrike }, + { "vi-overstrike-delete", rl_vi_overstrike_delete }, + { "vi-prev-word", rl_vi_prev_word }, + { "vi-put", rl_vi_put }, + { "vi-redo", rl_vi_redo }, + { "vi-replace", rl_vi_replace }, + { "vi-rubout", rl_vi_rubout }, + { "vi-search", rl_vi_search }, + { "vi-search-again", rl_vi_search_again }, + { "vi-set-mark", rl_vi_set_mark }, + { "vi-subst", rl_vi_subst }, + { "vi-tilde-expand", rl_vi_tilde_expand }, + { "vi-undo", rl_vi_undo }, + { "vi-unix-word-rubout", rl_vi_unix_word_rubout }, + { "vi-yank-arg", rl_vi_yank_arg }, + { "vi-yank-pop", rl_vi_yank_pop }, + { "vi-yank-to", rl_vi_yank_to }, +#endif /* VI_MODE */ + + {(char *)NULL, (rl_command_func_t *)NULL } +}; + +int +rl_add_funmap_entry (const char *name, rl_command_func_t *function) +{ + if (funmap_entry + 2 >= funmap_size) + { + funmap_size += 64; + funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *)); + } + + funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP)); + funmap[funmap_entry]->name = name; + funmap[funmap_entry]->function = function; + + funmap[++funmap_entry] = (FUNMAP *)NULL; + return funmap_entry; +} + +static int funmap_initialized; + +/* Make the funmap contain all of the default entries. */ +void +rl_initialize_funmap (void) +{ + 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 pointers. */ +const char ** +rl_funmap_names (void) +{ + const char **result; + int result_size, result_index; + + /* Make sure that the function map has been initialized. */ + rl_initialize_funmap (); + + for (result_index = result_size = 0, result = (const char **)NULL; funmap[result_index]; result_index++) + { + if (result_index + 2 > result_size) + { + result_size += 20; + result = (const char **)xrealloc (result, result_size * sizeof (char *)); + } + + result[result_index] = funmap[result_index]->name; + result[result_index + 1] = (char *)NULL; + } + + qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); + return (result); +} diff --git a/histexpand.c b/histexpand.c new file mode 100644 index 0000000..8ab6809 --- /dev/null +++ b/histexpand.c @@ -0,0 +1,1718 @@ +/* histexpand.c -- history expansion. */ + +/* Copyright (C) 1989-2021 Free Software Foundation, Inc. + + This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + + History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + History is distributed in the hope that it will be useful, + but WITHOUT 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 History. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# ifndef _MINIX +# include +# endif +# include +#endif + +#include "rlmbutil.h" + +#include "history.h" +#include "histlib.h" +#include "chardefs.h" + +#include "rlshell.h" +#include "xmalloc.h" + +#define HISTORY_WORD_DELIMITERS " \t\n;&()|<>" +#define HISTORY_QUOTE_CHARACTERS "\"'`" +#define HISTORY_EVENT_DELIMITERS "^$*%-" + +#define slashify_in_quotes "\\`\"$" + +#define fielddelim(c) (whitespace(c) || (c) == '\n') + +typedef int _hist_search_func_t (const char *, int); + +static char error_pointer; + +static char *subst_lhs; +static char *subst_rhs; +static int subst_lhs_len; +static int subst_rhs_len; + +/* Characters that delimit history event specifications and separate event + specifications from word designators. Static for now */ +static char *history_event_delimiter_chars = HISTORY_EVENT_DELIMITERS; + +static char *get_history_word_specifier (char *, char *, int *); +static int history_tokenize_word (const char *, int); +static char **history_tokenize_internal (const char *, int, int *); +static char *history_substring (const char *, int, int); +static void freewords (char **, int); +static char *history_find_word (char *, int); + +static char *quote_breaks (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 up to a newline are + ignored. For a Bourne shell, this should be '#'. Bash special cases + the interactive comment character to not be a comment delimiter. */ +char history_comment_char = '\0'; + +/* The list of characters which inhibit the expansion of text if found + immediately following history_expansion_char. */ +char *history_no_expand_chars = " \t\n\r="; + +/* If set to a non-zero value, single quotes inhibit history expansion. + The default is 0. */ +int history_quotes_inhibit_expansion = 0; + +/* Used to split words by history_tokenize_internal. */ +char *history_word_delimiters = HISTORY_WORD_DELIMITERS; + +/* If set, this points to a function that is called to verify that a + particular history expansion should be performed. */ +rl_linebuf_func_t *history_inhibit_expansion_function; + +int history_quoting_state = 0; + +/* **************************************************************** */ +/* */ +/* 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 (const char *string, int *caller_index, int delimiting_quote) +{ + register int i; + register char c; + HIST_ENTRY *entry; + int which, sign, local_index, substring_okay; + _hist_search_func_t *search_func; + char *temp; + + /* The event can be specified in a number of ways. + + !! the previous command + !n command line N + !-n current command-line minus N + !str the most recent command starting with STR + !?str[?] + the most recent command containing STR + + All values N are determined via HISTORY_BASE. */ + + i = *caller_index; + + if (string[i] != history_expansion_char) + return ((char *)NULL); + + /* Move on to the specification. */ + i++; + + sign = 1; + substring_okay = 0; + +#define RETURN_ENTRY(e, w) \ + return ((e = history_get (w)) ? e->line : (char *)NULL) + + /* Handle !! case. */ + if (string[i] == history_expansion_char) + { + i++; + which = history_base + (history_length - 1); + *caller_index = i; + RETURN_ENTRY (entry, which); + } + + /* Hack case of numeric line specification. */ + if (string[i] == '-' && _rl_digit_p (string[i+1])) + { + sign = -1; + i++; + } + + if (_rl_digit_p (string[i])) + { + /* Get the extent of the digits and compute the value. */ + for (which = 0; _rl_digit_p (string[i]); i++) + which = (which * 10) + _rl_digit_value (string[i]); + + *caller_index = i; + + if (sign < 0) + which = (history_length + history_base) - which; + + RETURN_ENTRY (entry, which); + } + + /* This must be something to search for. If the spec begins with + a '?', then the string may be anywhere on the line. Otherwise, + the string must be found at the start of a line. */ + if (string[i] == '?') + { + substring_okay++; + i++; + } + + /* Only a closing `?' or a newline delimit a substring search string. */ + for (local_index = i; c = string[i]; i++) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int v; + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); + /* These produce warnings because we're passing a const string to a + function that takes a non-const string. */ + _rl_adjust_point ((char *)string, i, &ps); + if ((v = _rl_get_char_len ((char *)string + i, &ps)) > 1) + { + i += v - 1; + continue; + } + } + +#endif /* HANDLE_MULTIBYTE */ + if ((!substring_okay && + (whitespace (c) || c == ':' || + (i > local_index && history_event_delimiter_chars && c == '-') || + (c != '-' && history_event_delimiter_chars && member (c, history_event_delimiter_chars)) || + (history_search_delimiter_chars && member (c, history_search_delimiter_chars)) || + string[i] == delimiting_quote)) || + string[i] == '\n' || + (substring_okay && string[i] == '?')) + break; + } + + which = i - local_index; + temp = (char *)xmalloc (1 + which); + if (which) + strncpy (temp, string + local_index, which); + temp[which] = '\0'; + + if (substring_okay && string[i] == '?') + i++; + + *caller_index = i; + +#define FAIL_SEARCH() \ + do { \ + history_offset = history_length; xfree (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) + { + xfree (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 (); + if (entry == 0) + FAIL_SEARCH (); + 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 + xfree (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. FLAGS currently used to allow backslash + to escape a single quote (e.g., for bash $'...'). */ +static void +hist_string_extract_single_quoted (char *string, int *sindex, int flags) +{ + register int i; + + for (i = *sindex; string[i] && string[i] != '\''; i++) + { + if ((flags & 1) && string[i] == '\\' && string[i+1]) + i++; + } + + *sindex = i; +} + +static char * +quote_breaks (char *s) +{ + register char *p, *r; + char *ret; + int len = 3; + + for (p = s; p && *p; p++, len++) + { + if (*p == '\'') + len += 3; + else if (whitespace (*p) || *p == '\n') + len += 2; + } + + r = ret = (char *)xmalloc (len); + *r++ = '\''; + for (p = s; p && *p; ) + { + if (*p == '\'') + { + *r++ = '\''; + *r++ = '\\'; + *r++ = '\''; + *r++ = '\''; + p++; + } + else if (whitespace (*p) || *p == '\n') + { + *r++ = '\''; + *r++ = *p++; + *r++ = '\''; + } + else + *r++ = *p++; + } + *r++ = '\''; + *r = '\0'; + return ret; +} + +static char * +hist_error(char *s, int start, int current, int errtype) +{ + char *temp; + const char *emsg; + int ll, elen; + + ll = current - start; + + switch (errtype) + { + case EVENT_NOT_FOUND: + emsg = "event not found"; + elen = 15; + break; + case BAD_WORD_SPEC: + emsg = "bad word specifier"; + elen = 18; + break; + case SUBST_FAILED: + emsg = "substitution failed"; + elen = 19; + break; + case BAD_MODIFIER: + emsg = "unrecognized history modifier"; + elen = 29; + break; + case NO_PREV_SUBST: + emsg = "no previous substitution"; + elen = 24; + break; + default: + emsg = "unknown expansion error"; + elen = 23; + break; + } + + temp = (char *)xmalloc (ll + elen + 3); + if (s[start]) + strncpy (temp, s + start, ll); + else + ll = 0; + 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 (char *str, int *iptr, int delimiter, int is_rhs, int *lenptr) +{ + register int si, i, j, k; + char *s; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; +#endif + + s = (char *)NULL; + i = *iptr; + +#if defined (HANDLE_MULTIBYTE) + memset (&ps, 0, sizeof (mbstate_t)); + _rl_adjust_point (str, i, &ps); +#endif + + for (si = i; str[si] && str[si] != delimiter; si++) +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int v; + if ((v = _rl_get_char_len (str + si, &ps)) > 1) + si += v - 1; + else if (str[si] == '\\' && str[si + 1] == delimiter) + si++; + } + else +#endif /* HANDLE_MULTIBYTE */ + if (str[si] == '\\' && str[si + 1] == delimiter) + si++; + + if (si > i || is_rhs) + { + s = (char *)xmalloc (si - i + 1); + for (j = 0, k = i; k < si; j++, k++) + { + /* Remove a backslash quoting the search string delimiter. */ + if (str[k] == '\\' && str[k + 1] == delimiter) + k++; + s[j] = str[k]; + } + s[j] = '\0'; + if (lenptr) + *lenptr = j; + } + + i = si; + if (str[i]) + i++; + *iptr = i; + + return s; +} + +static void +postproc_subst_rhs (void) +{ + char *new; + int i, j, new_size; + + new = (char *)xmalloc (new_size = subst_rhs_len + subst_lhs_len); + for (i = j = 0; i < subst_rhs_len; i++) + { + if (subst_rhs[i] == '&') + { + if (j + subst_lhs_len >= new_size) + new = (char *)xrealloc (new, (new_size = new_size * 2 + subst_lhs_len)); + strcpy (new + j, subst_lhs); + j += subst_lhs_len; + } + else + { + /* a single backslash protects the `&' from lhs interpolation */ + if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&') + i++; + if (j >= new_size) + new = (char *)xrealloc (new, new_size *= 2); + new[j++] = subst_rhs[i]; + } + } + new[j] = '\0'; + xfree (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. */ +/* need current line for !# */ +static int +history_expand_internal (char *string, int start, int qc, int *end_index_ptr, char **ret_string, char *current_line) +{ + int i, n, starting_index; + int substitute_globally, subst_bywords, want_quotes, print_only; + char *event, *temp, *result, *tstr, *t, c, *word_spec; + int result_len; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); +#endif + + result = (char *)xmalloc (result_len = 128); + + i = start; + + /* If it is followed by something that starts a word specifier, + then !! is implied as the event specifier. */ + + if (member (string[i + 1], ":$*%^")) + { + char fake_s[3]; + int fake_i = 0; + i++; + fake_s[0] = fake_s[1] = history_expansion_char; + fake_s[2] = '\0'; + event = get_history_event (fake_s, &fake_i, 0); + } + else if (string[i + 1] == '#') + { + i += 2; + event = current_line; + } + else + event = get_history_event (string, &i, qc); + + if (event == 0) + { + *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND); + xfree (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); + xfree (result); + return (-1); + } + + /* If no word specifier, than the thing of interest was the event. */ + temp = word_spec ? savestring (word_spec) : savestring (event); + FREE (word_spec); + + /* Perhaps there are other modifiers involved. Do what they say. */ + want_quotes = substitute_globally = subst_bywords = print_only = 0; + starting_index = i; + + while (string[i] == ':') + { + c = string[i + 1]; + + if (c == 'g' || c == 'a') + { + substitute_globally = 1; + i++; + c = string[i + 1]; + } + else if (c == 'G') + { + subst_bywords = 1; + i++; + c = string[i + 1]; + } + + switch (c) + { + default: + *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER); + xfree (result); + xfree (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 = 1; + break; + + /* :t discards all but the last part of the pathname. */ + case 't': + tstr = strrchr (temp, '/'); + if (tstr) + { + tstr++; + t = savestring (tstr); + xfree (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); + xfree (temp); + temp = t; + } + break; + + /* :s/this/that substitutes `that' for the first + occurrence of `this'. :gs/this/that substitutes `that' + for each occurrence of `this'. :& repeats the last + substitution. :g& repeats the last substitution + globally. */ + + case '&': + case 's': + { + char *new_event; + int delimiter, failed, si, l_temp, ws, we; + + if (c == 's') + { + if (i + 2 < (int)strlen (string)) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + _rl_adjust_point (string, i + 2, &ps); + if (_rl_get_char_len (string + i + 2, &ps) > 1) + delimiter = 0; + else + delimiter = string[i + 2]; + } + else +#endif /* HANDLE_MULTIBYTE */ + delimiter = string[i + 2]; + } + else + break; /* no search delimiter */ + + i += 3; + + t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len); + /* An empty substitution lhs with no previous substitution + uses the last search string as the lhs. */ + if (t) + { + FREE (subst_lhs); + subst_lhs = t; + } + else if (!subst_lhs) + { + if (search_string && *search_string) + { + subst_lhs = savestring (search_string); + subst_lhs_len = strlen (subst_lhs); + } + else + { + subst_lhs = (char *) NULL; + subst_lhs_len = 0; + } + } + + FREE (subst_rhs); + subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len); + + /* If `&' appears in the rhs, it's supposed to be replaced + with the lhs. */ + if (member ('&', subst_rhs)) + postproc_subst_rhs (); + } + else + i += 2; + + /* If there is no lhs, the substitution can't succeed. */ + if (subst_lhs_len == 0) + { + *ret_string = hist_error (string, starting_index, i, NO_PREV_SUBST); + xfree (result); + xfree (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); + xfree (result); + xfree (temp); + return (-1); + } + + /* Find the first occurrence of THIS in TEMP. */ + /* Substitute SUBST_RHS for SUBST_LHS in TEMP. There are three + cases to consider: + + 1. substitute_globally == subst_bywords == 0 + 2. substitute_globally == 1 && subst_bywords == 0 + 3. substitute_globally == 0 && subst_bywords == 1 + + In the first case, we substitute for the first occurrence only. + In the second case, we substitute for every occurrence. + In the third case, we tokenize into words and substitute the + first occurrence of each word. */ + + si = we = 0; + for (failed = 1; (si + subst_lhs_len) <= l_temp; si++) + { + /* First skip whitespace and find word boundaries if + we're past the end of the word boundary we found + the last time. */ + if (subst_bywords && si > we) + { + for (; temp[si] && fielddelim (temp[si]); si++) + ; + ws = si; + we = history_tokenize_word (temp, si); + } + + if (STREQN (temp+si, subst_lhs, subst_lhs_len)) + { + int len = subst_rhs_len - subst_lhs_len + l_temp; + new_event = (char *)xmalloc (1 + len); + strncpy (new_event, temp, si); + strncpy (new_event + si, subst_rhs, subst_rhs_len); + strncpy (new_event + si + subst_rhs_len, + temp + si + subst_lhs_len, + l_temp - (si + subst_lhs_len)); + new_event[len] = '\0'; + xfree (temp); + temp = new_event; + + failed = 0; + + if (substitute_globally) + { + /* Reported to fix a bug that causes it to skip every + other match when matching a single character. Was + si += subst_rhs_len previously. */ + si += subst_rhs_len - 1; + l_temp = strlen (temp); + substitute_globally++; + continue; + } + else if (subst_bywords) + { + si = we; + l_temp = strlen (temp); + continue; + } + else + break; + } + } + + if (substitute_globally > 1) + { + substitute_globally = 0; + continue; /* don't want to increment i */ + } + + if (failed == 0) + continue; /* don't want to increment i */ + + *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); + xfree (result); + xfree (temp); + return (-1); + } + } + i += 2; + } + /* Done with modifiers. */ + /* Believe it or not, we have to back the pointer up by one. */ + --i; + + if (want_quotes) + { + char *x; + + if (want_quotes == 'q') + x = sh_single_quote (temp); + else if (want_quotes == 'x') + x = quote_breaks (temp); + else + x = savestring (temp); + + xfree (temp); + temp = x; + } + + n = strlen (temp); + if (n >= result_len) + result = (char *)xrealloc (result, n + 2); + strcpy (result, temp); + xfree (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 occurred in expansion, then OUTPUT contains a descriptive + error message. */ + +#define ADD_STRING(s) \ + do \ + { \ + int sl = strlen (s); \ + j += sl; \ + if (j >= result_len) \ + { \ + while (j >= result_len) \ + result_len += 128; \ + result = (char *)xrealloc (result, result_len); \ + } \ + strcpy (result + j - sl, s); \ + } \ + while (0) + +#define ADD_CHAR(c) \ + do \ + { \ + if (j >= result_len - 1) \ + result = (char *)xrealloc (result, result_len += 64); \ + result[j++] = c; \ + result[j] = '\0'; \ + } \ + while (0) + +int +history_expand (char *hstring, char **output) +{ + register int j; + int i, r, l, passc, cc, modified, eindex, only_printing, dquote, squote, flag; + char *string; + + /* The output string, and its length. */ + int result_len; + char *result; + +#if defined (HANDLE_MULTIBYTE) + char mb[MB_LEN_MAX]; + mbstate_t ps; +#endif + + /* Used when adding the string. */ + char *temp; + + if (output == 0) + return 0; + + /* Setting the history expansion character to 0 inhibits all + history expansion. */ + if (history_expansion_char == 0) + { + *output = savestring (hstring); + return (0); + } + + /* Prepare the buffer for printing error messages. */ + result = (char *)xmalloc (result_len = 256); + result[0] = '\0'; + + only_printing = modified = 0; + l = strlen (hstring); + + /* Grovel the string. Only backslash and single quotes can quote the + history escape character. We also handle arg specifiers. */ + + /* Before we grovel forever, see if the history_expansion_char appears + anywhere within the text. */ + + /* The quick substitution character is a history expansion all right. That + is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact, + that is the substitution that we do. */ + if (hstring[0] == history_subst_char) + { + string = (char *)xmalloc (l + 5); + + string[0] = string[1] = history_expansion_char; + string[2] = ':'; + string[3] = 's'; + strcpy (string + 4, hstring); + l += 4; + } + else + { +#if defined (HANDLE_MULTIBYTE) + memset (&ps, 0, sizeof (mbstate_t)); +#endif + + string = hstring; + /* If not quick substitution, still maybe have to do expansion. */ + + /* `!' followed by one of the characters in history_no_expand_chars + is NOT an expansion. */ + dquote = history_quoting_state == '"'; + squote = history_quoting_state == '\''; + + /* If the calling application tells us we are already reading a + single-quoted string, consume the rest of the string right now + and then go on. */ + i = 0; + if (squote && history_quotes_inhibit_expansion) + { + hist_string_extract_single_quoted (string, &i, 0); + squote = 0; + if (string[i]) + i++; + } + + for ( ; string[i]; i++) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int v; + v = _rl_get_char_len (string + i, &ps); + if (v > 1) + { + i += v - 1; + continue; + } + } +#endif /* HANDLE_MULTIBYTE */ + + cc = string[i + 1]; + /* The history_comment_char, if set, appearing at the beginning + of a word signifies that the rest of the line should not have + history expansion performed on it. + Skip the rest of the line and break out of the loop. */ + if (history_comment_char && string[i] == history_comment_char && + dquote == 0 && + (i == 0 || member (string[i - 1], history_word_delimiters))) + { + while (string[i]) + i++; + break; + } + else if (string[i] == history_expansion_char) + { + if (cc == 0 || member (cc, history_no_expand_chars)) + continue; + /* DQUOTE won't be set unless history_quotes_inhibit_expansion + is set. The idea here is to treat double-quoted strings the + same as the word outside double quotes; in effect making the + double quote part of history_no_expand_chars when DQUOTE is + set. */ + else if (dquote && cc == '"') + continue; + /* If the calling application has set + history_inhibit_expansion_function to a function that checks + for special cases that should not be history expanded, + call the function and skip the expansion if it returns a + non-zero value. */ + else if (history_inhibit_expansion_function && + (*history_inhibit_expansion_function) (string, i)) + continue; + else + break; + } + /* Shell-like quoting: allow backslashes to quote double quotes + inside a double-quoted string. */ + else if (dquote && string[i] == '\\' && cc == '"') + i++; + /* More shell-like quoting: if we're paying attention to single + quotes and letting them quote the history expansion character, + then we need to pay attention to double quotes, because single + quotes are not special inside double-quoted strings. */ + else if (history_quotes_inhibit_expansion && string[i] == '"') + { + dquote = 1 - dquote; + } + else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'') + { + /* If this is bash, single quotes inhibit history expansion. */ + flag = (i > 0 && string[i - 1] == '$'); + i++; + hist_string_extract_single_quoted (string, &i, flag); + } + 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) + { + xfree (result); + *output = savestring (string); + return (0); + } + } + + /* Extract and perform the substitution. */ + dquote = history_quoting_state == '"'; + squote = history_quoting_state == '\''; + + /* If the calling application tells us we are already reading a + single-quoted string, consume the rest of the string right now + and then go on. */ + i = j = 0; + if (squote && history_quotes_inhibit_expansion) + { + int c; + + hist_string_extract_single_quoted (string, &i, 0); + squote = 0; + for (c = 0; c < i; c++) + ADD_CHAR (string[c]); + if (string[i]) + { + ADD_CHAR (string[i]); + i++; + } + } + + for (passc = 0; i < l; i++) + { + int qc, tchar = string[i]; + + if (passc) + { + passc = 0; + ADD_CHAR (tchar); + continue; + } + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int k, c; + + c = tchar; + memset (mb, 0, sizeof (mb)); + for (k = 0; k < MB_LEN_MAX; k++) + { + mb[k] = (char)c; + memset (&ps, 0, sizeof (mbstate_t)); + if (_rl_get_char_len (mb, &ps) == -2) + c = string[++i]; + else + break; + } + if (strlen (mb) > 1) + { + ADD_STRING (mb); + continue; + } + } +#endif /* HANDLE_MULTIBYTE */ + + if (tchar == history_expansion_char) + tchar = -3; + else if (tchar == history_comment_char) + tchar = -2; + + switch (tchar) + { + default: + ADD_CHAR (string[i]); + break; + + case '\\': + passc++; + ADD_CHAR (tchar); + break; + + case '"': + dquote = 1 - dquote; + ADD_CHAR (tchar); + break; + + case '\'': + { + /* If history_quotes_inhibit_expansion is set, single quotes + inhibit history expansion, otherwise they are treated like + double quotes. */ + if (squote) + { + squote = 0; + ADD_CHAR (tchar); + } + else if (dquote == 0 && history_quotes_inhibit_expansion) + { + int quote, slen; + + flag = (i > 0 && string[i - 1] == '$'); + quote = i++; + hist_string_extract_single_quoted (string, &i, flag); + + slen = i - quote + 2; + temp = (char *)xmalloc (slen); + strncpy (temp, string + quote, slen); + temp[slen - 1] = '\0'; + ADD_STRING (temp); + xfree (temp); + } + else if (dquote == 0 && squote == 0 && history_quotes_inhibit_expansion == 0) + { + squote = 1; + ADD_CHAR (string[i]); + } + else + ADD_CHAR (string[i]); + break; + } + + case -2: /* history_comment_char */ + if ((dquote == 0 || history_quotes_inhibit_expansion == 0) && + (i == 0 || member (string[i - 1], history_word_delimiters))) + { + temp = (char *)xmalloc (l - i + 1); + strcpy (temp, string + i); + ADD_STRING (temp); + xfree (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 (cc == 0 || member (cc, history_no_expand_chars) || + (dquote && cc == '"')) + { + ADD_CHAR (string[i]); + break; + } + + /* If the application has defined a function to determine whether + or not a history expansion should be performed, call it here. */ + /* We check against what we've expanded so far, with the current + expansion appended, because that seems to be what csh does. We + decide to expand based on what we have to this point, not what + we started with. */ + if (history_inhibit_expansion_function) + { + int save_j, temp; + + save_j = j; + ADD_CHAR (string[i]); + ADD_CHAR (cc); + + temp = (*history_inhibit_expansion_function) (result, save_j); + if (temp) + { + result[--j] = '\0'; /* `unadd' cc, leaving ADD_CHAR(string[i]) */ + break; + } + else + result[j = save_j] = '\0'; + } + +#if defined (NO_BANG_HASH_MODIFIERS) + /* There is something that is listed as a `word specifier' in csh + documentation which means `the expanded text to this point'. + That is not a word specifier, it is an event specifier. If we + don't want to allow modifiers with `!#', just stick the current + output line in again. */ + if (cc == '#') + { + if (result) + { + temp = (char *)xmalloc (1 + strlen (result)); + strcpy (temp, result); + ADD_STRING (temp); + xfree (temp); + } + i++; + break; + } +#endif + qc = squote ? '\'' : (dquote ? '"' : 0); + r = history_expand_internal (string, i, qc, &eindex, &temp, result); + if (r < 0) + { + *output = temp; + xfree (result); + if (string != hstring) + xfree (string); + return -1; + } + else + { + if (temp) + { + modified++; + if (*temp) + ADD_STRING (temp); + xfree (temp); + } + only_printing += r == 1; + i = eindex; + } + break; + } + } + + *output = result; + if (string != hstring) + xfree (string); + + if (only_printing) + { +#if 0 + add_history (result); +#endif + return (2); + } + + return (modified != 0); +} + +/* Return a consed string which is the word specified in SPEC, and found + in FROM. NULL is returned if there is no spec. The address of + ERROR_POINTER is returned if the word specified cannot be found. + CALLER_INDEX is the offset in SPEC to start looking; it is updated + to point to just after the last character parsed. */ +static char * +get_history_word_specifier (char *spec, char *from, int *caller_index) +{ + register int i = *caller_index; + int first, last; + int expecting_word_spec = 0; + char *result; + + /* The range of words to return doesn't exist yet. */ + first = last = 0; + result = (char *)NULL; + + /* If we found a colon, then this *must* be a word specification. If + it isn't, then it is an error. */ + if (spec[i] == ':') + { + i++; + expecting_word_spec++; + } + + /* Handle special cases first. */ + + /* `%' is the word last searched for. */ + if (spec[i] == '%') + { + *caller_index = i + 1; + return (search_match ? savestring (search_match) : savestring ("")); + } + + /* `*' matches all of the arguments, but not the command. */ + if (spec[i] == '*') + { + *caller_index = i + 1; + result = history_arg_extract (1, '$', from); + return (result ? result : savestring ("")); + } + + /* `$' is last arg. */ + if (spec[i] == '$') + { + *caller_index = i + 1; + return (history_arg_extract ('$', '$', from)); + } + + /* Try to get FIRST and LAST figured out. */ + + if (spec[i] == '-') + first = 0; + else if (spec[i] == '^') + { + first = 1; + i++; + } + else if (_rl_digit_p (spec[i]) && expecting_word_spec) + { + for (first = 0; _rl_digit_p (spec[i]); i++) + first = (first * 10) + _rl_digit_value (spec[i]); + } + else + return ((char *)NULL); /* no valid `first' for word specifier */ + + if (spec[i] == '^' || spec[i] == '*') + { + last = (spec[i] == '^') ? 1 : '$'; /* x* abbreviates x-$ */ + i++; + } + else if (spec[i] != '-') + last = first; + else + { + i++; + + if (_rl_digit_p (spec[i])) + { + for (last = 0; _rl_digit_p (spec[i]); i++) + last = (last * 10) + _rl_digit_value (spec[i]); + } + else if (spec[i] == '$') + { + i++; + last = '$'; + } + else if (spec[i] == '^') + { + i++; + last = 1; + } +#if 0 + else if (!spec[i] || spec[i] == ':') + /* check against `:' because there could be a modifier separator */ +#else + else + /* csh seems to allow anything to terminate the word spec here, + leaving it as an abbreviation. */ +#endif + last = -1; /* x- abbreviates x-$ omitting word `$' */ + } + + *caller_index = i; + + if (last >= first || last == '$' || last < 0) + result = history_arg_extract (first, last, from); + + return (result ? result : (char *)&error_pointer); +} + +/* Extract the args specified, starting at FIRST, and ending at LAST. + The args are taken from STRING. If either FIRST or LAST is < 0, + then make that arg count from the right (subtract from the number of + tokens, so that FIRST = -1 means the next to last token on the line). + If LAST is `$' the last arg from STRING is used. */ +char * +history_arg_extract (int first, int last, const char *string) +{ + register int i, len; + char *result; + int size, offset; + char **list; + + /* XXX - think about making history_tokenize return a struct array, + each struct in array being a string and a length to avoid the + calls to strlen below. */ + if ((list = history_tokenize (string)) == NULL) + return ((char *)NULL); + + for (len = 0; list[len]; len++) + ; + + if (last < 0) + last = len + last - 1; + + if (first < 0) + first = len + first - 1; + + if (last == '$') + last = len - 1; + + if (first == '$') + first = len - 1; + + last++; + + if (first >= len || last > len || first < 0 || last < 0 || first > last) + result = ((char *)NULL); + else + { + for (size = 0, i = first; i < last; i++) + size += strlen (list[i]) + 1; + result = (char *)xmalloc (size + 1); + result[0] = '\0'; + + for (i = first, offset = 0; i < last; i++) + { + strcpy (result + offset, list[i]); + offset += strlen (list[i]); + if (i + 1 < last) + { + result[offset++] = ' '; + result[offset] = 0; + } + } + } + + for (i = 0; i < len; i++) + xfree (list[i]); + xfree (list); + + return (result); +} + +static int +history_tokenize_word (const char *string, int ind) +{ + register int i, j; + int delimiter, nestdelim, delimopen; + + i = ind; + delimiter = nestdelim = 0; + + if (member (string[i], "()\n")) /* XXX - included \n, but why? been here forever */ + { + i++; + return i; + } + + if (ISDIGIT (string[i])) + { + j = i; + while (string[j] && ISDIGIT (string[j])) + j++; + if (string[j] == 0) + return (j); + if (string[j] == '<' || string[j] == '>') + i = j; /* digit sequence is a file descriptor */ + else + { + i = j; + goto get_word; /* digit sequence is part of a word */ + } + } + + if (member (string[i], "<>;&|")) + { + int peek = string[i + 1]; + + if (peek == string[i]) + { + if (peek == '<' && string[i + 2] == '-') + i++; + else if (peek == '<' && string[i + 2] == '<') + i++; + i += 2; + return i; + } + else if (peek == '&' && (string[i] == '>' || string[i] == '<')) + { + j = i + 2; + while (string[j] && ISDIGIT (string[j])) /* file descriptor */ + j++; + if (string[j] =='-') /* <&[digits]-, >&[digits]- */ + j++; + return j; + } + else if ((peek == '>' && string[i] == '&') || (peek == '|' && string[i] == '>')) + { + i += 2; + return i; + } + /* XXX - process substitution -- separated out for later -- bash-4.2 */ + else if (peek == '(' && (string[i] == '>' || string[i] == '<')) /*)*/ + { + i += 2; + delimopen = '('; + delimiter = ')'; + nestdelim = 1; + goto get_word; + } + + i++; + return i; + } + +get_word: + /* Get word from string + i; */ + + if (delimiter == 0 && 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; + } + + /* delimiter must be set and set to something other than a quote if + nestdelim is set, so these tests are safe. */ + if (nestdelim && string[i] == delimopen) + { + nestdelim++; + continue; + } + if (nestdelim && string[i] == delimiter) + { + nestdelim--; + if (nestdelim == 0) + delimiter = 0; + continue; + } + + if (delimiter && string[i] == delimiter) + { + delimiter = 0; + continue; + } + + /* Command and process substitution; shell extended globbing patterns */ + if (nestdelim == 0 && delimiter == 0 && member (string[i], "<>$!@?+*") && string[i+1] == '(') /*)*/ + { + i += 2; + delimopen = '('; + delimiter = ')'; + nestdelim = 1; + continue; + } + + if (delimiter == 0 && (member (string[i], history_word_delimiters))) + break; + + if (delimiter == 0 && member (string[i], HISTORY_QUOTE_CHARACTERS)) + delimiter = string[i]; + } + + return i; +} + +static char * +history_substring (const char *string, int start, int end) +{ + register int len; + register char *result; + + len = end - start; + result = (char *)xmalloc (len + 1); + strncpy (result, string + start, len); + result[len] = '\0'; + return result; +} + +/* Parse STRING into tokens and return an array of strings. If WIND is + not -1 and INDP is not null, we also want the word surrounding index + WIND. The position in the returned array of strings is returned in + *INDP. */ +static char ** +history_tokenize_internal (const char *string, int wind, int *indp) +{ + char **result; + register int i, start, result_index, size; + + /* If we're searching for a string that's not part of a word (e.g., " "), + make sure we set *INDP to a reasonable value. */ + if (indp && wind != -1) + *indp = -1; + + /* Get a token, and stuff it into RESULT. The tokens are split + exactly where the shell would split them. */ + for (i = result_index = size = 0, result = (char **)NULL; string[i]; ) + { + /* Skip leading whitespace. */ + for (; string[i] && fielddelim (string[i]); i++) + ; + if (string[i] == 0 || string[i] == history_comment_char) + return (result); + + start = i; + + i = history_tokenize_word (string, start); + + /* If we have a non-whitespace delimiter character (which would not be + skipped by the loop above), use it and any adjacent delimiters to + make a separate field. Any adjacent white space will be skipped the + next time through the loop. */ + if (i == start && history_word_delimiters) + { + i++; + while (string[i] && member (string[i], history_word_delimiters)) + i++; + } + + /* If we are looking for the word in which the character at a + particular index falls, remember it. */ + if (indp && wind != -1 && wind >= start && wind < i) + *indp = result_index; + + if (result_index + 2 >= size) + result = (char **)xrealloc (result, ((size += 10) * sizeof (char *))); + + result[result_index++] = history_substring (string, start, i); + result[result_index] = (char *)NULL; + } + + return (result); +} + +/* Return an array of tokens, much as the shell might. The tokens are + parsed out of STRING. */ +char ** +history_tokenize (const char *string) +{ + return (history_tokenize_internal (string, -1, (int *)NULL)); +} + +/* Free members of WORDS from START to an empty string */ +static void +freewords (char **words, int start) +{ + register int i; + + for (i = start; words[i]; i++) + xfree (words[i]); +} + +/* 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 (char *line, int ind) +{ + char **words, *s; + int i, wind; + + words = history_tokenize_internal (line, ind, &wind); + if (wind == -1 || words == 0) + { + if (words) + freewords (words, 0); + FREE (words); + return ((char *)NULL); + } + s = words[wind]; + for (i = 0; i < wind; i++) + xfree (words[i]); + freewords (words, wind + 1); + xfree (words); + return s; +} diff --git a/histfile.c b/histfile.c new file mode 100644 index 0000000..3bfec55 --- /dev/null +++ b/histfile.c @@ -0,0 +1,833 @@ +/* histfile.c - functions to manipulate the history file. */ + +/* Copyright (C) 1989-2019 Free Software Foundation, Inc. + + This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + + History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + History is distributed in the hope that it will be useful, + but WITHOUT 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 History. If not, see . +*/ + +/* The goal is to make the implementation transparent, so that you + don't have to know what data types are used, just what functions + you can call. I think I have done that. */ + +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# define _XOPEN_SOURCE_EXTENDED 1 +# include +# include +#endif + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_LIMITS_H) +# include +#endif + +#include +#if ! defined (_MINIX) && defined (HAVE_SYS_FILE_H) +# include +#endif +#include "posixstat.h" +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include + +#if defined (__EMX__) +# undef HAVE_MMAP +#endif + +#ifdef HISTORY_USE_MMAP +# include + +# ifdef MAP_FILE +# define MAP_RFLAGS (MAP_FILE|MAP_PRIVATE) +# define MAP_WFLAGS (MAP_FILE|MAP_SHARED) +# else +# define MAP_RFLAGS MAP_PRIVATE +# define MAP_WFLAGS MAP_SHARED +# endif + +# ifndef MAP_FAILED +# define MAP_FAILED ((void *)-1) +# endif + +#endif /* HISTORY_USE_MMAP */ + +#if defined(_WIN32) +# define WIN32_LEAN_AND_MEAN +# include +#endif + +/* 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 +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +#include "history.h" +#include "histlib.h" + +#include "rlshell.h" +#include "xmalloc.h" + +#if !defined (PATH_MAX) +# define PATH_MAX 1024 /* default */ +#endif + +/* history file version; currently unused */ +int history_file_version = 1; + +/* If non-zero, we write timestamps to the history file in history_do_write() */ +int history_write_timestamps = 0; + +/* If non-zero, we assume that a history file that starts with a timestamp + uses timestamp-delimited entries and can include multi-line history + entries. Used by read_history_range */ +int history_multiline_entries = 0; + +/* Immediately after a call to read_history() or read_history_range(), this + will return the number of lines just read from the history file in that + call. */ +int history_lines_read_from_file = 0; + +/* Immediately after a call to write_history() or history_do_write(), this + will return the number of lines just written to the history file in that + call. This also works with history_truncate_file. */ +int history_lines_written_to_file = 0; + +/* Does S look like the beginning of a history timestamp entry? Placeholder + for more extensive tests. */ +#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char && isdigit ((unsigned char)(s)[1]) ) + +static char *history_backupfile (const char *); +static char *history_tempfile (const char *); +static int histfile_backup (const char *, const char *); +static int histfile_restore (const char *, const char *); +static int history_rename (const char *, const char *); + +/* Return the string that should be used in the place of this + filename. This only matters when you don't specify the + filename to read_history (), or write_history (). */ +static char * +history_filename (const char *filename) +{ + char *return_val; + const char *home; + int home_len; + + return_val = filename ? savestring (filename) : (char *)NULL; + + if (return_val) + return (return_val); + + home = sh_get_env_value ("HOME"); +#if defined (_WIN32) + if (home == 0) + home = sh_get_env_value ("APPDATA"); +#endif + + if (home == 0) + return (NULL); + else + home_len = strlen (home); + + return_val = (char *)xmalloc (2 + home_len + 8); /* strlen(".history") == 8 */ + strcpy (return_val, home); + return_val[home_len] = '/'; +#if defined (__MSDOS__) + strcpy (return_val + home_len + 1, "_history"); +#else + strcpy (return_val + home_len + 1, ".history"); +#endif + + return (return_val); +} + +static char * +history_backupfile (const char *filename) +{ + const char *fn; + char *ret, linkbuf[PATH_MAX+1]; + size_t len; + ssize_t n; + struct stat fs; + + fn = filename; +#if defined (HAVE_READLINK) + /* Follow symlink to avoid backing up symlink itself; call will fail if + not a symlink */ + if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0) + { + linkbuf[n] = '\0'; + fn = linkbuf; + } +#endif + + len = strlen (fn); + ret = xmalloc (len + 2); + strcpy (ret, fn); + ret[len] = '-'; + ret[len+1] = '\0'; + return ret; +} + +static char * +history_tempfile (const char *filename) +{ + const char *fn; + char *ret, linkbuf[PATH_MAX+1]; + size_t len; + ssize_t n; + struct stat fs; + int pid; + + fn = filename; +#if defined (HAVE_READLINK) + /* Follow symlink so tempfile created in the same directory as any symlinked + history file; call will fail if not a symlink */ + if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0) + { + linkbuf[n] = '\0'; + fn = linkbuf; + } +#endif + + len = strlen (fn); + ret = xmalloc (len + 11); + strcpy (ret, fn); + + pid = (int)getpid (); + + /* filename-PID.tmp */ + ret[len] = '-'; + ret[len+1] = (pid / 10000 % 10) + '0'; + ret[len+2] = (pid / 1000 % 10) + '0'; + ret[len+3] = (pid / 100 % 10) + '0'; + ret[len+4] = (pid / 10 % 10) + '0'; + ret[len+5] = (pid % 10) + '0'; + strcpy (ret + len + 6, ".tmp"); + + return ret; +} + +/* 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 (const char *filename) +{ + return (read_history_range (filename, 0, -1)); +} + +/* Read a range of lines from FILENAME, adding them to the history list. + Start reading at the FROM'th line and end at the TO'th. If FROM + is zero, start at the beginning. If TO is less than FROM, read + until the end of the file. If FILENAME is NULL, then read from + ~/.history. Returns 0 if successful, or errno if not. */ +int +read_history_range (const char *filename, int from, int to) +{ + register char *line_start, *line_end, *p; + char *input, *buffer, *bufend, *last_ts; + int file, current_line, chars_read, has_timestamps, reset_comment_char; + struct stat finfo; + size_t file_size; +#if defined (EFBIG) + int overflow_errno = EFBIG; +#elif defined (EOVERFLOW) + int overflow_errno = EOVERFLOW; +#else + int overflow_errno = EIO; +#endif + + history_lines_read_from_file = 0; + + buffer = last_ts = (char *)NULL; + input = history_filename (filename); + file = input ? open (input, O_RDONLY|O_BINARY, 0666) : -1; + + if ((file < 0) || (fstat (file, &finfo) == -1)) + goto error_and_exit; + + if (S_ISREG (finfo.st_mode) == 0) + { +#ifdef EFTYPE + errno = EFTYPE; +#else + errno = EINVAL; +#endif + goto error_and_exit; + } + + file_size = (size_t)finfo.st_size; + + /* check for overflow on very large files */ + if (file_size != finfo.st_size || file_size + 1 < file_size) + { + errno = overflow_errno; + goto error_and_exit; + } + + if (file_size == 0) + { + xfree (input); + close (file); + return 0; /* don't waste time if we don't have to */ + } + +#ifdef HISTORY_USE_MMAP + /* We map read/write and private so we can change newlines to NULs without + affecting the underlying object. */ + buffer = (char *)mmap (0, file_size, PROT_READ|PROT_WRITE, MAP_RFLAGS, file, 0); + if ((void *)buffer == MAP_FAILED) + { + errno = overflow_errno; + goto error_and_exit; + } + chars_read = file_size; +#else + buffer = (char *)malloc (file_size + 1); + if (buffer == 0) + { + errno = overflow_errno; + goto error_and_exit; + } + + chars_read = read (file, buffer, file_size); +#endif + if (chars_read < 0) + { + error_and_exit: + if (errno != 0) + chars_read = errno; + else + chars_read = EIO; + if (file >= 0) + close (file); + + FREE (input); +#ifndef HISTORY_USE_MMAP + FREE (buffer); +#endif + + return (chars_read); + } + + close (file); + + /* Set TO to larger than end of file if negative. */ + if (to < 0) + to = chars_read; + + /* Start at beginning of file, work to end. */ + bufend = buffer + chars_read; + *bufend = '\0'; /* null-terminate buffer for timestamp checks */ + current_line = 0; + + /* Heuristic: the history comment character rarely changes, so assume we + have timestamps if the buffer starts with `#[:digit:]' and temporarily + set history_comment_char so timestamp parsing works right */ + reset_comment_char = 0; + if (history_comment_char == '\0' && buffer[0] == '#' && isdigit ((unsigned char)buffer[1])) + { + history_comment_char = '#'; + reset_comment_char = 1; + } + + has_timestamps = HIST_TIMESTAMP_START (buffer); + history_multiline_entries += has_timestamps && history_write_timestamps; + + /* Skip lines until we are at FROM. */ + if (has_timestamps) + last_ts = buffer; + for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++) + if (*line_end == '\n') + { + p = line_end + 1; + /* If we see something we think is a timestamp, continue with this + line. We should check more extensively here... */ + if (HIST_TIMESTAMP_START(p) == 0) + current_line++; + else + last_ts = p; + line_start = p; + /* If we are at the last line (current_line == from) but we have + timestamps (has_timestamps), then line_start points to the + text of the last command, and we need to skip to its end. */ + if (current_line >= from && has_timestamps) + { + for (line_end = p; line_end < bufend && *line_end != '\n'; line_end++) + ; + line_start = (*line_end == '\n') ? line_end + 1 : line_end; + } + } + + /* If there are lines left to gobble, then gobble them now. */ + for (line_end = line_start; line_end < bufend; line_end++) + if (*line_end == '\n') + { + /* Change to allow Windows-like \r\n end of line delimiter. */ + if (line_end > line_start && line_end[-1] == '\r') + line_end[-1] = '\0'; + else + *line_end = '\0'; + + if (*line_start) + { + if (HIST_TIMESTAMP_START(line_start) == 0) + { + if (last_ts == NULL && history_length > 0 && history_multiline_entries) + _hs_append_history_line (history_length - 1, line_start); + else + add_history (line_start); + if (last_ts) + { + add_history_time (last_ts); + last_ts = NULL; + } + } + else + { + last_ts = line_start; + current_line--; + } + } + + current_line++; + + if (current_line >= to) + break; + + line_start = line_end + 1; + } + + history_lines_read_from_file = current_line; + if (reset_comment_char) + history_comment_char = '\0'; + + FREE (input); +#ifndef HISTORY_USE_MMAP + FREE (buffer); +#else + munmap (buffer, file_size); +#endif + + return (0); +} + +/* We need a special version for WIN32 because Windows rename() refuses to + overwrite an existing file. */ +static int +history_rename (const char *old, const char *new) +{ +#if defined (_WIN32) + return (MoveFileEx (old, new, MOVEFILE_REPLACE_EXISTING) == 0 ? -1 : 0); +#else + return (rename (old, new)); +#endif +} + +/* Save FILENAME to BACK, handling case where FILENAME is a symlink + (e.g., ~/.bash_history -> .histfiles/.bash_history.$HOSTNAME) */ +static int +histfile_backup (const char *filename, const char *back) +{ +#if defined (HAVE_READLINK) + char linkbuf[PATH_MAX+1]; + ssize_t n; + + /* Follow to target of symlink to avoid renaming symlink itself */ + if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0) + { + linkbuf[n] = '\0'; + return (history_rename (linkbuf, back)); + } +#endif + return (history_rename (filename, back)); +} + +/* Restore ORIG from BACKUP handling case where ORIG is a symlink + (e.g., ~/.bash_history -> .histfiles/.bash_history.$HOSTNAME) */ +static int +histfile_restore (const char *backup, const char *orig) +{ +#if defined (HAVE_READLINK) + char linkbuf[PATH_MAX+1]; + ssize_t n; + + /* Follow to target of symlink to avoid renaming symlink itself */ + if ((n = readlink (orig, linkbuf, sizeof (linkbuf) - 1)) > 0) + { + linkbuf[n] = '\0'; + return (history_rename (backup, linkbuf)); + } +#endif + return (history_rename (backup, orig)); +} + +/* Should we call chown, based on whether finfo and nfinfo describe different + files with different owners? */ + +#define SHOULD_CHOWN(finfo, nfinfo) \ + (finfo.st_uid != nfinfo.st_uid || finfo.st_gid != nfinfo.st_gid) + +/* Truncate the history file FNAME, leaving only LINES trailing lines. + If FNAME is NULL, then use ~/.history. Writes a new file and renames + it to the original name. Returns 0 on success, errno on failure. */ +int +history_truncate_file (const char *fname, int lines) +{ + char *buffer, *filename, *tempname, *bp, *bp1; /* bp1 == bp+1 */ + int file, chars_read, rv, orig_lines, exists, r; + struct stat finfo, nfinfo; + size_t file_size; + + history_lines_written_to_file = 0; + + buffer = (char *)NULL; + filename = history_filename (fname); + tempname = 0; + file = filename ? open (filename, O_RDONLY|O_BINARY, 0666) : -1; + rv = exists = 0; + + /* Don't try to truncate non-regular files. */ + if (file == -1 || fstat (file, &finfo) == -1) + { + rv = errno; + if (file != -1) + close (file); + goto truncate_exit; + } + exists = 1; + + nfinfo.st_uid = finfo.st_uid; + nfinfo.st_gid = finfo.st_gid; + + if (S_ISREG (finfo.st_mode) == 0) + { + close (file); +#ifdef EFTYPE + rv = EFTYPE; +#else + rv = EINVAL; +#endif + goto truncate_exit; + } + + file_size = (size_t)finfo.st_size; + + /* check for overflow on very large files */ + if (file_size != finfo.st_size || file_size + 1 < file_size) + { + close (file); +#if defined (EFBIG) + rv = errno = EFBIG; +#elif defined (EOVERFLOW) + rv = errno = EOVERFLOW; +#else + rv = errno = EINVAL; +#endif + goto truncate_exit; + } + + buffer = (char *)malloc (file_size + 1); + if (buffer == 0) + { + rv = errno; + close (file); + goto truncate_exit; + } + + chars_read = read (file, buffer, file_size); + close (file); + + if (chars_read <= 0) + { + rv = (chars_read < 0) ? errno : 0; + goto truncate_exit; + } + + orig_lines = lines; + /* Count backwards from the end of buffer until we have passed + LINES lines. bp1 is set funny initially. But since bp[1] can't + be a comment character (since it's off the end) and *bp can't be + both a newline and the history comment character, it should be OK. */ + for (bp1 = bp = buffer + chars_read - 1; lines && bp > buffer; bp--) + { + if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0) + lines--; + bp1 = bp; + } + + /* If this is the first line, then the file contains exactly the + number of lines we want to truncate to, so we don't need to do + anything. It's the first line if we don't find a newline between + the current value of i and 0. Otherwise, write from the start of + this line until the end of the buffer. */ + for ( ; bp > buffer; bp--) + { + if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0) + { + bp++; + break; + } + bp1 = bp; + } + + /* Write only if there are more lines in the file than we want to + truncate to. */ + if (bp <= buffer) + { + rv = 0; + /* No-op if LINES == 0 at this point */ + history_lines_written_to_file = orig_lines - lines; + goto truncate_exit; + } + + tempname = history_tempfile (filename); + + if ((file = open (tempname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0600)) != -1) + { + if (write (file, bp, chars_read - (bp - buffer)) < 0) + rv = errno; + + if (fstat (file, &nfinfo) < 0 && rv == 0) + rv = errno; + + if (close (file) < 0 && rv == 0) + rv = errno; + } + else + rv = errno; + + truncate_exit: + FREE (buffer); + + history_lines_written_to_file = orig_lines - lines; + + if (rv == 0 && filename && tempname) + rv = histfile_restore (tempname, filename); + + if (rv != 0) + { + rv = errno; + if (tempname) + unlink (tempname); + history_lines_written_to_file = 0; + } + +#if defined (HAVE_CHOWN) + /* Make sure the new filename is owned by the same user as the old. If one + user is running this, it's a no-op. If the shell is running after sudo + with a shared history file, we don't want to leave the history file + owned by root. */ + if (rv == 0 && exists && SHOULD_CHOWN (finfo, nfinfo)) + r = chown (filename, finfo.st_uid, finfo.st_gid); +#endif + + xfree (filename); + FREE (tempname); + + return rv; +} + +/* Workhorse function for writing history. Writes the last 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 (const char *filename, int nelements, int overwrite) +{ + register int i; + char *output, *tempname, *histname; + int file, mode, rv, exists; + struct stat finfo, nfinfo; +#ifdef HISTORY_USE_MMAP + size_t cursize; + + history_lines_written_to_file = 0; + + mode = overwrite ? O_RDWR|O_CREAT|O_TRUNC|O_BINARY : O_RDWR|O_APPEND|O_BINARY; +#else + mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY; +#endif + histname = history_filename (filename); + exists = histname ? (stat (histname, &finfo) == 0) : 0; + + tempname = (overwrite && exists && S_ISREG (finfo.st_mode)) ? history_tempfile (histname) : 0; + output = tempname ? tempname : histname; + + file = output ? open (output, mode, 0600) : -1; + rv = 0; + + if (file == -1) + { + rv = errno; + FREE (histname); + FREE (tempname); + return (rv); + } + +#ifdef HISTORY_USE_MMAP + cursize = overwrite ? 0 : lseek (file, 0, SEEK_END); +#endif + + if (nelements > history_length) + nelements = history_length; + + /* Build a buffer of all the lines to write, and write them in one syscall. + Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */ + { + HIST_ENTRY **the_history; /* local */ + register int j; + int buffer_size; + char *buffer; + + the_history = history_list (); + /* Calculate the total number of bytes to write. */ + for (buffer_size = 0, i = history_length - nelements; i < history_length; i++) + { + if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) + buffer_size += strlen (the_history[i]->timestamp) + 1; + buffer_size += strlen (the_history[i]->line) + 1; + } + + /* Allocate the buffer, and fill it. */ +#ifdef HISTORY_USE_MMAP + if (ftruncate (file, buffer_size+cursize) == -1) + goto mmap_error; + buffer = (char *)mmap (0, buffer_size, PROT_READ|PROT_WRITE, MAP_WFLAGS, file, cursize); + if ((void *)buffer == MAP_FAILED) + { +mmap_error: + rv = errno; + close (file); + if (tempname) + unlink (tempname); + FREE (histname); + FREE (tempname); + return rv; + } +#else + buffer = (char *)malloc (buffer_size); + if (buffer == 0) + { + rv = errno; + close (file); + if (tempname) + unlink (tempname); + FREE (histname); + FREE (tempname); + return rv; + } +#endif + + for (j = 0, i = history_length - nelements; i < history_length; i++) + { + if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) + { + strcpy (buffer + j, the_history[i]->timestamp); + j += strlen (the_history[i]->timestamp); + buffer[j++] = '\n'; + } + strcpy (buffer + j, the_history[i]->line); + j += strlen (the_history[i]->line); + buffer[j++] = '\n'; + } + +#ifdef HISTORY_USE_MMAP + if (msync (buffer, buffer_size, MS_ASYNC) != 0 || munmap (buffer, buffer_size) != 0) + rv = errno; +#else + if (write (file, buffer, buffer_size) < 0) + rv = errno; + xfree (buffer); +#endif + } + + history_lines_written_to_file = nelements; + + if (close (file) < 0 && rv == 0) + rv = errno; + + if (rv == 0 && histname && tempname) + rv = histfile_restore (tempname, histname); + + if (rv != 0) + { + rv = errno; + if (tempname) + unlink (tempname); + history_lines_written_to_file = 0; + } + +#if defined (HAVE_CHOWN) + /* Make sure the new filename is owned by the same user as the old. If one + user is running this, it's a no-op. If the shell is running after sudo + with a shared history file, we don't want to leave the history file + owned by root. */ + if (rv == 0 && exists) + mode = chown (histname, finfo.st_uid, finfo.st_gid); +#endif + + FREE (histname); + FREE (tempname); + + return (rv); +} + +/* Append NELEMENT entries to FILENAME. The entries appended are from + the end of the list minus NELEMENTs up to the end of the list. */ +int +append_history (int nelements, const char *filename) +{ + return (history_do_write (filename, nelements, HISTORY_APPEND)); +} + +/* Overwrite FILENAME with the current history. If FILENAME is NULL, + then write the history list to ~/.history. Values returned + are as in read_history ().*/ +int +write_history (const char *filename) +{ + return (history_do_write (filename, history_length, HISTORY_OVERWRITE)); +} diff --git a/histlib.h b/histlib.h new file mode 100644 index 0000000..29fc4d2 --- /dev/null +++ b/histlib.h @@ -0,0 +1,92 @@ +/* histlib.h -- internal definitions for the history library. */ + +/* Copyright (C) 1989-2009,2021-2022 Free Software Foundation, Inc. + + This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + + History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + History is distributed in the hope that it will be useful, + but WITHOUT 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 History. If not, see . +*/ + +#if !defined (_HISTLIB_H_) +#define _HISTLIB_H_ + +#if defined (HAVE_STRING_H) +# include +#else +# include +#endif /* !HAVE_STRING_H */ + +#if !defined (STREQ) +#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) +#define STREQN(a, b, n) (((n) == 0) ? (1) \ + : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) +#endif + +#ifndef savestring +#define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x)) +#endif + +#ifndef whitespace +#define whitespace(c) (((c) == ' ') || ((c) == '\t')) +#endif + +#ifndef _rl_digit_p +#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') +#endif + +#ifndef _rl_digit_value +#define _rl_digit_value(c) ((c) - '0') +#endif + +#ifndef member +# if !defined (strchr) && !defined (__STDC__) +extern char *strchr (); +# endif /* !strchr && !__STDC__ */ +#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 NON_ANCHORED_SEARCH 0 +#define ANCHORED_SEARCH 0x01 +#define PATTERN_SEARCH 0x02 + +/* Possible definitions for what style of writing the history file we want. */ +#define HISTORY_APPEND 0 +#define HISTORY_OVERWRITE 1 + +/* internal extern function declarations used by other parts of the library */ + +/* histsearch.c */ +extern int _hs_history_patsearch (const char *, int, int); + +/* history.c */ +extern void _hs_replace_history_data (int, histdata_t *, histdata_t *); +extern int _hs_at_end_of_history (void); + +/* histfile.c */ +extern void _hs_append_history_line (int, const char *); + +#endif /* !_HISTLIB_H_ */ diff --git a/history.c b/history.c new file mode 100644 index 0000000..81d4c16 --- /dev/null +++ b/history.c @@ -0,0 +1,614 @@ +/* history.c -- standalone history library */ + +/* Copyright (C) 1989-2021 Free Software Foundation, Inc. + + This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + + History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + History is distributed in the hope that it will be useful, + but WITHOUT 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 History. If not, see . +*/ + +/* 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 +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include + +#include "history.h" +#include "histlib.h" + +#include "xmalloc.h" + +#if !defined (errno) +extern int errno; +#endif + +/* How big to make the_history when we first allocate it. */ +#define DEFAULT_HISTORY_INITIAL_SIZE 502 + +#define MAX_HISTORY_INITIAL_SIZE 8192 + +/* The number of slots to increase the_history by. */ +#define DEFAULT_HISTORY_GROW_SIZE 50 + +static char *hist_inittime (void); + +/* **************************************************************** */ +/* */ +/* History Functions */ +/* */ +/* **************************************************************** */ + +/* An array of HIST_ENTRY. This is where we store the history. */ +static HIST_ENTRY **the_history = (HIST_ENTRY **)NULL; + +/* Non-zero means that we have enforced a limit on the amount of + history that we save. */ +static int history_stifled; + +/* The current number of slots allocated to the input_history. */ +static int history_size; + +/* If HISTORY_STIFLED is non-zero, then this is the maximum number of + entries to remember. */ +int history_max_entries; +int max_input_history; /* backwards compatibility */ + +/* The current location of the interactive history pointer. Just makes + life easier for outside callers. */ +int history_offset; + +/* The number of strings currently stored in the history list. */ +int history_length; + +/* The logical `base' of the history array. It defaults to 1. */ +int history_base = 1; + +/* Return the current HISTORY_STATE of the history. */ +HISTORY_STATE * +history_get_history_state (void) +{ + 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 (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 (void) +{ + history_offset = history_length; +} + +/* Return the number of bytes that the primary history entries are using. + This just adds up the lengths of the_history->lines and the associated + timestamps. */ +int +history_total_bytes (void) +{ + register int i, result; + + for (i = result = 0; the_history && the_history[i]; i++) + result += HISTENT_BYTES (the_history[i]); + + return (result); +} + +/* Returns the magic number which says what history element we are + looking at now. In this implementation, it returns history_offset. */ +int +where_history (void) +{ + 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 (int pos) +{ + if (pos > history_length || pos < 0 || !the_history) + return (0); + history_offset = pos; + return (1); +} + +/* Are we currently at the end of the history list? */ +int +_hs_at_end_of_history (void) +{ + return (the_history == 0 || history_offset == history_length); +} + +/* Return the current history array. The caller has to be careful, 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 (void) +{ + 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 (void) +{ + 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 (void) +{ + 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 (void) +{ + 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 (int offset) +{ + int local_index; + + local_index = offset - history_base; + return (local_index >= history_length || local_index < 0 || the_history == 0) + ? (HIST_ENTRY *)NULL + : the_history[local_index]; +} + +HIST_ENTRY * +alloc_history_entry (char *string, char *ts) +{ + HIST_ENTRY *temp; + + temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); + + temp->line = string ? savestring (string) : string; + temp->data = (char *)NULL; + temp->timestamp = ts; + + return temp; +} + +time_t +history_get_time (HIST_ENTRY *hist) +{ + char *ts; + time_t t; + + if (hist == 0 || hist->timestamp == 0) + return 0; + ts = hist->timestamp; + if (ts[0] != history_comment_char) + return 0; + errno = 0; + t = (time_t) strtol (ts + 1, (char **)NULL, 10); /* XXX - should use strtol() here */ + if (errno == ERANGE) + return (time_t)0; + return t; +} + +static char * +hist_inittime (void) +{ + time_t t; + char ts[64], *ret; + + t = (time_t) time ((time_t *)0); +#if defined (HAVE_VSNPRINTF) /* assume snprintf if vsnprintf exists */ + snprintf (ts, sizeof (ts) - 1, "X%lu", (unsigned long) t); +#else + sprintf (ts, "X%lu", (unsigned long) t); +#endif + ret = savestring (ts); + ret[0] = history_comment_char; + + return ret; +} + +/* Place STRING at the end of the history list. The data field + is set to NULL. */ +void +add_history (const char *string) +{ + HIST_ENTRY *temp; + int new_length; + + if (history_stifled && (history_length == history_max_entries)) + { + register int i; + + /* If the history is stifled, and history_length is zero, + and it equals history_max_entries, we don't save items. */ + if (history_length == 0) + return; + + /* If there is something in the slot, then remove it. */ + if (the_history[0]) + (void) free_history_entry (the_history[0]); + + /* Copy the rest of the entries, moving down one slot. Copy includes + trailing NULL. */ + memmove (the_history, the_history + 1, history_length * sizeof (HIST_ENTRY *)); + + new_length = history_length; + history_base++; + } + else + { + if (history_size == 0) + { + if (history_stifled && history_max_entries > 0) + history_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE) + ? MAX_HISTORY_INITIAL_SIZE + : history_max_entries + 2; + else + history_size = DEFAULT_HISTORY_INITIAL_SIZE; + the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *)); + new_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 *)); + } + new_length = history_length + 1; + } + } + + temp = alloc_history_entry ((char *)string, hist_inittime ()); + + the_history[new_length] = (HIST_ENTRY *)NULL; + the_history[new_length - 1] = temp; + history_length = new_length; +} + +/* Change the time stamp of the most recent history entry to STRING. */ +void +add_history_time (const char *string) +{ + HIST_ENTRY *hs; + + if (string == 0 || history_length < 1) + return; + hs = the_history[history_length - 1]; + FREE (hs->timestamp); + hs->timestamp = savestring (string); +} + +/* Free HIST and return the data so the calling application can free it + if necessary and desired. */ +histdata_t +free_history_entry (HIST_ENTRY *hist) +{ + histdata_t x; + + if (hist == 0) + return ((histdata_t) 0); + FREE (hist->line); + FREE (hist->timestamp); + x = hist->data; + xfree (hist); + return (x); +} + +HIST_ENTRY * +copy_history_entry (HIST_ENTRY *hist) +{ + HIST_ENTRY *ret; + char *ts; + + if (hist == 0) + return hist; + + ret = alloc_history_entry (hist->line, (char *)NULL); + + ts = hist->timestamp ? savestring (hist->timestamp) : hist->timestamp; + ret->timestamp = ts; + + ret->data = hist->data; + + return ret; +} + +/* Make the history entry at WHICH have LINE and DATA. This returns + the old entry so you can dispose of the data. In the case of an + invalid WHICH, a NULL pointer is returned. */ +HIST_ENTRY * +replace_history_entry (int which, const char *line, histdata_t data) +{ + HIST_ENTRY *temp, *old_value; + + if (which < 0 || which >= history_length) + return ((HIST_ENTRY *)NULL); + + temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); + old_value = the_history[which]; + + temp->line = savestring (line); + temp->data = data; + temp->timestamp = old_value->timestamp ? savestring (old_value->timestamp) : 0; + the_history[which] = temp; + + return (old_value); +} + +/* Append LINE to the history line at offset WHICH, adding a newline to the + end of the current line first. This can be used to construct multi-line + history entries while reading lines from the history file. */ +void +_hs_append_history_line (int which, const char *line) +{ + HIST_ENTRY *hent; + size_t newlen, curlen, minlen; + char *newline; + + hent = the_history[which]; + curlen = strlen (hent->line); + minlen = curlen + strlen (line) + 2; /* min space needed */ + if (curlen > 256) /* XXX - for now */ + { + newlen = 512; /* now realloc in powers of 2 */ + /* we recalcluate every time; the operations are cheap */ + while (newlen < minlen) + newlen <<= 1; + } + else + newlen = minlen; + /* Assume that realloc returns the same pointer and doesn't try a new + alloc/copy if the new size is the same as the one last passed. */ + newline = realloc (hent->line, newlen); + if (newline) + { + hent->line = newline; + hent->line[curlen++] = '\n'; + strcpy (hent->line + curlen, line); + } +} + +/* Replace the DATA in the specified history entries, replacing OLD with + NEW. WHICH says which one(s) to replace: WHICH == -1 means to replace + all of the history entries where entry->data == OLD; WHICH == -2 means + to replace the `newest' history entry where entry->data == OLD; and + WHICH >= 0 means to replace that particular history entry's data, as + long as it matches OLD. */ +void +_hs_replace_history_data (int which, histdata_t *old, histdata_t *new) +{ + HIST_ENTRY *entry; + register int i, last; + + if (which < -2 || which >= history_length || history_length == 0 || the_history == 0) + return; + + if (which >= 0) + { + entry = the_history[which]; + if (entry && entry->data == old) + entry->data = new; + return; + } + + last = -1; + for (i = 0; i < history_length; i++) + { + entry = the_history[i]; + if (entry == 0) + continue; + if (entry->data == old) + { + last = i; + if (which == -1) + entry->data = new; + } + } + if (which == -2 && last >= 0) + { + entry = the_history[last]; + entry->data = new; /* XXX - we don't check entry->old */ + } +} + +/* Remove history element WHICH from the history. The removed + element is returned to you so you can free the line, data, + and containing structure. */ +HIST_ENTRY * +remove_history (int which) +{ + HIST_ENTRY *return_value; + register int i; +#if 1 + int nentries; + HIST_ENTRY **start, **end; +#endif + + if (which < 0 || which >= history_length || history_length == 0 || the_history == 0) + return ((HIST_ENTRY *)NULL); + + return_value = the_history[which]; + +#if 1 + /* Copy the rest of the entries, moving down one slot. Copy includes + trailing NULL. */ + nentries = history_length - which; + start = the_history + which; + end = start + 1; + memmove (start, end, nentries * sizeof (HIST_ENTRY *)); +#else + for (i = which; i < history_length; i++) + the_history[i] = the_history[i + 1]; +#endif + + history_length--; + + return (return_value); +} + +HIST_ENTRY ** +remove_history_range (int first, int last) +{ + HIST_ENTRY **return_value; + register int i; + int nentries; + HIST_ENTRY **start, **end; + + if (the_history == 0 || history_length == 0) + return ((HIST_ENTRY **)NULL); + if (first < 0 || first >= history_length || last < 0 || last >= history_length) + return ((HIST_ENTRY **)NULL); + if (first > last) + return (HIST_ENTRY **)NULL; + + nentries = last - first + 1; + return_value = (HIST_ENTRY **)malloc ((nentries + 1) * sizeof (HIST_ENTRY *)); + if (return_value == 0) + return return_value; + + /* Return all the deleted entries in a list */ + for (i = first ; i <= last; i++) + return_value[i - first] = the_history[i]; + return_value[i - first] = (HIST_ENTRY *)NULL; + + /* Copy the rest of the entries, moving down NENTRIES slots. Copy includes + trailing NULL. */ + start = the_history + first; + end = the_history + last + 1; + memmove (start, end, (history_length - last) * sizeof (HIST_ENTRY *)); + + history_length -= nentries; + + return (return_value); +} + +/* Stifle the history list, remembering only MAX number of lines. */ +void +stifle_history (int max) +{ + register int i, j; + + if (max < 0) + max = 0; + + if (history_length > max) + { + /* This loses because we cannot free the data. */ + for (i = 0, j = history_length - max; i < j; i++) + free_history_entry (the_history[i]); + + history_base = i; + for (j = 0, i = history_length - max; j < max; i++, j++) + the_history[j] = the_history[i]; + the_history[j] = (HIST_ENTRY *)NULL; + history_length = j; + } + + history_stifled = 1; + max_input_history = history_max_entries = max; +} + +/* Stop stifling the history. This returns the previous maximum + number of history entries. The value is positive if the history + was stifled, negative if it wasn't. */ +int +unstifle_history (void) +{ + if (history_stifled) + { + history_stifled = 0; + return (history_max_entries); + } + else + return (-history_max_entries); +} + +int +history_is_stifled (void) +{ + return (history_stifled); +} + +void +clear_history (void) +{ + register int i; + + /* This loses because we cannot free the data. */ + for (i = 0; i < history_length; i++) + { + free_history_entry (the_history[i]); + the_history[i] = (HIST_ENTRY *)NULL; + } + + history_offset = history_length = 0; + history_base = 1; /* reset history base to default */ +} diff --git a/history.h b/history.h new file mode 100644 index 0000000..5208f9a --- /dev/null +++ b/history.h @@ -0,0 +1,291 @@ +/* history.h -- the names of functions that you can call in history. */ + +/* Copyright (C) 1989-2022 Free Software Foundation, Inc. + + This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + + History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + History is distributed in the hope that it will be useful, + but WITHOUT 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 History. If not, see . +*/ + +#ifndef _HISTORY_H_ +#define _HISTORY_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include /* XXX - for history timestamp code */ + +#if defined READLINE_LIBRARY +# include "rlstdc.h" +# include "rltypedefs.h" +#else +# include +# include +#endif + +#ifdef __STDC__ +typedef void *histdata_t; +#else +typedef char *histdata_t; +#endif + +/* Let's not step on anyone else's define for now, since we don't use this yet. */ +#ifndef HS_HISTORY_VERSION +# define HS_HISTORY_VERSION 0x0802 /* History 8.2 */ +#endif + +/* The structure used to store a history entry. */ +typedef struct _hist_entry { + char *line; + char *timestamp; /* char * rather than time_t for read/write */ + histdata_t data; +} HIST_ENTRY; + +/* Size of the history-library-managed space in history entry HS. */ +#define HISTENT_BYTES(hs) (strlen ((hs)->line) + strlen ((hs)->timestamp)) + +/* A structure used to pass the current state of the history stuff around. */ +typedef struct _hist_state { + HIST_ENTRY **entries; /* Pointer to the entries themselves. */ + int offset; /* The location pointer within this array. */ + int length; /* Number of elements within this array. */ + int size; /* Number of slots allocated to this array. */ + int flags; +} HISTORY_STATE; + +/* Flag values for the `flags' member of HISTORY_STATE. */ +#define HS_STIFLED 0x01 + +/* Initialization and state management. */ + +/* Begin a session in which the history functions might be used. This + just initializes the interactive variables. */ +extern void using_history (void); + +/* Return the current HISTORY_STATE of the history. */ +extern HISTORY_STATE *history_get_history_state (void); + +/* Set the state of the current history array to STATE. */ +extern void history_set_history_state (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 (const char *); + +/* Change the timestamp associated with the most recent history entry to + STRING. */ +extern void add_history_time (const char *); + +/* Remove an entry from the history list. WHICH is the magic number that + tells us which element to delete. The elements are numbered from 0. */ +extern HIST_ENTRY *remove_history (int); + +/* Remove a set of entries from the history list: FIRST to LAST, inclusive */ +extern HIST_ENTRY **remove_history_range (int, int); + +/* Allocate a history entry consisting of STRING and TIMESTAMP and return + a pointer to it. */ +extern HIST_ENTRY *alloc_history_entry (char *, char *); + +/* Copy the history entry H, but not the (opaque) data pointer */ +extern HIST_ENTRY *copy_history_entry (HIST_ENTRY *); + +/* Free the history entry H and return any application-specific data + associated with it. */ +extern histdata_t free_history_entry (HIST_ENTRY *); + +/* Make the history entry at WHICH have LINE and DATA. This returns + the old entry so you can dispose of the data. In the case of an + invalid WHICH, a NULL pointer is returned. */ +extern HIST_ENTRY *replace_history_entry (int, const char *, histdata_t); + +/* Clear the history list and start over. */ +extern void clear_history (void); + +/* Stifle the history list, remembering only MAX number of entries. */ +extern void stifle_history (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 (void); + +/* Return 1 if the history is stifled, 0 if it is not. */ +extern int history_is_stifled (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 (void); + +/* Returns the number which says what history element we are now + looking at. */ +extern int where_history (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 (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 (int); + +/* Return the timestamp associated with the HIST_ENTRY * passed as an + argument */ +extern time_t history_get_time (HIST_ENTRY *); + +/* Return the number of bytes that the primary history entries are using. + This just adds up the lengths of the_history->lines. */ +extern int history_total_bytes (void); + +/* Moving around the history list. */ + +/* Set the position in the history list to POS. */ +extern int history_set_pos (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 (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 (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 (const char *, int); + +/* Search the history for STRING, starting at history_offset. + The search is anchored: matching lines must begin with string. + DIRECTION is as in history_search(). */ +extern int history_search_prefix (const char *, int); + +/* Search for STRING in the history list, starting at POS, an + absolute index into the list. DIR, if negative, says to search + backwards from POS, else forwards. + Returns the absolute index of the history element where STRING + was found, or -1 otherwise. */ +extern int history_search_pos (const char *, int, int); + +/* Managing the history file. */ + +/* Add the contents of FILENAME to the history list, a line at a time. + If FILENAME is NULL, then read from ~/.history. Returns 0 if + successful, or errno if not. */ +extern int read_history (const char *); + +/* Read a range of lines from FILENAME, adding them to the history list. + Start reading at the FROM'th line and end at the TO'th. If FROM + is zero, start at the beginning. If TO is less than FROM, read + until the end of the file. If FILENAME is NULL, then read from + ~/.history. Returns 0 if successful, or errno if not. */ +extern int read_history_range (const char *, int, int); + +/* Write the current history to FILENAME. If FILENAME is NULL, + then write the history list to ~/.history. Values returned + are as in read_history (). */ +extern int write_history (const char *); + +/* Append NELEMENT entries to FILENAME. The entries appended are from + the end of the list minus NELEMENTs up to the end of the list. */ +extern int append_history (int, const char *); + +/* Truncate the history file, leaving only the last NLINES lines. */ +extern int history_truncate_file (const char *, int); + +/* History expansion. */ + +/* Expand the string STRING, placing the result into OUTPUT, a pointer + to a string. Returns: + + 0) If no expansions took place (or, if the only change in + the text was the de-slashifying of the history expansion + character) + 1) If expansions did take place + -1) If there was an error in expansion. + 2) If the returned line should just be printed. + + If an error occurred in expansion, then OUTPUT contains a descriptive + error message. */ +extern int history_expand (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 (int, int, const char *); + +/* Return the text of the history event beginning at the current + offset into STRING. Pass STRING with *INDEX equal to the + history_expansion_char that begins this specification. + DELIMITING_QUOTE is a character that is allowed to end the string + specification for what to search for in addition to the normal + characters `:', ` ', `\t', `\n', and sometimes `?'. */ +extern char *get_history_event (const char *, int *, int); + +/* Return an array of tokens, much as the shell might. The tokens are + parsed out of STRING. */ +extern char **history_tokenize (const char *); + +/* Exported history variables. */ +extern int history_base; +extern int history_length; +extern int history_max_entries; +extern int history_offset; + +extern int history_lines_read_from_file; +extern int history_lines_written_to_file; + +extern char history_expansion_char; +extern char history_subst_char; +extern char *history_word_delimiters; +extern char history_comment_char; +extern char *history_no_expand_chars; +extern char *history_search_delimiter_chars; + +extern int history_quotes_inhibit_expansion; +extern int history_quoting_state; + +extern int history_write_timestamps; + +/* These two are undocumented; the second is reserved for future use */ +extern int history_multiline_entries; +extern int history_file_version; + +/* Backwards compatibility */ +extern int max_input_history; + +/* If set, this function is called to decide whether or not a particular + history expansion should be treated as a special case for the calling + application and not expanded. */ +extern rl_linebuf_func_t *history_inhibit_expansion_function; + +#ifdef __cplusplus +} +#endif + +#endif /* !_HISTORY_H_ */ diff --git a/history.pc.in b/history.pc.in new file mode 100644 index 0000000..8a80775 --- /dev/null +++ b/history.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: History +Description: Gnu History library for managing previously-entered lines +URL: http://tiswww.cwru.edu/php/chet/readline/rltop.html +Version: @LIBVERSION@ +Libs: -L${libdir} -lhistory +Cflags: -I${includedir} diff --git a/histsearch.c b/histsearch.c new file mode 100644 index 0000000..b62c06b --- /dev/null +++ b/histsearch.c @@ -0,0 +1,287 @@ +/* histsearch.c -- searching the history list. */ + +/* Copyright (C) 1989, 1992-2009,2017,2021 Free Software Foundation, Inc. + + This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + + History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + History is distributed in the hope that it will be useful, + but WITHOUT 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 History. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#if defined (HAVE_FNMATCH) +# include +#endif + +#include "history.h" +#include "histlib.h" +#include "xmalloc.h" + +/* The list of alternate characters that can delimit a history search + string. */ +char *history_search_delimiter_chars = (char *)NULL; + +static int history_search_internal (const char *, int, int); + +/* Search the history for STRING, starting at history_offset. + If DIRECTION < 0, then the search is through previous entries, else + through subsequent. If ANCHORED is non-zero, the string must + appear at the beginning of a history line, otherwise, the string + may appear anywhere in the line. If the string is found, then + current_history () is the history entry, and the value of this + function is the offset in the line of that history entry that the + string was found in. Otherwise, nothing is changed, and a -1 is + returned. */ + +static int +history_search_internal (const char *string, int direction, int flags) +{ + register int i, reverse; + register char *line; + register int line_index; + int string_len, anchored, patsearch; + HIST_ENTRY **the_history; /* local */ + + i = history_offset; + reverse = (direction < 0); + anchored = (flags & ANCHORED_SEARCH); +#if defined (HAVE_FNMATCH) + patsearch = (flags & PATTERN_SEARCH); +#else + patsearch = 0; +#endif + + /* Take care of trivial cases first. */ + if (string == 0 || *string == '\0') + return (-1); + + if (!history_length || ((i >= history_length) && !reverse)) + return (-1); + + if (reverse && (i >= history_length)) + i = history_length - 1; + +#define NEXT_LINE() do { if (reverse) i--; else i++; } while (0) + + the_history = history_list (); + string_len = strlen (string); + while (1) + { + /* Search each line in the history list for STRING. */ + + /* At limit for direction? */ + if ((reverse && i < 0) || (!reverse && i == history_length)) + return (-1); + + line = the_history[i]->line; + line_index = strlen (line); + + /* If STRING is longer than line, no match. */ + if (patsearch == 0 && (string_len > line_index)) + { + NEXT_LINE (); + continue; + } + + /* Handle anchored searches first. */ + if (anchored == ANCHORED_SEARCH) + { +#if defined (HAVE_FNMATCH) + if (patsearch) + { + if (fnmatch (string, line, 0) == 0) + { + history_offset = i; + return (0); + } + } + else +#endif + if (STREQN (string, line, string_len)) + { + history_offset = i; + return (0); + } + + NEXT_LINE (); + continue; + } + + /* Do substring search. */ + if (reverse) + { + line_index -= (patsearch == 0) ? string_len : 1; + + while (line_index >= 0) + { +#if defined (HAVE_FNMATCH) + if (patsearch) + { + if (fnmatch (string, line + line_index, 0) == 0) + { + history_offset = i; + return (line_index); + } + } + else +#endif + 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 defined (HAVE_FNMATCH) + if (patsearch) + { + if (fnmatch (string, line + line_index, 0) == 0) + { + history_offset = i; + return (line_index); + } + } + else +#endif + if (STREQN (string, line + line_index, string_len)) + { + history_offset = i; + return (line_index); + } + line_index++; + } + } + NEXT_LINE (); + } +} + +int +_hs_history_patsearch (const char *string, int direction, int flags) +{ + char *pat; + size_t len, start; + int ret, unescaped_backslash; + +#if defined (HAVE_FNMATCH) + /* Assume that the string passed does not have a leading `^' and any + anchored search request is captured in FLAGS */ + len = strlen (string); + ret = len - 1; + /* fnmatch is required to reject a pattern that ends with an unescaped + backslash */ + if (unescaped_backslash = (string[ret] == '\\')) + { + while (ret > 0 && string[--ret] == '\\') + unescaped_backslash = 1 - unescaped_backslash; + } + if (unescaped_backslash) + return -1; + pat = (char *)xmalloc (len + 3); + /* If the search string is not anchored, we'll be calling fnmatch (assuming + we have it). Prefix a `*' to the front of the search string so we search + anywhere in the line. */ + if ((flags & ANCHORED_SEARCH) == 0 && string[0] != '*') + { + pat[0] = '*'; + start = 1; + len++; + } + else + { + start = 0; + } + + /* Attempt to reduce the number of searches by tacking a `*' onto the end + of a pattern that doesn't have one. Assume a pattern that ends in a + backslash contains an even number of trailing backslashes; we check + above */ + strcpy (pat + start, string); + if (pat[len - 1] != '*') + { + pat[len] = '*'; /* XXX */ + pat[len+1] = '\0'; + } +#else + pat = string; +#endif + + ret = history_search_internal (pat, direction, flags|PATTERN_SEARCH); + + if (pat != string) + xfree (pat); + return ret; +} + +/* Do a non-anchored search for STRING through the history in DIRECTION. */ +int +history_search (const char *string, int direction) +{ + return (history_search_internal (string, direction, NON_ANCHORED_SEARCH)); +} + +/* Do an anchored search for string through the history in DIRECTION. */ +int +history_search_prefix (const char *string, int direction) +{ + return (history_search_internal (string, direction, ANCHORED_SEARCH)); +} + +/* Search for STRING in the history list. DIR is < 0 for searching + backwards. POS is an absolute index into the history list at + which point to begin searching. */ +int +history_search_pos (const char *string, int dir, int pos) +{ + int ret, old; + + old = where_history (); + history_set_pos (pos); + if (history_search (string, dir) == -1) + { + history_set_pos (old); + return (-1); + } + ret = where_history (); + history_set_pos (old); + return ret; +} diff --git a/input.c b/input.c new file mode 100644 index 0000000..6f038d4 --- /dev/null +++ b/input.c @@ -0,0 +1,1000 @@ +/* input.c -- character input functions for readline. */ + +/* Copyright (C) 1994-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# define _XOPEN_SOURCE_EXTENDED 1 +# define _TANDEM_SOURCE 1 +# include +#endif + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif /* HAVE_SYS_FILE_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +#include "posixselect.h" +#include "posixtime.h" + +#if defined (FIONREAD_IN_SYS_IOCTL) +# include +#endif + +#include +#include + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +/* Some standard library routines. */ +#include "readline.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +/* What kind of non-blocking I/O do we have? */ +#if !defined (O_NDELAY) && defined (O_NONBLOCK) +# define O_NDELAY O_NONBLOCK /* Posix style */ +#endif + +#if defined (HAVE_PSELECT) || defined (HAVE_SELECT) +extern sigset_t _rl_orig_sigset; +#endif + +/* Non-null means it is a pointer to a function to run while waiting for + character input. */ +rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL; + +/* A function to call if a read(2) is interrupted by a signal. */ +rl_hook_func_t *rl_signal_event_hook = (rl_hook_func_t *)NULL; + +/* A function to call when readline times out after a time is specified. */ +rl_hook_func_t *rl_timeout_event_hook = (rl_hook_func_t *)NULL; + +/* A function to replace _rl_input_available for applications using the + callback interface. */ +rl_hook_func_t *rl_input_available_hook = (rl_hook_func_t *)NULL; + +rl_getc_func_t *rl_getc_function = rl_getc; + +static int _keyboard_input_timeout = 100000; /* 0.1 seconds; it's in usec */ + +static int ibuffer_space (void); +static int rl_get_char (int *); +static int rl_gather_tyi (void); + +/* Windows isatty returns true for every character device, including the null + device, so we need to perform additional checks. */ +#if defined (_WIN32) && !defined (__CYGWIN__) +#include +#include +#define WIN32_LEAN_AND_MEAN 1 +#include + +int +win32_isatty (int fd) +{ + if (_isatty(fd)) + { + HANDLE h; + DWORD ignored; + + if ((h = (HANDLE) _get_osfhandle (fd)) == INVALID_HANDLE_VALUE) + { + errno = EBADF; + return 0; + } + if (GetConsoleMode (h, &ignored) != 0) + return 1; + } + errno = ENOTTY; + return 0; +} + +#define isatty(x) win32_isatty(x) +#endif + +/* Readline timeouts */ + +/* I don't know how to set a timeout for _getch() in MinGW32, so we use + SIGALRM. */ +#if (defined (HAVE_PSELECT) || defined (HAVE_SELECT)) && !defined (__MINGW32__) +# define RL_TIMEOUT_USE_SELECT +#else +# define RL_TIMEOUT_USE_SIGALRM +#endif + +int rl_set_timeout (unsigned int, unsigned int); +int rl_timeout_remaining (unsigned int *, unsigned int *); + +int _rl_timeout_init (void); +int _rl_timeout_sigalrm_handler (void); +int _rl_timeout_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *, const sigset_t *); + +static void _rl_timeout_handle (void); +#if defined (RL_TIMEOUT_USE_SIGALRM) +static int set_alarm (unsigned int *, unsigned int *); +static void reset_alarm (void); +#endif + +/* We implement timeouts as a future time using a supplied interval + (timeout_duration) from when the timeout is set (timeout_point). + That allows us to easily determine whether the timeout has occurred + and compute the time remaining until it does. */ +static struct timeval timeout_point; +static struct timeval timeout_duration; + +/* **************************************************************** */ +/* */ +/* 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 (void) +{ + return any_typein; +} + +int +_rl_pushed_input_available (void) +{ + return (push_index != pop_index); +} + +/* Return the amount of space available in the buffer for stuffing + characters. */ +static int +ibuffer_space (void) +{ + 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 non-zero if there was a key, or 0 if there wasn't. */ +static int +rl_get_char (int *key) +{ + if (push_index == pop_index) + return (0); + + *key = ibuffer[pop_index++]; +#if 0 + if (pop_index >= ibuffer_len) +#else + if (pop_index > ibuffer_len) +#endif + pop_index = 0; + + return (1); +} + +/* Stuff KEY into the *front* of the input buffer. + Returns non-zero if successful, zero if there is + no space left in the buffer. */ +int +_rl_unget_char (int key) +{ + if (ibuffer_space ()) + { + pop_index--; + if (pop_index < 0) + pop_index = ibuffer_len; + 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. Returns number of characters read + (0 if none available) and -1 on error (EIO). */ +static int +rl_gather_tyi (void) +{ + int tty; + register int tem, result; + int chars_avail, k; + char input; +#if defined(HAVE_SELECT) + fd_set readfds, exceptfds; + struct timeval timeout; +#endif + + chars_avail = 0; + input = 0; + tty = fileno (rl_instream); + +#if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (tty, &readfds); + FD_SET (tty, &exceptfds); + USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout); +#if defined (RL_TIMEOUT_USE_SELECT) + result = _rl_timeout_select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout, NULL); +#else + result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); +#endif + if (result <= 0) + return 0; /* Nothing to read. */ +#endif + + result = -1; + errno = 0; +#if defined (FIONREAD) + result = ioctl (tty, FIONREAD, &chars_avail); + if (result == -1 && errno == EIO) + return -1; + if (result == -1) + chars_avail = 0; +#endif + +#if defined (O_NDELAY) + if (result == -1) + { + tem = fcntl (tty, F_GETFL, 0); + + fcntl (tty, F_SETFL, (tem | O_NDELAY)); + chars_avail = read (tty, &input, 1); + + fcntl (tty, F_SETFL, tem); + if (chars_avail == -1 && errno == EAGAIN) + return 0; + if (chars_avail == -1 && errno == EIO) + return -1; + if (chars_avail == 0) /* EOF */ + { + rl_stuff_char (EOF); + return (0); + } + } +#endif /* O_NDELAY */ + +#if defined (__MINGW32__) + /* Use getch/_kbhit to check for available console input, in the same way + that we read it normally. */ + chars_avail = isatty (tty) ? _kbhit () : 0; + result = 0; +#endif + + /* If there's nothing available, don't waste time trying to read + something. */ + if (chars_avail <= 0) + return 0; + + tem = ibuffer_space (); + + if (chars_avail > tem) + chars_avail = tem; + + /* One cannot read all of the available input. I can only read a single + character at a time, or else programs which require input can be + thwarted. If the buffer is larger than one character, I lose. + Damn! */ + if (tem < ibuffer_len) + chars_avail = 0; + + if (result != -1) + { + while (chars_avail--) + { + RL_CHECK_SIGNALS (); + k = (*rl_getc_function) (rl_instream); + if (rl_stuff_char (k) == 0) + break; /* some problem; no more room */ + if (k == NEWLINE || k == RETURN) + break; + } + } + else + { + if (chars_avail) + rl_stuff_char (input); + } + + return 1; +} + +int +rl_set_keyboard_input_timeout (int u) +{ + int o; + + o = _keyboard_input_timeout; + if (u >= 0) + _keyboard_input_timeout = u; + return (o); +} + +/* Is there input available to be read on the readline input file + descriptor? Only works if the system has select(2) or FIONREAD. + Uses the value of _keyboard_input_timeout as the timeout; if another + readline function wants to specify a timeout and not leave it up to + the user, it should use _rl_input_queued(timeout_value_in_microseconds) + instead. */ +int +_rl_input_available (void) +{ +#if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + fd_set readfds, exceptfds; + struct timeval timeout; +#endif +#if !defined (HAVE_SELECT) && defined (FIONREAD) + int chars_avail; +#endif + int tty; + + if (rl_input_available_hook) + return (*rl_input_available_hook) (); + + tty = fileno (rl_instream); + +#if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (tty, &readfds); + FD_SET (tty, &exceptfds); + USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout); +# if defined (RL_TIMEOUT_USE_SELECT) + return (_rl_timeout_select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout, NULL) > 0); +# else + return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0); +# endif +#else + +#if defined (FIONREAD) + if (ioctl (tty, FIONREAD, &chars_avail) == 0) + return (chars_avail); +#endif + +#endif + +#if defined (__MINGW32__) + if (isatty (tty)) + return (_kbhit ()); +#endif + + return 0; +} + +int +_rl_nchars_available () +{ + int chars_avail, fd, result; + + chars_avail = 0; + +#if defined (FIONREAD) + fd = fileno (rl_instream); + errno = 0; + result = ioctl (fd, FIONREAD, &chars_avail); + if (result == -1 && errno == EIO) + return -1; +#endif + + return chars_avail; +} + +int +_rl_input_queued (int t) +{ + int old_timeout, r; + + old_timeout = rl_set_keyboard_input_timeout (t); + r = _rl_input_available (); + rl_set_keyboard_input_timeout (old_timeout); + return r; +} + +void +_rl_insert_typein (int c) +{ + int key, t, i; + char *string; + + i = key = 0; + string = (char *)xmalloc (ibuffer_len + 1); + string[i++] = (char) c; + + while ((t = rl_get_char (&key)) && + _rl_keymap[key].type == ISFUNC && + _rl_keymap[key].function == rl_insert) + string[i++] = key; + + if (t) + _rl_unget_char (key); + + string[i] = '\0'; + rl_insert_text (string); + xfree (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 (int key) +{ + if (ibuffer_space () == 0) + return 0; + + if (key == EOF) + { + key = NEWLINE; + rl_pending_input = EOF; + RL_SETSTATE (RL_STATE_INPUTPENDING); + } + ibuffer[push_index++] = key; +#if 0 + if (push_index >= ibuffer_len) +#else + if (push_index > ibuffer_len) +#endif + push_index = 0; + + return 1; +} + +/* Make C be the next command to be executed. */ +int +rl_execute_next (int c) +{ + rl_pending_input = c; + RL_SETSTATE (RL_STATE_INPUTPENDING); + return 0; +} + +/* Clear any pending input pushed with rl_execute_next() */ +int +rl_clear_pending_input (void) +{ + rl_pending_input = 0; + RL_UNSETSTATE (RL_STATE_INPUTPENDING); + return 0; +} + +/* **************************************************************** */ +/* */ +/* Timeout utility */ +/* */ +/* **************************************************************** */ + +#if defined (RL_TIMEOUT_USE_SIGALRM) +# if defined (HAVE_SETITIMER) + +static int +set_alarm (unsigned int *secs, unsigned int *usecs) +{ + struct itimerval it; + + timerclear (&it.it_interval); + timerset (&it.it_value, *secs, *usecs); + return setitimer (ITIMER_REAL, &it, NULL); +} + +static void +reset_alarm () +{ + struct itimerval it; + + timerclear (&it.it_interval); + timerclear (&it.it_value); + setitimer (ITIMER_REAL, &it, NULL); +} +# else +static int +set_alarm (unsigned int *secs, unsigned int *usecs) +{ + if (*secs == 0 || *usecs >= USEC_PER_SEC / 2) + (*secs)++; + *usecs = 0; + + return alarm (*secs); +} +static void +reset_alarm () +{ + alarm (0); +} +# endif +#endif + +/* Set a timeout which will be used for the next call of `readline + ()'. When (0, 0) are specified the timeout is cleared. */ +int +rl_set_timeout (unsigned int secs, unsigned int usecs) +{ + timeout_duration.tv_sec = secs + usecs / USEC_PER_SEC; + timeout_duration.tv_usec = usecs % USEC_PER_SEC; + + return 0; +} + +/* Start measuring the time. Returns 0 on success. Returns -1 on + error. */ +int +_rl_timeout_init (void) +{ + unsigned int secs, usecs; + + /* Clear the timeout state of the previous edit */ + RL_UNSETSTATE(RL_STATE_TIMEOUT); + timerclear (&timeout_point); + + /* Return 0 when timeout is unset. */ + if (timerisunset (&timeout_duration)) + return 0; + + /* Return -1 on gettimeofday error. */ + if (gettimeofday(&timeout_point, 0) != 0) + { + timerclear (&timeout_point); + return -1; + } + + secs = timeout_duration.tv_sec; + usecs = timeout_duration.tv_usec; + +#if defined (RL_TIMEOUT_USE_SIGALRM) + /* If select(2)/pselect(2) is unavailable, use SIGALRM. */ + if (set_alarm (&secs, &usecs) < 0) + return -1; +#endif + + timeout_point.tv_sec += secs; + timeout_point.tv_usec += usecs; + if (timeout_point.tv_usec >= USEC_PER_SEC) + { + timeout_point.tv_sec++; + timeout_point.tv_usec -= USEC_PER_SEC; + } + + return 0; +} + +/* Get the remaining time until the scheduled timeout. Returns -1 on + error or no timeout set with secs and usecs unchanged. Returns 0 + on an expired timeout with secs and usecs unchanged. Returns 1 + when the timeout has not yet expired. The remaining time is stored + in secs and usecs. When NULL is specified to either of the + arguments, just the expiration is tested. */ +int +rl_timeout_remaining (unsigned int *secs, unsigned int *usecs) +{ + struct timeval current_time; + + /* Return -1 when timeout is unset. */ + if (timerisunset (&timeout_point)) + { + errno = 0; + return -1; + } + + /* Return -1 on error. errno is set by gettimeofday. */ + if (gettimeofday(¤t_time, 0) != 0) + return -1; + + /* Return 0 when timeout has already expired. */ + /* could use timercmp (&timeout_point, ¤t_time, <) here */ + if (current_time.tv_sec > timeout_point.tv_sec || + (current_time.tv_sec == timeout_point.tv_sec && + current_time.tv_usec >= timeout_point.tv_usec)) + return 0; + + if (secs && usecs) + { + *secs = timeout_point.tv_sec - current_time.tv_sec; + *usecs = timeout_point.tv_usec - current_time.tv_usec; + if (timeout_point.tv_usec < current_time.tv_usec) + { + (*secs)--; + *usecs += USEC_PER_SEC; + } + } + + return 1; +} + +/* This should only be called if RL_TIMEOUT_USE_SELECT is defined. */ + +#if defined (HAVE_PSELECT) || defined (HAVE_SELECT) +int +_rl_timeout_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout, const sigset_t *sigmask) +{ + int result; +#if defined (HAVE_PSELECT) + struct timespec ts; +#else + sigset_t origmask; + struct timeval tv; +#endif + int tmout_status; + struct timeval tmout; + unsigned int sec, usec; + + /* When the remaining time for rl_timeout is shorter than the + keyboard input timeout, replace `timeout' with the remaining time + for `rl_timeout' and set `tmout_status = 1'. */ + tmout_status = rl_timeout_remaining (&sec, &usec); + tmout.tv_sec = sec; + tmout.tv_usec = usec; + + if (tmout_status == 0) + _rl_timeout_handle (); + else if (tmout_status == 1) + { + if (timeout == NULL || timercmp (&tmout, timeout, <)) + timeout = &tmout; + else + tmout_status = -1; + } + +#if defined (HAVE_PSELECT) + if (timeout) + { + TIMEVAL_TO_TIMESPEC (timeout, &ts); + result = pselect (nfds, readfds, writefds, exceptfds, &ts, sigmask); + } + else + result = pselect (nfds, readfds, writefds, exceptfds, NULL, sigmask); +#else + if (sigmask) + sigprocmask (SIG_SETMASK, sigmask, &origmask); + + if (timeout) + { + tv.tv_sec = timeout->tv_sec; + tv.tv_usec = timeout->tv_usec; + result = select (nfds, readfds, writefds, exceptfds, &tv); + } + else + result = select (nfds, readfds, writefds, exceptfds, NULL); + + if (sigmask) + sigprocmask (SIG_SETMASK, &origmask, NULL); +#endif + + if (tmout_status == 1 && result == 0) + _rl_timeout_handle (); + + return result; +} +#endif + +static void +_rl_timeout_handle () +{ + if (rl_timeout_event_hook) + (*rl_timeout_event_hook) (); + + RL_SETSTATE(RL_STATE_TIMEOUT); + _rl_abort_internal (); +} + +int +_rl_timeout_handle_sigalrm () +{ +#if defined (RL_TIMEOUT_USE_SIGALRM) + if (timerisunset (&timeout_point)) + return -1; + + /* Reset `timeout_point' to the current time to ensure that later + calls of `rl_timeout_pending ()' return 0 (timeout expired). */ + if (gettimeofday(&timeout_point, 0) != 0) + timerclear (&timeout_point); + + reset_alarm (); + + _rl_timeout_handle (); +#endif + return -1; +} +/* **************************************************************** */ +/* */ +/* Character Input */ +/* */ +/* **************************************************************** */ + +/* Read a key, including pending input. */ +int +rl_read_key (void) +{ + int c, r; + + if (rl_pending_input) + { + c = rl_pending_input; /* XXX - cast to unsigned char if > 0? */ + rl_clear_pending_input (); + } + else + { + /* If input is coming from a macro, then use that. */ + if (c = _rl_next_macro_key ()) + return ((unsigned char)c); + + /* If the user has an event function, then call it periodically. */ + if (rl_event_hook) + { + while (rl_event_hook) + { + if (rl_get_char (&c) != 0) + break; + + if ((r = rl_gather_tyi ()) < 0) /* XXX - EIO */ + { + rl_done = 1; + RL_SETSTATE (RL_STATE_DONE); + return (errno == EIO ? (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF) : '\n'); + } + else if (r > 0) /* read something */ + continue; + + RL_CHECK_SIGNALS (); + if (rl_done) /* XXX - experimental */ + return ('\n'); + (*rl_event_hook) (); + } + } + else + { + if (rl_get_char (&c) == 0) + c = (*rl_getc_function) (rl_instream); +/* fprintf(stderr, "rl_read_key: calling RL_CHECK_SIGNALS: _rl_caught_signal = %d\r\n", _rl_caught_signal); */ + RL_CHECK_SIGNALS (); + } + } + + return (c); +} + +int +rl_getc (FILE *stream) +{ + int result; + unsigned char c; + int fd; +#if defined (HAVE_PSELECT) + sigset_t empty_set; + fd_set readfds; +#endif + + fd = fileno (stream); + while (1) + { + RL_CHECK_SIGNALS (); + + /* We know at this point that _rl_caught_signal == 0 */ + +#if defined (__MINGW32__) + if (isatty (fd) + return (_getch ()); /* "There is no error return." */ +#endif + result = 0; +#if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + /* At this point, if we have pselect, we're using select/pselect for the + timeouts. We handled MinGW above. */ + FD_ZERO (&readfds); + FD_SET (fd, &readfds); +# if defined (HANDLE_SIGNALS) + result = _rl_timeout_select (fd + 1, &readfds, NULL, NULL, NULL, &_rl_orig_sigset); +# else + sigemptyset (&empty_set); + sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &empty_set); + result = _rl_timeout_select (fd + 1, &readfds, NULL, NULL, NULL, &empty_set); +# endif /* HANDLE_SIGNALS */ + if (result == 0) + _rl_timeout_handle (); /* check the timeout */ +#endif + if (result >= 0) + result = read (fd, &c, sizeof (unsigned char)); + + if (result == sizeof (unsigned char)) + return (c); + + /* If zero characters are returned, then the file that we are + reading from is empty! Return EOF in that case. */ + if (result == 0) + return (EOF); + +#if defined (__BEOS__) + if (errno == EINTR) + continue; +#endif + +#if defined (EWOULDBLOCK) +# define X_EWOULDBLOCK EWOULDBLOCK +#else +# define X_EWOULDBLOCK -99 +#endif + +#if defined (EAGAIN) +# define X_EAGAIN EAGAIN +#else +# define X_EAGAIN -99 +#endif + + if (errno == X_EWOULDBLOCK || errno == X_EAGAIN) + { + if (sh_unset_nodelay_mode (fd) < 0) + return (EOF); + continue; + } + +#undef X_EWOULDBLOCK +#undef X_EAGAIN + +/* fprintf(stderr, "rl_getc: result = %d errno = %d\n", result, errno); */ + +handle_error: + /* If the error that we received was EINTR, then try again, + this is simply an interrupted system call to read (). We allow + the read to be interrupted if we caught SIGHUP, SIGTERM, or any + of the other signals readline treats specially. If the + application sets an event hook, call it for other signals. + Otherwise (not EINTR), some error occurred, also signifying EOF. */ + if (errno != EINTR) + return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); + /* fatal signals of interest */ +#if defined (SIGHUP) + else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM) +#else + else if (_rl_caught_signal == SIGTERM) +#endif + return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); + /* keyboard-generated signals of interest */ +#if defined (SIGQUIT) + else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT) +#else + else if (_rl_caught_signal == SIGINT) +#endif + RL_CHECK_SIGNALS (); +#if defined (SIGTSTP) + else if (_rl_caught_signal == SIGTSTP) + RL_CHECK_SIGNALS (); +#endif + /* non-keyboard-generated signals of interest */ +#if defined (SIGWINCH) + else if (_rl_caught_signal == SIGWINCH) + RL_CHECK_SIGNALS (); +#endif /* SIGWINCH */ +#if defined (SIGALRM) + else if (_rl_caught_signal == SIGALRM +# if defined (SIGVTALRM) + || _rl_caught_signal == SIGVTALRM +# endif + ) + RL_CHECK_SIGNALS (); +#endif /* SIGALRM */ + + if (rl_signal_event_hook) + (*rl_signal_event_hook) (); + } +} + +#if defined (HANDLE_MULTIBYTE) +/* read multibyte char */ +int +_rl_read_mbchar (char *mbchar, int size) +{ + int mb_len, c; + size_t mbchar_bytes_length; + WCHAR_T wc; + mbstate_t ps, ps_back; + + memset(&ps, 0, sizeof (mbstate_t)); + memset(&ps_back, 0, sizeof (mbstate_t)); + + mb_len = 0; + while (mb_len < size) + { + c = (mb_len == 0) ? _rl_bracketed_read_key () : rl_read_key (); + + if (c < 0) + break; + + mbchar[mb_len++] = c; + + mbchar_bytes_length = MBRTOWC (&wc, mbchar, mb_len, &ps); + if (mbchar_bytes_length == (size_t)(-1)) + break; /* invalid byte sequence for the current locale */ + else if (mbchar_bytes_length == (size_t)(-2)) + { + /* shorted bytes */ + ps = ps_back; + continue; + } + else if (mbchar_bytes_length == 0) + { + mbchar[0] = '\0'; /* null wide character */ + mb_len = 1; + break; + } + else if (mbchar_bytes_length > (size_t)(0)) + break; + } + + return mb_len; +} + +/* Read a multibyte-character string whose first character is FIRST into + the buffer MB of length MLEN. Returns the last character read, which + may be FIRST. Used by the search functions, among others. Very similar + to _rl_read_mbchar. */ +int +_rl_read_mbstring (int first, char *mb, int mlen) +{ + int i, c, n; + mbstate_t ps; + + c = first; + memset (mb, 0, mlen); + for (i = 0; c >= 0 && i < mlen; i++) + { + mb[i] = (char)c; + memset (&ps, 0, sizeof (mbstate_t)); + n = _rl_get_char_len (mb, &ps); + if (n == -2) + { + /* Read more for multibyte character */ + RL_SETSTATE (RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE (RL_STATE_MOREINPUT); + } + else + break; + } + return c; +} +#endif /* HANDLE_MULTIBYTE */ diff --git a/isearch.c b/isearch.c new file mode 100644 index 0000000..c2d4d23 --- /dev/null +++ b/isearch.c @@ -0,0 +1,893 @@ +/* isearch.c - incremental searching */ + +/* **************************************************************** */ +/* */ +/* I-Search and Searching */ +/* */ +/* **************************************************************** */ + +/* Copyright (C) 1987-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif + +#include "rldefs.h" +#include "rlmbutil.h" + +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* Variables exported to other files in the readline library. */ +char *_rl_isearch_terminators = (char *)NULL; + +_rl_search_cxt *_rl_iscxt = 0; + +static int rl_search_history (int, int); + +static _rl_search_cxt *_rl_isearch_init (int); +static void _rl_isearch_fini (_rl_search_cxt *); + +/* Last line found by the current incremental search, so we don't `find' + identical lines many times in a row. Now part of isearch context. */ +/* static char *prev_line_found; */ + +/* Last search string and its length. */ +static char *last_isearch_string; +static int last_isearch_string_len; + +static char * const default_isearch_terminators = "\033\012"; + +_rl_search_cxt * +_rl_scxt_alloc (int type, int flags) +{ + _rl_search_cxt *cxt; + + cxt = (_rl_search_cxt *)xmalloc (sizeof (_rl_search_cxt)); + + cxt->type = type; + cxt->sflags = flags; + + cxt->search_string = 0; + cxt->search_string_size = cxt->search_string_index = 0; + + cxt->lines = 0; + cxt->allocated_line = 0; + cxt->hlen = cxt->hindex = 0; + + cxt->save_point = rl_point; + cxt->save_mark = rl_mark; + cxt->save_line = where_history (); + cxt->last_found_line = cxt->save_line; + cxt->prev_line_found = 0; + + cxt->save_undo_list = 0; + + cxt->keymap = _rl_keymap; + cxt->okeymap = _rl_keymap; + + cxt->history_pos = 0; + cxt->direction = 0; + + cxt->prevc = cxt->lastc = 0; + + cxt->sline = 0; + cxt->sline_len = cxt->sline_index = 0; + + cxt->search_terminators = 0; + + return cxt; +} + +void +_rl_scxt_dispose (_rl_search_cxt *cxt, int flags) +{ + FREE (cxt->search_string); + FREE (cxt->allocated_line); + FREE (cxt->lines); + + xfree (cxt); +} + +/* Search backwards through the history looking for a string which is typed + interactively. Start with the current line. */ +int +rl_reverse_search_history (int sign, int 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 (int sign, int key) +{ + return (rl_search_history (sign, key)); +} + +/* Display the current state of the search in the echo-area. + SEARCH_STRING contains the string that is being searched for, + DIRECTION is zero for forward, or non-zero for reverse, + WHERE is the history list number of the current line. If it is + -1, then this line is the starting one. */ +static void +rl_display_search (char *search_string, int flags, int where) +{ + char *message; + int msglen, searchlen; + + searchlen = (search_string && *search_string) ? strlen (search_string) : 0; + + message = (char *)xmalloc (searchlen + 64); + msglen = 0; + +#if defined (NOTDEF) + if (where != -1) + { + sprintf (message, "[%d]", where + history_base); + msglen = strlen (message); + } +#endif /* NOTDEF */ + + message[msglen++] = '('; + + if (flags & SF_FAILED) + { + strcpy (message + msglen, "failed "); + msglen += 7; + } + + if (flags & SF_REVERSE) + { + strcpy (message + msglen, "reverse-"); + msglen += 8; + } + + strcpy (message + msglen, "i-search)`"); + msglen += 10; + + if (search_string && *search_string) + { + strcpy (message + msglen, search_string); + msglen += searchlen; + } + else + _rl_optimize_redisplay (); + + strcpy (message + msglen, "': "); + + rl_message ("%s", message); + xfree (message); +#if 0 + /* rl_message calls this */ + (*rl_redisplay_function) (); +#endif +} + +static _rl_search_cxt * +_rl_isearch_init (int direction) +{ + _rl_search_cxt *cxt; + register int i; + HIST_ENTRY **hlist; + + cxt = _rl_scxt_alloc (RL_SEARCH_ISEARCH, 0); + if (direction < 0) + cxt->sflags |= SF_REVERSE; + + cxt->search_terminators = _rl_isearch_terminators ? _rl_isearch_terminators + : default_isearch_terminators; + + /* Create an array of pointers to the lines that we want to search. */ + hlist = history_list (); + rl_maybe_replace_line (); + i = 0; + if (hlist) + for (i = 0; hlist[i]; i++); + + /* Allocate space for this many lines, +1 for the current input line, + and remember those lines. */ + cxt->lines = (char **)xmalloc ((1 + (cxt->hlen = i)) * sizeof (char *)); + for (i = 0; i < cxt->hlen; i++) + cxt->lines[i] = hlist[i]->line; + + if (_rl_saved_line_for_history) + cxt->lines[i] = _rl_saved_line_for_history->line; + else + { + /* Keep track of this so we can free it. */ + cxt->allocated_line = (char *)xmalloc (1 + strlen (rl_line_buffer)); + strcpy (cxt->allocated_line, &rl_line_buffer[0]); + cxt->lines[i] = cxt->allocated_line; + } + + cxt->hlen++; + + /* The line where we start the search. */ + cxt->history_pos = cxt->save_line; + + rl_save_prompt (); + + /* Initialize search parameters. */ + cxt->search_string = (char *)xmalloc (cxt->search_string_size = 128); + cxt->search_string[cxt->search_string_index = 0] = '\0'; + + /* Normalize DIRECTION into 1 or -1. */ + cxt->direction = (direction >= 0) ? 1 : -1; + + cxt->sline = rl_line_buffer; + cxt->sline_len = strlen (cxt->sline); + cxt->sline_index = rl_point; + + _rl_iscxt = cxt; /* save globally */ + + /* experimental right now */ + _rl_init_executing_keyseq (); + + return cxt; +} + +static void +_rl_isearch_fini (_rl_search_cxt *cxt) +{ + /* First put back the original state. */ + rl_replace_line (cxt->lines[cxt->save_line], 0); + + rl_restore_prompt (); + + /* Save the search string for possible later use. */ + FREE (last_isearch_string); + last_isearch_string = cxt->search_string; + last_isearch_string_len = cxt->search_string_index; + cxt->search_string = 0; + cxt->search_string_size = 0; + cxt->search_string_index = 0; + + if (cxt->last_found_line < cxt->save_line) + rl_get_previous_history (cxt->save_line - cxt->last_found_line, 0); + else + rl_get_next_history (cxt->last_found_line - cxt->save_line, 0); + + /* If the string was not found, put point at the end of the last matching + line. If last_found_line == orig_line, we didn't find any matching + history lines at all, so put point back in its original position. */ + if (cxt->sline_index < 0) + { + if (cxt->last_found_line == cxt->save_line) + cxt->sline_index = cxt->save_point; + else + cxt->sline_index = strlen (rl_line_buffer); + rl_mark = cxt->save_mark; + rl_deactivate_mark (); + } + + rl_point = cxt->sline_index; + /* Don't worry about where to put the mark here; rl_get_previous_history + and rl_get_next_history take care of it. + If we want to highlight the search string, this is where to set the + point and mark to do it. */ + _rl_fix_point (0); + rl_deactivate_mark (); + +/* _rl_optimize_redisplay (); */ + rl_clear_message (); +} + +/* XXX - we could use _rl_bracketed_read_mbstring () here. */ +int +_rl_search_getchar (_rl_search_cxt *cxt) +{ + int c; + + /* Read a key and decide how to proceed. */ + RL_SETSTATE(RL_STATE_MOREINPUT); + c = cxt->lastc = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +#if defined (HANDLE_MULTIBYTE) + /* This ends up with C (and LASTC) being set to the last byte of the + multibyte character. In most cases c == lastc == mb[0] */ + if (c >= 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) + c = cxt->lastc = _rl_read_mbstring (cxt->lastc, cxt->mb, MB_LEN_MAX); +#endif + + RL_CHECK_SIGNALS (); + return c; +} + +#define ENDSRCH_CHAR(c) \ + ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G'))) + +/* Process just-read character C according to isearch context CXT. Return + -1 if the caller should just free the context and return, 0 if we should + break out of the loop, and 1 if we should continue to read characters. */ +int +_rl_isearch_dispatch (_rl_search_cxt *cxt, int c) +{ + int n, wstart, wlen, limit, cval, incr; + char *paste; + size_t pastelen; + int j; + rl_command_func_t *f; + + f = (rl_command_func_t *)NULL; + + if (c < 0) + { + cxt->sflags |= SF_FAILED; + cxt->history_pos = cxt->last_found_line; + return -1; + } + + _rl_add_executing_keyseq (c); + + /* XXX - experimental code to allow users to bracketed-paste into the search + string even when ESC is one of the isearch-terminators. Not perfect yet. */ + if (_rl_enable_bracketed_paste && c == ESC && strchr (cxt->search_terminators, c) && (n = _rl_nchars_available ()) > (BRACK_PASTE_SLEN-1)) + { + j = _rl_read_bracketed_paste_prefix (c); + if (j == 1) + { + cxt->lastc = -7; /* bracketed paste, see below */ + goto opcode_dispatch; + } + else if (_rl_pushed_input_available ()) /* eat extra char we pushed back */ + c = cxt->lastc = rl_read_key (); + else + c = cxt->lastc; /* last ditch */ + } + + /* If we are moving into a new keymap, modify cxt->keymap and go on. + This can be a problem if c == ESC and we want to terminate the + incremental search, so we check */ + if (c >= 0 && cxt->keymap[c].type == ISKMAP && strchr (cxt->search_terminators, cxt->lastc) == 0) + { + /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued + takes microseconds, so multiply by 1000. If we don't get any + additional input and this keymap shadows another function, process + that key as if it was all we read. */ + if (_rl_keyseq_timeout > 0 && + RL_ISSTATE (RL_STATE_CALLBACK) == 0 && + RL_ISSTATE (RL_STATE_INPUTPENDING) == 0 && + _rl_pushed_input_available () == 0 && + ((Keymap)(cxt->keymap[c].function))[ANYOTHERKEY].function && + _rl_input_queued (_rl_keyseq_timeout*1000) == 0) + goto add_character; + + cxt->okeymap = cxt->keymap; + cxt->keymap = FUNCTION_TO_KEYMAP (cxt->keymap, c); + cxt->sflags |= SF_CHGKMAP; + /* XXX - we should probably save this sequence, so we can do + something useful if this doesn't end up mapping to a command we + interpret here. Right now we just save the most recent character + that caused the index into a new keymap. */ + cxt->prevc = c; +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + if (cxt->mb[1] == 0) + { + cxt->pmb[0] = c; /* XXX should be == cxt->mb[0] */ + cxt->pmb[1] = '\0'; + } + else + memcpy (cxt->pmb, cxt->mb, sizeof (cxt->pmb)); + } +#endif + return 1; + } + +add_character: + + /* Translate the keys we do something with to opcodes. */ + if (c >= 0 && cxt->keymap[c].type == ISFUNC) + { + /* If we have a multibyte character, see if it's bound to something that + affects the search. */ +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && cxt->mb[1]) + f = rl_function_of_keyseq (cxt->mb, cxt->keymap, (int *)NULL); + else +#endif + { + f = cxt->keymap[c].function; + if (f == rl_do_lowercase_version) + f = cxt->keymap[_rl_to_lower (c)].function; + } + + if (f == rl_reverse_search_history) + cxt->lastc = (cxt->sflags & SF_REVERSE) ? -1 : -2; + else if (f == rl_forward_search_history) + cxt->lastc = (cxt->sflags & SF_REVERSE) ? -2 : -1; + else if (f == rl_rubout) + cxt->lastc = -3; + else if (c == CTRL ('G') || f == rl_abort) + cxt->lastc = -4; + else if (c == CTRL ('W') || f == rl_unix_word_rubout) /* XXX */ + cxt->lastc = -5; + else if (c == CTRL ('Y') || f == rl_yank) /* XXX */ + cxt->lastc = -6; + else if (f == rl_bracketed_paste_begin) + cxt->lastc = -7; + } + + /* If we changed the keymap earlier while translating a key sequence into + a command, restore it now that we've succeeded. */ + if (cxt->sflags & SF_CHGKMAP) + { + cxt->keymap = cxt->okeymap; + cxt->sflags &= ~SF_CHGKMAP; + /* If we indexed into a new keymap, but didn't map to a command that + affects the search (lastc > 0), and the character that mapped to a + new keymap would have ended the search (ENDSRCH_CHAR(cxt->prevc)), + handle that now as if the previous char would have ended the search + and we would have read the current character. */ + /* XXX - should we check cxt->mb? */ + if (cxt->lastc > 0 && ENDSRCH_CHAR (cxt->prevc)) + { + rl_stuff_char (cxt->lastc); + rl_execute_next (cxt->prevc); + /* XXX - do we insert everything in cxt->pmb? */ + return (0); + } + /* Otherwise, if the current character is mapped to self-insert or + nothing (i.e., not an editing command), and the previous character + was a keymap index, then we need to insert both the previous + character and the current character into the search string. */ + else if (cxt->lastc > 0 && cxt->prevc > 0 && + cxt->keymap[cxt->prevc].type == ISKMAP && + (f == 0 || f == rl_insert)) + { + /* Make lastc be the next character read */ + /* XXX - do we insert everything in cxt->mb? */ + rl_execute_next (cxt->lastc); + /* Dispatch on the previous character (insert into search string) */ + cxt->lastc = cxt->prevc; +#if defined (HANDLE_MULTIBYTE) + /* Have to overwrite cxt->mb here because dispatch uses it below */ + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + if (cxt->pmb[1] == 0) + { + cxt->mb[0] = cxt->lastc; /* == cxt->prevc */ + cxt->mb[1] = '\0'; + } + else + memcpy (cxt->mb, cxt->pmb, sizeof (cxt->mb)); + } +#endif + cxt->prevc = 0; + } + else if (cxt->lastc > 0 && cxt->prevc > 0 && f && f != rl_insert) + { + _rl_term_executing_keyseq (); /* should this go in the caller? */ + + _rl_pending_command.map = cxt->keymap; + _rl_pending_command.count = 1; /* XXX */ + _rl_pending_command.key = cxt->lastc; + _rl_pending_command.func = f; + _rl_command_to_execute = &_rl_pending_command; + + return (0); + } + } + + /* 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 (cxt->lastc > 0 && strchr (cxt->search_terminators, cxt->lastc)) + { + /* ESC still terminates the search, but if there is pending + input or if input arrives within 0.1 seconds (on systems + with select(2)) it is used as a prefix character + with rl_execute_next. WATCH OUT FOR THIS! This is intended + to allow the arrow keys to be used like ^F and ^B are used + to terminate the search and execute the movement command. + XXX - since _rl_input_available depends on the application- + settable keyboard timeout value, this could alternatively + use _rl_input_queued(100000) */ + if (cxt->lastc == ESC && (_rl_pushed_input_available () || _rl_input_available ())) + rl_execute_next (ESC); + return (0); + } + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + if (cxt->lastc >= 0 && (cxt->mb[0] && cxt->mb[1] == '\0') && ENDSRCH_CHAR (cxt->lastc)) + { + /* This sets rl_pending_input to LASTC; it will be picked up the next + time rl_read_key is called. */ + rl_execute_next (cxt->lastc); + return (0); + } + } + else +#endif + if (cxt->lastc >= 0 && ENDSRCH_CHAR (cxt->lastc)) + { + /* This sets rl_pending_input to LASTC; it will be picked up the next + time rl_read_key is called. */ + rl_execute_next (cxt->lastc); + return (0); + } + + _rl_init_executing_keyseq (); + +opcode_dispatch: + /* Now dispatch on the character. `Opcodes' affect the search string or + state. Other characters are added to the string. */ + switch (cxt->lastc) + { + /* search again */ + case -1: + if (cxt->search_string_index == 0) + { + if (last_isearch_string) + { + cxt->search_string_size = 64 + last_isearch_string_len; + cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); + strcpy (cxt->search_string, last_isearch_string); + cxt->search_string_index = last_isearch_string_len; + rl_display_search (cxt->search_string, cxt->sflags, -1); + break; + } + /* XXX - restore keymap here? */ + return (1); + } + else if ((cxt->sflags & SF_REVERSE) && cxt->sline_index >= 0) + cxt->sline_index--; + else if (cxt->sline_index != cxt->sline_len) + cxt->sline_index++; + else + rl_ding (); + break; + + /* switch directions */ + case -2: + cxt->direction = -cxt->direction; + if (cxt->direction < 0) + cxt->sflags |= SF_REVERSE; + else + cxt->sflags &= ~SF_REVERSE; + break; + + /* delete character from search string. */ + case -3: /* C-H, DEL */ + /* This is tricky. To do this right, we need to keep a + stack of search positions for the current search, with + sentinels marking the beginning and end. But this will + do until we have a real isearch-undo. */ + if (cxt->search_string_index == 0) + rl_ding (); + else if (MB_CUR_MAX == 1 || rl_byte_oriented) + cxt->search_string[--cxt->search_string_index] = '\0'; + else + { + wstart = _rl_find_prev_mbchar (cxt->search_string, cxt->search_string_index, MB_FIND_NONZERO); + if (wstart >= 0) + cxt->search_string[cxt->search_string_index = wstart] = '\0'; + else + cxt->search_string[cxt->search_string_index = 0] = '\0'; + } + + if (cxt->search_string_index == 0) + rl_ding (); + + break; + + case -4: /* C-G, abort */ + rl_replace_line (cxt->lines[cxt->save_line], 0); + rl_point = cxt->save_point; + rl_mark = cxt->save_mark; + rl_deactivate_mark (); + rl_restore_prompt(); + rl_clear_message (); + + _rl_fix_point (1); /* in case save_line and save_point are out of sync */ + return -1; + + case -5: /* C-W */ + /* skip over portion of line we already matched and yank word */ + wstart = rl_point + cxt->search_string_index; + if (wstart >= rl_end) + { + rl_ding (); + break; + } + + /* if not in a word, move to one. */ + cval = _rl_char_value (rl_line_buffer, wstart); + if (_rl_walphabetic (cval) == 0) + { + rl_ding (); + break; + } + n = MB_NEXTCHAR (rl_line_buffer, wstart, 1, MB_FIND_NONZERO);; + while (n < rl_end) + { + cval = _rl_char_value (rl_line_buffer, n); + if (_rl_walphabetic (cval) == 0) + break; + n = MB_NEXTCHAR (rl_line_buffer, n, 1, MB_FIND_NONZERO);; + } + wlen = n - wstart + 1; + if (cxt->search_string_index + wlen + 1 >= cxt->search_string_size) + { + cxt->search_string_size += wlen + 1; + cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); + } + for (; wstart < n; wstart++) + cxt->search_string[cxt->search_string_index++] = rl_line_buffer[wstart]; + cxt->search_string[cxt->search_string_index] = '\0'; + break; + + case -6: /* C-Y */ + /* skip over portion of line we already matched and yank rest */ + wstart = rl_point + cxt->search_string_index; + if (wstart >= rl_end) + { + rl_ding (); + break; + } + n = rl_end - wstart + 1; + if (cxt->search_string_index + n + 1 >= cxt->search_string_size) + { + cxt->search_string_size += n + 1; + cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); + } + for (n = wstart; n < rl_end; n++) + cxt->search_string[cxt->search_string_index++] = rl_line_buffer[n]; + cxt->search_string[cxt->search_string_index] = '\0'; + break; + + case -7: /* bracketed paste */ + paste = _rl_bracketed_text (&pastelen); + if (paste == 0 || *paste == 0) + { + xfree (paste); + break; + } + if (_rl_enable_active_region) + rl_activate_mark (); + if (cxt->search_string_index + pastelen + 1 >= cxt->search_string_size) + { + cxt->search_string_size += pastelen + 2; + cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); + } + memcpy (cxt->search_string + cxt->search_string_index, paste, pastelen); + cxt->search_string_index += pastelen; + cxt->search_string[cxt->search_string_index] = '\0'; + xfree (paste); + break; + + /* Add character to search string and continue search. */ + default: +#if defined (HANDLE_MULTIBYTE) + wlen = (cxt->mb[0] == 0 || cxt->mb[1] == 0) ? 1 : RL_STRLEN (cxt->mb); +#else + wlen = 1; +#endif + if (cxt->search_string_index + wlen + 1 >= cxt->search_string_size) + { + cxt->search_string_size += 128; /* 128 much greater than MB_CUR_MAX */ + cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); + } +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int j; + + if (cxt->mb[0] == 0 || cxt->mb[1] == 0) + cxt->search_string[cxt->search_string_index++] = cxt->mb[0]; + else + for (j = 0; j < wlen; ) + cxt->search_string[cxt->search_string_index++] = cxt->mb[j++]; + } + else +#endif + cxt->search_string[cxt->search_string_index++] = cxt->lastc; /* XXX - was c instead of lastc */ + cxt->search_string[cxt->search_string_index] = '\0'; + break; + } + + for (cxt->sflags &= ~(SF_FOUND|SF_FAILED);; ) + { + if (cxt->search_string_index == 0) + { + cxt->sflags |= SF_FAILED; + break; + } + + limit = cxt->sline_len - cxt->search_string_index + 1; + + /* Search the current line. */ + while ((cxt->sflags & SF_REVERSE) ? (cxt->sline_index >= 0) : (cxt->sline_index < limit)) + { + if (STREQN (cxt->search_string, cxt->sline + cxt->sline_index, cxt->search_string_index)) + { + cxt->sflags |= SF_FOUND; + break; + } + else + cxt->sline_index += cxt->direction; + + if (cxt->sline_index < 0) + { + cxt->sline_index = 0; + break; + } + } + if (cxt->sflags & SF_FOUND) + break; + + /* Move to the next line, but skip new copies of the line + we just found and lines shorter than the string we're + searching for. */ + do + { + /* Move to the next line. */ + cxt->history_pos += cxt->direction; + + /* At limit for direction? */ + if ((cxt->sflags & SF_REVERSE) ? (cxt->history_pos < 0) : (cxt->history_pos == cxt->hlen)) + { + cxt->sflags |= SF_FAILED; + break; + } + + /* We will need these later. */ + cxt->sline = cxt->lines[cxt->history_pos]; + cxt->sline_len = strlen (cxt->sline); + } + while ((cxt->prev_line_found && STREQ (cxt->prev_line_found, cxt->lines[cxt->history_pos])) || + (cxt->search_string_index > cxt->sline_len)); + + if (cxt->sflags & SF_FAILED) + { + /* XXX - reset sline_index if < 0 */ + if (cxt->sline_index < 0) + cxt->sline_index = 0; + break; + } + + /* Now set up the line for searching... */ + cxt->sline_index = (cxt->sflags & SF_REVERSE) ? cxt->sline_len - cxt->search_string_index : 0; + } + + /* reset the keymaps for the next time through the loop */ + cxt->keymap = cxt->okeymap = _rl_keymap; + + if (cxt->sflags & SF_FAILED) + { + /* We cannot find the search string. Ding the bell. */ + rl_ding (); + cxt->history_pos = cxt->last_found_line; + rl_deactivate_mark (); + rl_display_search (cxt->search_string, cxt->sflags, (cxt->history_pos == cxt->save_line) ? -1 : cxt->history_pos); + return 1; + } + + /* We have found the search string. Just display it. But don't + actually move there in the history list until the user accepts + the location. */ + if (cxt->sflags & SF_FOUND) + { + cxt->prev_line_found = cxt->lines[cxt->history_pos]; + rl_replace_line (cxt->lines[cxt->history_pos], 0); + if (_rl_enable_active_region) + rl_activate_mark (); + rl_point = cxt->sline_index; + if (rl_mark_active_p () && cxt->search_string_index > 0) + rl_mark = rl_point + cxt->search_string_index; + cxt->last_found_line = cxt->history_pos; + rl_display_search (cxt->search_string, cxt->sflags, (cxt->history_pos == cxt->save_line) ? -1 : cxt->history_pos); + } + + return 1; +} + +int +_rl_isearch_cleanup (_rl_search_cxt *cxt, int r) +{ + if (r >= 0) + _rl_isearch_fini (cxt); + _rl_scxt_dispose (cxt, 0); + _rl_iscxt = 0; + + RL_UNSETSTATE(RL_STATE_ISEARCH); + + return (r != 0); +} + +/* Search through the history looking for an interactively typed string. + This is analogous to i-search. We start the search in the current line. + DIRECTION is which direction to search; >= 0 means forward, < 0 means + backwards. */ +static int +rl_search_history (int direction, int invoking_key) +{ + _rl_search_cxt *cxt; /* local for now, but saved globally */ + int c, r; + + RL_SETSTATE(RL_STATE_ISEARCH); + cxt = _rl_isearch_init (direction); + + rl_display_search (cxt->search_string, cxt->sflags, -1); + + /* If we are using the callback interface, all we do is set up here and + return. The key is that we leave RL_STATE_ISEARCH set. */ + if (RL_ISSTATE (RL_STATE_CALLBACK)) + return (0); + + r = -1; + for (;;) + { + c = _rl_search_getchar (cxt); + /* We might want to handle EOF here (c == 0) */ + r = _rl_isearch_dispatch (cxt, cxt->lastc); + if (r <= 0) + break; + } + + /* The searching is over. The user may have found the string that she + was looking for, or else she may have exited a failing search. If + LINE_INDEX is -1, then that shows that the string searched for was + not found. We use this to determine where to place rl_point. */ + return (_rl_isearch_cleanup (cxt, r)); +} + +#if defined (READLINE_CALLBACKS) +/* Called from the callback functions when we are ready to read a key. The + callback functions know to call this because RL_ISSTATE(RL_STATE_ISEARCH). + If _rl_isearch_dispatch finishes searching, this function is responsible + for turning off RL_STATE_ISEARCH, which it does using _rl_isearch_cleanup. */ +int +_rl_isearch_callback (_rl_search_cxt *cxt) +{ + int c, r; + + c = _rl_search_getchar (cxt); + /* We might want to handle EOF here */ + r = _rl_isearch_dispatch (cxt, cxt->lastc); + + return (r <= 0) ? _rl_isearch_cleanup (cxt, r) : 0; +} +#endif diff --git a/keymaps.c b/keymaps.c new file mode 100644 index 0000000..4ade30b --- /dev/null +++ b/keymaps.c @@ -0,0 +1,174 @@ +/* keymaps.c -- Functions and keymaps for the GNU Readline library. */ + +/* Copyright (C) 1988,1989-2009,2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include /* 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 (void) +{ + register int i; + Keymap keymap; + + keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); + for (i = 0; i < KEYMAP_SIZE; i++) + { + keymap[i].type = ISFUNC; + keymap[i].function = (rl_command_func_t *)NULL; + } + +#if 0 + for (i = 'A'; i < ('Z' + 1); i++) + { + keymap[i].type = ISFUNC; + keymap[i].function = rl_do_lowercase_version; + } +#endif + + return (keymap); +} + +/* A convenience function that returns 1 if there are no keys bound to + functions in KEYMAP */ +int +rl_empty_keymap (Keymap keymap) +{ + int i; + + for (i = 0; i < ANYOTHERKEY; i++) + { + if (keymap[i].type != ISFUNC || keymap[i].function) + return 0; + } + return 1; +} + +/* Return a new keymap which is a copy of MAP. Just copies pointers, does + not copy text of macros or descend into child keymaps. */ +Keymap +rl_copy_keymap (Keymap map) +{ + register int i; + Keymap temp; + + temp = rl_make_bare_keymap (); + for (i = 0; i < KEYMAP_SIZE; i++) + { + temp[i].type = map[i].type; + temp[i].function = map[i].function; + } + return (temp); +} + +/* Return a new keymap with the printing characters bound to rl_insert, + the uppercase Meta characters bound to run their lowercase equivalents, + and the Meta digits bound to produce numeric arguments. */ +Keymap +rl_make_keymap (void) +{ + register int i; + Keymap newmap; + + newmap = rl_make_bare_keymap (); + + /* All ASCII printing characters are self-inserting. */ + for (i = ' '; i < 127; i++) + newmap[i].function = rl_insert; + + newmap[TAB].function = rl_insert; + newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */ + newmap[CTRL('H')].function = rl_rubout; + +#if KEYMAP_SIZE > 128 + /* Printing characters in ISO Latin-1 and some 8-bit character sets. */ + for (i = 128; i < 256; i++) + newmap[i].function = rl_insert; +#endif /* KEYMAP_SIZE > 128 */ + + return (newmap); +} + +/* Free the storage associated with MAP. */ +void +rl_discard_keymap (Keymap map) +{ + int i; + + if (map == 0) + return; + + for (i = 0; i < KEYMAP_SIZE; i++) + { + switch (map[i].type) + { + case ISFUNC: + break; + + case ISKMAP: + rl_discard_keymap ((Keymap)map[i].function); + xfree ((char *)map[i].function); + break; + + case ISMACR: + xfree ((char *)map[i].function); + break; + } + } +} + +/* Convenience function that discards, then frees, MAP. */ +void +rl_free_keymap (Keymap map) +{ + rl_discard_keymap (map); + xfree ((char *)map); +} diff --git a/keymaps.h b/keymaps.h new file mode 100644 index 0000000..2903814 --- /dev/null +++ b/keymaps.h @@ -0,0 +1,100 @@ +/* keymaps.h -- Manipulation of readline keymaps. */ + +/* Copyright (C) 1987, 1989, 1992-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#ifndef _KEYMAPS_H_ +#define _KEYMAPS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (READLINE_LIBRARY) +# include "rlstdc.h" +# include "chardefs.h" +# include "rltypedefs.h" +#else +# include +# include +# include +#endif + +/* A keymap contains one entry for each key in the ASCII set. + Each entry consists of a type and a pointer. + FUNCTION is the address of a function to run, or the + address of a keymap to indirect through. + TYPE says which kind of thing FUNCTION is. */ +typedef struct _keymap_entry { + char type; + rl_command_func_t *function; +} KEYMAP_ENTRY; + +/* This must be large enough to hold bindings for all of the characters + in a desired character set (e.g, 128 for ASCII, 256 for ISO Latin-x, + and so on) plus one for subsequence matching. */ +#define KEYMAP_SIZE 257 +#define ANYOTHERKEY KEYMAP_SIZE-1 + +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 (void); + +/* Return a new keymap which is a copy of MAP. */ +extern Keymap rl_copy_keymap (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 (void); + +/* Free the storage associated with a keymap. */ +extern void rl_discard_keymap (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 (const char *); + +/* Return the current keymap. */ +extern Keymap rl_get_keymap (void); + +/* Set the current keymap to MAP. */ +extern void rl_set_keymap (Keymap); + +/* Set the name of MAP to NAME */ +extern int rl_set_keymap_name (const char *, Keymap); + +#ifdef __cplusplus +} +#endif + +#endif /* _KEYMAPS_H_ */ diff --git a/kill.c b/kill.c new file mode 100644 index 0000000..4cf933b --- /dev/null +++ b/kill.c @@ -0,0 +1,900 @@ +/* kill.c -- kill ring management. */ + +/* Copyright (C) 1994-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Killing Mechanism */ +/* */ +/* **************************************************************** */ + +/* What we assume for a max number of kills. */ +#define DEFAULT_MAX_KILLS 10 + +/* The real variable to look at to find out when to flush kills. */ +static int rl_max_kills = DEFAULT_MAX_KILLS; + +/* Where to store killed text. */ +static char **rl_kill_ring = (char **)NULL; + +/* Where we are in the kill ring. */ +static int rl_kill_index; + +/* How many slots we have in the kill ring. */ +static int rl_kill_ring_length; + +static int _rl_copy_to_kill_ring (char *, int); +static int region_kill_internal (int); +static int _rl_copy_word_as_kill (int, int); +static int rl_yank_nth_arg_internal (int, int, int); + +/* How to say that you only want to save a certain amount + of kill material. */ +int +rl_set_retained_kills (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 (char *text, int append) +{ + char *old, *new; + int slot; + + /* First, find the slot to work with. */ + if (_rl_last_command_was_kill == 0 || rl_kill_ring == 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; + xfree (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 + 1) * 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_kill_ring[slot] && rl_editing_mode != vi_mode) + { + old = rl_kill_ring[slot]; + new = (char *)xmalloc (1 + strlen (old) + strlen (text)); + + if (append) + { + strcpy (new, old); + strcat (new, text); + } + else + { + strcpy (new, text); + strcat (new, old); + } + xfree (old); + xfree (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 (int from, int 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 (int count, int key) +{ + int orig_point; + + if (count < 0) + return (rl_backward_kill_word (-count, key)); + else + { + orig_point = rl_point; + rl_forward_word (count, key); + + if (rl_point != orig_point) + rl_kill_text (orig_point, rl_point); + + rl_point = orig_point; + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Rubout the word before point, placing it on the kill ring. */ +int +rl_backward_kill_word (int count, int key) +{ + int orig_point; + + if (count < 0) + return (rl_kill_word (-count, key)); + else + { + orig_point = rl_point; + rl_backward_word (count, key); + + if (rl_point != orig_point) + rl_kill_text (orig_point, rl_point); + + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Kill from here to the end of the line. If DIRECTION is negative, kill + back to the line start instead. */ +int +rl_kill_line (int direction, int key) +{ + int orig_point; + + if (direction < 0) + return (rl_backward_kill_line (1, key)); + else + { + orig_point = rl_point; + rl_end_of_line (1, key); + if (orig_point != rl_point) + rl_kill_text (orig_point, rl_point); + rl_point = orig_point; + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Kill backwards to the start of the line. If DIRECTION is negative, kill + forwards to the line end instead. */ +int +rl_backward_kill_line (int direction, int key) +{ + int orig_point; + + if (direction < 0) + return (rl_kill_line (1, key)); + else + { + if (rl_point == 0) + rl_ding (); + else + { + orig_point = rl_point; + rl_beg_of_line (1, key); + if (rl_point != orig_point) + rl_kill_text (orig_point, rl_point); + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + } + return 0; +} + +/* Kill the whole line, no matter where point is. */ +int +rl_kill_full_line (int count, int key) +{ + rl_begin_undo_group (); + rl_point = 0; + rl_kill_text (rl_point, rl_end); + rl_mark = 0; + rl_end_undo_group (); + return 0; +} + +/* The next two functions mimic unix line editing behaviour, except they + save the deleted text on the kill ring. This is safer than not saving + it, and since we have a ring, nobody should get screwed. */ + +/* This does what C-w does in Unix. We can't prevent people from + using behaviour that they expect. */ +int +rl_unix_word_rubout (int count, int key) +{ + int orig_point; + + if (rl_point == 0) + rl_ding (); + else + { + orig_point = rl_point; + if (count <= 0) + count = 1; + + while (count--) + { + while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) + rl_point--; + + while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0)) + rl_point--; /* XXX - multibyte? */ + } + + rl_kill_text (orig_point, rl_point); + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + + return 0; +} + +/* This deletes one filename component in a Unix pathname. That is, it + deletes backward to directory separator (`/') or whitespace. */ +int +rl_unix_filename_rubout (int count, int key) +{ + int orig_point, c; + + if (rl_point == 0) + rl_ding (); + else + { + orig_point = rl_point; + if (count <= 0) + count = 1; + + while (count--) + { + c = rl_line_buffer[rl_point - 1]; + + /* First move backwards through whitespace */ + while (rl_point && whitespace (c)) + { + rl_point--; + c = rl_line_buffer[rl_point - 1]; + } + + /* Consume one or more slashes. */ + if (c == '/') + { + int i; + + i = rl_point - 1; + while (i > 0 && c == '/') + c = rl_line_buffer[--i]; + if (i == 0 || whitespace (c)) + { + rl_point = i + whitespace (c); + continue; /* slashes only */ + } + c = '/'; + } + + while (rl_point && (whitespace (c) || c == '/')) + { + rl_point--; + c = rl_line_buffer[rl_point - 1]; + } + + while (rl_point && (whitespace (c) == 0) && c != '/') + { + rl_point--; /* XXX - multibyte? */ + c = rl_line_buffer[rl_point - 1]; + } + } + + rl_kill_text (orig_point, rl_point); + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + + return 0; +} + +/* Here is C-u doing what Unix does. You don't *have* to use these + key-bindings. We have a choice of killing the entire line, or + killing from where we are to the start of the line. We choose the + latter, because if you are a Unix weenie, then you haven't backspaced + into the line at all, and if you aren't, then you know what you are + doing. */ +int +rl_unix_line_discard (int count, int key) +{ + if (rl_point == 0) + rl_ding (); + else + { + rl_kill_text (rl_point, 0); + rl_point = 0; + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Copy the text in the `region' to the kill ring. If DELETE is non-zero, + delete the text from the line as well. */ +static int +region_kill_internal (int delete) +{ + char *text; + + if (rl_mark != rl_point) + { + text = rl_copy_text (rl_point, rl_mark); + if (delete) + rl_delete_text (rl_point, rl_mark); + _rl_copy_to_kill_ring (text, rl_point < rl_mark); + } + + _rl_fix_point (1); + _rl_last_command_was_kill++; + return 0; +} + +/* Copy the text in the region to the kill ring. */ +int +rl_copy_region_to_kill (int count, int key) +{ + return (region_kill_internal (0)); +} + +/* Kill the text between the point and mark. */ +int +rl_kill_region (int count, int key) +{ + int r, npoint; + + npoint = (rl_point < rl_mark) ? rl_point : rl_mark; + r = region_kill_internal (1); + rl_point = npoint; + _rl_fix_point (1); + 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 (int count, int 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 (int count, int key) +{ + if (count < 0) + return (rl_copy_backward_word (-count, key)); + + return (_rl_copy_word_as_kill (count, 1)); +} + +int +rl_copy_backward_word (int count, int 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 (int count, int key) +{ + 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 (int count, int 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; + } +} + +#if defined (VI_MODE) +int +rl_vi_yank_pop (int count, int key) +{ + int l, n, origpoint; + + if (((rl_last_func != rl_vi_yank_pop) && (rl_last_func != rl_vi_put)) || + !rl_kill_ring) + { + _rl_abort_internal (); + return 1; + } + + l = strlen (rl_kill_ring[rl_kill_index]); +#if 0 /* TAG:readline-8.3 8/29/2022 matteopaolini1995@gmail.com */ + origpoint = rl_point; + n = rl_point - l + 1; +#else + n = rl_point - l; +#endif + if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l)) + { +#if 0 /* TAG:readline-8.3 */ + rl_delete_text (n, n + l); /* remember vi cursor positioning */ + rl_point = origpoint - l; +#else + rl_delete_text (n, rl_point); + rl_point = n; +#endif + rl_kill_index--; + if (rl_kill_index < 0) + rl_kill_index = rl_kill_ring_length - 1; + rl_vi_put (1, 'p'); + return 0; + } + else + { + _rl_abort_internal (); + return 1; + } +} +#endif /* VI_MODE */ + +/* 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 (int count, int key, int history_skip) +{ + register HIST_ENTRY *entry; + char *arg; + int i, pos; + + pos = where_history (); + + if (history_skip) + { + for (i = 0; i < history_skip; i++) + entry = previous_history (); + } + + entry = previous_history (); + + history_set_pos (pos); + + if (entry == 0) + { + rl_ding (); + return 1; + } + + arg = history_arg_extract (count, count, entry->line); + if (!arg || !*arg) + { + rl_ding (); + FREE (arg); + return 1; + } + + rl_begin_undo_group (); + + _rl_set_mark_at_pos (rl_point); + +#if defined (VI_MODE) + /* Vi mode always inserts a space before yanking the argument, and it + inserts it right *after* rl_point. */ + if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) + { + rl_vi_append_mode (1, key); + rl_insert_text (" "); + } +#endif /* VI_MODE */ + + rl_insert_text (arg); + xfree (arg); + + rl_end_undo_group (); + return 0; +} + +/* Yank the COUNTth argument from the previous history line. */ +int +rl_yank_nth_arg (int count, int key) +{ + return (rl_yank_nth_arg_internal (count, key, 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 (int count, int 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 < 0) /* XXX - was < 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; +} + +/* Having read the special escape sequence denoting the beginning of a + `bracketed paste' sequence, read the rest of the pasted input until the + closing sequence and return the pasted text. */ +char * +_rl_bracketed_text (size_t *lenp) +{ + int c; + size_t len, cap; + char *buf; + + len = 0; + buf = xmalloc (cap = 64); + buf[0] = '\0'; + + RL_SETSTATE (RL_STATE_MOREINPUT); + while ((c = rl_read_key ()) >= 0) + { + if (RL_ISSTATE (RL_STATE_MACRODEF)) + _rl_add_macro_char (c); + + if (c == '\r') /* XXX */ + c = '\n'; + + if (len == cap) + buf = xrealloc (buf, cap *= 2); + + buf[len++] = c; + if (len >= BRACK_PASTE_SLEN && c == BRACK_PASTE_LAST && + STREQN (buf + len - BRACK_PASTE_SLEN, BRACK_PASTE_SUFF, BRACK_PASTE_SLEN)) + { + len -= BRACK_PASTE_SLEN; + break; + } + } + RL_UNSETSTATE (RL_STATE_MOREINPUT); + + if (c >= 0) + { + if (len == cap) + buf = xrealloc (buf, cap + 1); + buf[len] = '\0'; + } + + if (lenp) + *lenp = len; + return (buf); +} + +/* Having read the special escape sequence denoting the beginning of a + `bracketed paste' sequence, read the rest of the pasted input until the + closing sequence and insert the pasted text as a single unit without + interpretation. Temporarily highlight the inserted text. */ +int +rl_bracketed_paste_begin (int count, int key) +{ + int retval, c; + size_t len, cap; + char *buf; + + buf = _rl_bracketed_text (&len); + rl_mark = rl_point; + retval = rl_insert_text (buf) == len ? 0 : 1; + if (_rl_enable_active_region) + rl_activate_mark (); + + xfree (buf); + return (retval); +} + +int +_rl_read_bracketed_paste_prefix (int c) +{ + char pbuf[BRACK_PASTE_SLEN+1], *pbpref; + int key, ind, j; + + pbpref = BRACK_PASTE_PREF; /* XXX - debugging */ + if (c != pbpref[0]) + return (0); + pbuf[ind = 0] = c; + while (ind < BRACK_PASTE_SLEN-1 && + (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && + _rl_pushed_input_available () == 0 && + _rl_input_queued (0)) + { + key = rl_read_key (); /* XXX - for now */ + if (key < 0) + break; + pbuf[++ind] = key; + if (pbuf[ind] != pbpref[ind]) + break; + } + + if (ind < BRACK_PASTE_SLEN-1) /* read incomplete sequence */ + { + while (ind >= 0) + _rl_unget_char (pbuf[ind--]); + return (key < 0 ? key : 0); + } + return (key < 0 ? key : 1); +} + +/* Get a character from wherever we read input, handling input in bracketed + paste mode. If we don't have or use bracketed paste mode, this can be + used in place of rl_read_key(). */ +int +_rl_bracketed_read_key () +{ + int c, r; + char *pbuf; + size_t pblen; + + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (c < 0) + return -1; + + /* read pasted data with bracketed-paste mode enabled. */ + if (_rl_enable_bracketed_paste && c == ESC && (r = _rl_read_bracketed_paste_prefix (c)) == 1) + { + pbuf = _rl_bracketed_text (&pblen); + if (pblen == 0) + { + xfree (pbuf); + return 0; /* XXX */ + } + c = (unsigned char)pbuf[0]; + if (pblen > 1) + { + while (--pblen > 0) + _rl_unget_char ((unsigned char)pbuf[pblen]); + } + xfree (pbuf); + } + + return c; +} + +/* Get a character from wherever we read input, handling input in bracketed + paste mode. If we don't have or use bracketed paste mode, this can be + used in place of rl_read_key(). */ +int +_rl_bracketed_read_mbstring (char *mb, int mlen) +{ + int c, r; + + c = _rl_bracketed_read_key (); + if (c < 0) + return -1; + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + c = _rl_read_mbstring (c, mb, mlen); + else +#endif + mb[0] = c; + mb[mlen] = '\0'; /* just in case */ + + return c; +} + +/* A special paste command for Windows users. */ +#if defined (_WIN32) +#include + +int +rl_paste_from_clipboard (int count, int key) +{ + char *data, *ptr; + int len; + + if (OpenClipboard (NULL) == 0) + return (0); + + data = (char *)GetClipboardData (CF_TEXT); + if (data) + { + ptr = strchr (data, '\r'); + if (ptr) + { + len = ptr - data; + ptr = (char *)xmalloc (len + 1); + ptr[len] = '\0'; + strncpy (ptr, data, len); + } + else + ptr = data; + _rl_set_mark_at_pos (rl_point); + rl_insert_text (ptr); + if (ptr != data) + xfree (ptr); + CloseClipboard (); + } + return (0); +} +#endif /* _WIN32 */ diff --git a/m4/codeset.m4 b/m4/codeset.m4 new file mode 100644 index 0000000..280f556 --- /dev/null +++ b/m4/codeset.m4 @@ -0,0 +1,24 @@ +# codeset.m4 serial 5 (gettext-0.18.2) +dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019 Free Software +dnl Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[char* cs = nl_langinfo(CODESET); return !cs;]])], + [am_cv_langinfo_codeset=yes], + [am_cv_langinfo_codeset=no]) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE([HAVE_LANGINFO_CODESET], [1], + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/macro.c b/macro.c new file mode 100644 index 0000000..231a24b --- /dev/null +++ b/macro.c @@ -0,0 +1,334 @@ +/* macro.c -- keyboard macros for readline. */ + +/* Copyright (C) 1994-2009,2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +/* 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 MAX_MACRO_LEVEL 16 + +/* **************************************************************** */ +/* */ +/* Hacking Keyboard Macros */ +/* */ +/* **************************************************************** */ + +/* The currently executing macro string. If this is non-zero, + then it is a malloc ()'ed string where input is coming from. */ +char *rl_executing_macro = (char *)NULL; + +/* The offset in the above string to the next character to be read. */ +static int executing_macro_index; + +/* The current macro string being built. Characters get stuffed + in here by add_macro_char (). */ +static char *current_macro = (char *)NULL; + +/* The size of the buffer allocated to current_macro. */ +static int current_macro_size; + +/* The index at which characters are being added to current_macro. */ +static int current_macro_index; + +/* A structure used to save nested macro strings. + It is a linked list of string/index for each saved macro. */ +struct saved_macro { + struct saved_macro *next; + char *string; + int sindex; +}; + +/* The list of saved macros. */ +static struct saved_macro *macro_list = (struct saved_macro *)NULL; + +static int macro_level = 0; + +/* Set up to read subsequent input from STRING. + STRING is free ()'ed when we are done with it. */ +void +_rl_with_macro_input (char *string) +{ + if (macro_level > MAX_MACRO_LEVEL) + { + _rl_errmsg ("maximum macro execution nesting level exceeded"); + _rl_abort_internal (); + return; + } + +#if 0 + if (rl_executing_macro) /* XXX - later */ +#endif + _rl_push_executing_macro (); + rl_executing_macro = string; + executing_macro_index = 0; + RL_SETSTATE(RL_STATE_MACROINPUT); +} + +/* Return the next character available from a macro, or 0 if + there are no macro characters. */ +int +_rl_next_macro_key (void) +{ + int c; + + if (rl_executing_macro == 0) + return (0); + + if (rl_executing_macro[executing_macro_index] == 0) + { + _rl_pop_executing_macro (); + return (_rl_next_macro_key ()); + } + +#if defined (READLINE_CALLBACKS) + c = rl_executing_macro[executing_macro_index++]; + if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0) + _rl_pop_executing_macro (); + return c; +#else + /* XXX - consider doing the same as the callback code, just not testing + whether we're running in callback mode */ + return (rl_executing_macro[executing_macro_index++]); +#endif +} + +int +_rl_peek_macro_key (void) +{ + if (rl_executing_macro == 0) + return (0); + if (rl_executing_macro[executing_macro_index] == 0 && (macro_list == 0 || macro_list->string == 0)) + return (0); + if (rl_executing_macro[executing_macro_index] == 0 && macro_list && macro_list->string) + return (macro_list->string[0]); + return (rl_executing_macro[executing_macro_index]); +} + +int +_rl_prev_macro_key (void) +{ + if (rl_executing_macro == 0) + return (0); + + if (executing_macro_index == 0) + return (0); + + executing_macro_index--; + return (rl_executing_macro[executing_macro_index]); +} + +/* Save the currently executing macro on a stack of saved macros. */ +void +_rl_push_executing_macro (void) +{ + 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; + + macro_level++; +} + +/* Discard the current macro, replacing it with the one + on the top of the stack of saved macros. */ +void +_rl_pop_executing_macro (void) +{ + struct saved_macro *macro; + + FREE (rl_executing_macro); + rl_executing_macro = (char *)NULL; + executing_macro_index = 0; + + if (macro_list) + { + macro = macro_list; + rl_executing_macro = macro_list->string; + executing_macro_index = macro_list->sindex; + macro_list = macro_list->next; + xfree (macro); + } + + macro_level--; + + if (rl_executing_macro == 0) + RL_UNSETSTATE(RL_STATE_MACROINPUT); +} + +/* Add a character to the macro being built. */ +void +_rl_add_macro_char (int c) +{ + if (current_macro_index + 1 >= current_macro_size) + { + if (current_macro == 0) + current_macro = (char *)xmalloc (current_macro_size = 25); + else + current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); + } + + current_macro[current_macro_index++] = c; + current_macro[current_macro_index] = '\0'; +} + +void +_rl_kill_kbd_macro (void) +{ + if (current_macro) + { + xfree (current_macro); + current_macro = (char *) NULL; + } + current_macro_size = current_macro_index = 0; + + FREE (rl_executing_macro); + rl_executing_macro = (char *) NULL; + executing_macro_index = 0; + + RL_UNSETSTATE(RL_STATE_MACRODEF); +} + +/* Begin defining a keyboard macro. + Keystrokes are recorded as they are executed. + End the definition with rl_end_kbd_macro (). + If a numeric argument was explicitly typed, then append this + definition to the end of the existing macro, and start by + re-executing the existing macro. */ +int +rl_start_kbd_macro (int ignore1, int ignore2) +{ + if (RL_ISSTATE (RL_STATE_MACRODEF)) + { + _rl_abort_internal (); + return 1; + } + + if (rl_explicit_arg) + { + if (current_macro) + _rl_with_macro_input (savestring (current_macro)); + } + else + current_macro_index = 0; + + RL_SETSTATE(RL_STATE_MACRODEF); + return 0; +} + +/* Stop defining a keyboard macro. + A numeric argument says to execute the macro right now, + that many times, counting the definition as the first time. */ +int +rl_end_kbd_macro (int count, int ignore) +{ + if (RL_ISSTATE (RL_STATE_MACRODEF) == 0) + { + _rl_abort_internal (); + return 1; + } + + current_macro_index -= rl_key_sequence_length; + if (current_macro_index < 0) + current_macro_index = 0; + current_macro[current_macro_index] = '\0'; + + RL_UNSETSTATE(RL_STATE_MACRODEF); + + return (rl_call_last_kbd_macro (--count, 0)); +} + +/* Execute the most recently defined keyboard macro. + COUNT says how many times to execute it. */ +int +rl_call_last_kbd_macro (int count, int ignore) +{ + if (current_macro == 0) + _rl_abort_internal (); + + if (RL_ISSTATE (RL_STATE_MACRODEF)) + { + rl_ding (); /* no recursive macros */ + current_macro[--current_macro_index] = '\0'; /* erase this char */ + return 0; + } + + while (count--) + _rl_with_macro_input (savestring (current_macro)); + return 0; +} + +int +rl_print_last_kbd_macro (int count, int ignore) +{ + char *m; + + if (current_macro == 0) + { + rl_ding (); + return 0; + } + m = _rl_untranslate_macro_value (current_macro, 1); + rl_crlf (); + printf ("%s", m); + fflush (stdout); + rl_crlf (); + FREE (m); + rl_forced_update_display (); + rl_display_fixed = 1; + + return 0; +} + +void +rl_push_macro_input (char *macro) +{ + _rl_with_macro_input (macro); +} diff --git a/mbutil.c b/mbutil.c new file mode 100644 index 0000000..47e9100 --- /dev/null +++ b/mbutil.c @@ -0,0 +1,524 @@ +/* mbutil.c -- readline multibyte character utility functions */ + +/* Copyright (C) 2001-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include "posixjmp.h" + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#if defined (TIOCSTAT_IN_SYS_IOCTL) +# include +#endif /* TIOCSTAT_IN_SYS_IOCTL */ + +/* Some standard library routines. */ +#include "readline.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* Declared here so it can be shared between the readline and history + libraries. */ +#if defined (HANDLE_MULTIBYTE) +int rl_byte_oriented = 0; +#else +int rl_byte_oriented = 1; +#endif + +/* Ditto */ +int _rl_utf8locale = 0; + +/* **************************************************************** */ +/* */ +/* Multibyte Character Utility Functions */ +/* */ +/* **************************************************************** */ + +#if defined(HANDLE_MULTIBYTE) + +/* **************************************************************** */ +/* */ +/* UTF-8 specific Character Utility Functions */ +/* */ +/* **************************************************************** */ + +/* Return the length in bytes of the possibly-multibyte character beginning + at S. Encoding is UTF-8. */ +static int +_rl_utf8_mblen (const char *s, size_t n) +{ + unsigned char c, c1, c2, c3; + + if (s == 0) + return (0); /* no shift states */ + if (n <= 0) + return (-1); + + c = (unsigned char)*s; + if (c < 0x80) + return (c != 0); + if (c >= 0xc2) + { + c1 = (unsigned char)s[1]; + if (c < 0xe0) + { + if (n == 1) + return -2; + if (n >= 2 && (c1 ^ 0x80) < 0x40) + return 2; + } + else if (c < 0xf0) + { + if (n == 1) + return -2; + if ((c1 ^ 0x80) < 0x40 + && (c >= 0xe1 || c1 >= 0xa0) + && (c != 0xed || c1 < 0xa0)) + { + if (n == 2) + return -2; + c2 = (unsigned char)s[2]; + if ((c2 ^ 0x80) < 0x40) + return 3; + } + } + else if (c < 0xf4) + { + if (n == 1) + return -2; + if (((c1 ^ 0x80) < 0x40) + && (c >= 0xf1 || c1 >= 0x90) + && (c < 0xf4 || (c == 0xf4 && c1 < 0x90))) + { + if (n == 2) + return -2; + c2 = (unsigned char)s[2]; + if ((c2 ^ 0x80) < 0x40) + { + if (n == 3) + return -2; + c3 = (unsigned char)s[3]; + if ((c3 ^ 0x80) < 0x40) + return 4; + } + } + } + } + /* invalid or incomplete multibyte character */ + return -1; +} + +static int +_rl_find_next_mbchar_internal (char *string, int seed, int count, int find_non_zero) +{ + size_t tmp, len; + mbstate_t ps; + int point; + WCHAR_T wc; + + tmp = 0; + + memset(&ps, 0, sizeof (mbstate_t)); + if (seed < 0) + seed = 0; + if (count <= 0) + return seed; + + point = seed + _rl_adjust_point (string, seed, &ps); + /* if _rl_adjust_point returns -1, the character or string is invalid. + treat as a byte. */ + if (point == seed - 1) /* invalid */ + return seed + 1; + + /* if this is true, means that seed was not pointing to a byte indicating + the beginning of a multibyte character. Correct the point and consume + one char. */ + if (seed < point) + count--; + + while (count > 0) + { + len = strlen (string + point); + if (len == 0) + break; + if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point])) + { + tmp = 1; + wc = (WCHAR_T) string[point]; + memset(&ps, 0, sizeof(mbstate_t)); + } + else + tmp = MBRTOWC (&wc, string+point, len, &ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* invalid bytes. assume a byte represents a character */ + point++; + count--; + /* reset states. */ + memset(&ps, 0, sizeof(mbstate_t)); + } + else if (MB_NULLWCH (tmp)) + break; /* found wide '\0' */ + else + { + /* valid bytes */ + point += tmp; + if (find_non_zero) + { + if (WCWIDTH (wc) == 0) + continue; + else + count--; + } + else + count--; + } + } + + if (find_non_zero) + { + tmp = MBRTOWC (&wc, string + point, strlen (string + point), &ps); + while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && WCWIDTH (wc) == 0) + { + point += tmp; + tmp = MBRTOWC (&wc, string + point, strlen (string + point), &ps); + } + } + + return point; +} + +static inline int +_rl_test_nonzero (char *string, int ind, int len) +{ + size_t tmp; + WCHAR_T wc; + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); + tmp = MBRTOWC (&wc, string + ind, len - ind, &ps); + /* treat invalid multibyte sequences as non-zero-width */ + return (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp) || WCWIDTH (wc) > 0); +} + +/* experimental -- needs to handle zero-width characters better */ +static int +_rl_find_prev_utf8char (char *string, int seed, int find_non_zero) +{ + char *s; + unsigned char b; + int save, prev; + size_t len; + + if (find_non_zero) + len = RL_STRLEN (string); + + prev = seed - 1; + while (prev >= 0) + { + b = (unsigned char)string[prev]; + if (UTF8_SINGLEBYTE (b)) + return (prev); + + save = prev; + + /* Move back until we're not in the middle of a multibyte char */ + if (UTF8_MBCHAR (b)) + { + while (prev > 0 && (b = (unsigned char)string[--prev]) && UTF8_MBCHAR (b)) + ; + } + + if (UTF8_MBFIRSTCHAR (b)) + { + if (find_non_zero) + { + if (_rl_test_nonzero (string, prev, len)) + return (prev); + else /* valid but WCWIDTH (wc) == 0 */ + prev = prev - 1; + } + else + return (prev); + } + else + return (save); /* invalid utf-8 multibyte sequence */ + } + + return ((prev < 0) ? 0 : prev); +} + +/*static*/ int +_rl_find_prev_mbchar_internal (char *string, int seed, int find_non_zero) +{ + mbstate_t ps; + int prev, non_zero_prev, point, length; + size_t tmp; + WCHAR_T wc; + + if (_rl_utf8locale) + return (_rl_find_prev_utf8char (string, seed, find_non_zero)); + + memset(&ps, 0, sizeof(mbstate_t)); + length = strlen(string); + + if (seed < 0) + return 0; + else if (length < seed) + return length; + + prev = non_zero_prev = point = 0; + while (point < seed) + { + if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point])) + { + tmp = 1; + wc = (WCHAR_T) string[point]; + memset(&ps, 0, sizeof(mbstate_t)); + } + else + tmp = MBRTOWC (&wc, string + point, length - point, &ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* in this case, bytes are invalid or too short to compose + multibyte char, so assume that the first byte represents + a single character anyway. */ + tmp = 1; + /* clear the state of the byte sequence, because + in this case effect of mbstate is undefined */ + memset(&ps, 0, sizeof (mbstate_t)); + + /* Since we're assuming that this byte represents a single + non-zero-width character, don't forget about it. */ + prev = point; + } + else if (MB_NULLWCH (tmp)) + break; /* Found '\0' char. Can this happen? */ + else + { + if (find_non_zero) + { + if (WCWIDTH (wc) != 0) + prev = point; + } + else + prev = point; + } + + point += tmp; + } + + return prev; +} + +/* return the number of bytes parsed from the multibyte sequence starting + at src, if a non-L'\0' wide character was recognized. It returns 0, + if a L'\0' wide character was recognized. It returns (size_t)(-1), + if an invalid multibyte sequence was encountered. It returns (size_t)(-2) + if it couldn't parse a complete multibyte character. */ +int +_rl_get_char_len (char *src, mbstate_t *ps) +{ + size_t tmp, l; + int mb_cur_max; + + /* Look at no more than MB_CUR_MAX characters */ + l = (size_t)strlen (src); + if (_rl_utf8locale && l > 0 && UTF8_SINGLEBYTE(*src)) + tmp = (*src != 0) ? 1 : 0; + else + { + mb_cur_max = MB_CUR_MAX; + tmp = mbrlen((const char *)src, (l < mb_cur_max) ? l : mb_cur_max, ps); + } + if (tmp == (size_t)(-2)) + { + /* too short to compose multibyte char */ + if (ps) + memset (ps, 0, sizeof(mbstate_t)); + return -2; + } + else if (tmp == (size_t)(-1)) + { + /* invalid to compose multibyte char */ + /* initialize the conversion state */ + if (ps) + memset (ps, 0, sizeof(mbstate_t)); + return -1; + } + else if (tmp == (size_t)0) + return 0; + else + return (int)tmp; +} + +/* compare the specified two characters. If the characters matched, + return 1. Otherwise return 0. */ +int +_rl_compare_chars (char *buf1, int pos1, mbstate_t *ps1, char *buf2, int pos2, mbstate_t *ps2) +{ + int i, w1, w2; + + if ((w1 = _rl_get_char_len (&buf1[pos1], ps1)) <= 0 || + (w2 = _rl_get_char_len (&buf2[pos2], ps2)) <= 0 || + (w1 != w2) || + (buf1[pos1] != buf2[pos2])) + return 0; + + for (i = 1; i < w1; i++) + if (buf1[pos1+i] != buf2[pos2+i]) + return 0; + + return 1; +} + +/* adjust pointed byte and find mbstate of the point of string. + adjusted point will be point <= adjusted_point, and returns + differences of the byte(adjusted_point - point). + if point is invalid (point < 0 || more than string length), + it returns -1 */ +int +_rl_adjust_point (char *string, int point, mbstate_t *ps) +{ + size_t tmp; + int length, pos; + + tmp = 0; + pos = 0; + length = strlen(string); + if (point < 0) + return -1; + if (length < point) + return -1; + + while (pos < point) + { + if (_rl_utf8locale && UTF8_SINGLEBYTE(string[pos])) + tmp = 1; + else + tmp = mbrlen (string + pos, length - pos, ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* in this case, bytes are invalid or too short to compose + multibyte char, so assume that the first byte represents + a single character anyway. */ + pos++; + /* clear the state of the byte sequence, because + in this case effect of mbstate is undefined */ + if (ps) + memset (ps, 0, sizeof (mbstate_t)); + } + else if (MB_NULLWCH (tmp)) + pos++; + else + pos += tmp; + } + + return (pos - point); +} + +int +_rl_is_mbchar_matched (char *string, int seed, int end, char *mbchar, int length) +{ + int i; + + if ((end - seed) < length) + return 0; + + for (i = 0; i < length; i++) + if (string[seed + i] != mbchar[i]) + return 0; + return 1; +} + +WCHAR_T +_rl_char_value (char *buf, int ind) +{ + size_t tmp; + WCHAR_T wc; + mbstate_t ps; + int l; + + if (MB_LEN_MAX == 1 || rl_byte_oriented) + return ((WCHAR_T) buf[ind]); + if (_rl_utf8locale && UTF8_SINGLEBYTE(buf[ind])) + return ((WCHAR_T) buf[ind]); + l = strlen (buf); + if (ind >= l - 1) + return ((WCHAR_T) buf[ind]); + if (l < ind) /* Sanity check */ + l = strlen (buf+ind); + memset (&ps, 0, sizeof (mbstate_t)); + tmp = MBRTOWC (&wc, buf + ind, l - ind, &ps); + if (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp)) + return ((WCHAR_T) buf[ind]); + return wc; +} +#endif /* HANDLE_MULTIBYTE */ + +/* Find next `count' characters started byte point of the specified seed. + If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte + characters. */ +#undef _rl_find_next_mbchar +int +_rl_find_next_mbchar (char *string, int seed, int count, int flags) +{ +#if defined (HANDLE_MULTIBYTE) + return _rl_find_next_mbchar_internal (string, seed, count, flags); +#else + return (seed + count); +#endif +} + +/* Find previous character started byte point of the specified seed. + Returned point will be point <= seed. If flags is MB_FIND_NONZERO, + we look for non-zero-width multibyte characters. */ +#undef _rl_find_prev_mbchar +int +_rl_find_prev_mbchar (char *string, int seed, int flags) +{ +#if defined (HANDLE_MULTIBYTE) + return _rl_find_prev_mbchar_internal (string, seed, flags); +#else + return ((seed == 0) ? seed : seed - 1); +#endif +} diff --git a/misc.c b/misc.c new file mode 100644 index 0000000..4bca9c5 --- /dev/null +++ b/misc.c @@ -0,0 +1,781 @@ +/* misc.c -- miscellaneous bindable readline functions. */ + +/* Copyright (C) 1987-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "histlib.h" +#include "rlshell.h" +#include "xmalloc.h" + +static int rl_digit_loop (void); +static void _rl_history_set_point (void); + +/* If non-zero, rl_get_previous_history and rl_get_next_history attempt + to preserve the value of rl_point from line to line. */ +int _rl_history_preserve_point = 0; + +_rl_arg_cxt _rl_argcxt; + +/* Saved target point for when _rl_history_preserve_point is set. Special + value of -1 means that point is at the end of the line. */ +int _rl_history_saved_point = -1; + +/* **************************************************************** */ +/* */ +/* Numeric Arguments */ +/* */ +/* **************************************************************** */ + +int +_rl_arg_overflow (void) +{ + if (rl_numeric_arg > 1000000) + { + _rl_argcxt = 0; + rl_explicit_arg = rl_numeric_arg = 0; + rl_ding (); + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + return 1; + } + return 0; +} + +void +_rl_arg_init (void) +{ + rl_save_prompt (); + _rl_argcxt = 0; + RL_SETSTATE(RL_STATE_NUMERICARG); +} + +int +_rl_arg_getchar (void) +{ + int c; + + rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + return c; +} + +/* Process C as part of the current numeric argument. Return -1 if the + argument should be aborted, 0 if we should not read any more chars, and + 1 if we should continue to read chars. */ +int +_rl_arg_dispatch (_rl_arg_cxt cxt, int c) +{ + int key, r; + + key = c; + + /* If we see a key bound to `universal-argument' after seeing digits, + it ends the argument but is otherwise ignored. */ + if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument) + { + if ((cxt & NUM_SAWDIGITS) == 0) + { + rl_numeric_arg *= 4; + return 1; + } + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_argcxt |= NUM_READONE; + return 0; /* XXX */ + } + else + { + key = _rl_bracketed_read_key (); + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + if (key < 0) + return -1; + return (_rl_dispatch (key, _rl_keymap)); + } + } + + c = UNMETA (c); + + if (_rl_digit_p (c)) + { + r = _rl_digit_value (c); + rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + r : r; + rl_explicit_arg = 1; + _rl_argcxt |= NUM_SAWDIGITS; + } + else if (c == '-' && rl_explicit_arg == 0) + { + rl_numeric_arg = 1; + _rl_argcxt |= NUM_SAWMINUS; + rl_arg_sign = -1; + } + else + { + /* Make M-- command equivalent to M--1 command. */ + if ((_rl_argcxt & NUM_SAWMINUS) && rl_numeric_arg == 1 && rl_explicit_arg == 0) + rl_explicit_arg = 1; + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + + r = _rl_dispatch (key, _rl_keymap); + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + /* At worst, this will cause an extra redisplay. Otherwise, + we have to wait until the next character comes in. */ + if (rl_done == 0) + (*rl_redisplay_function) (); + r = 0; + } + return r; + } + + return 1; +} + +/* Handle C-u style numeric args, as well as M--, and M-digits. */ +static int +rl_digit_loop (void) +{ + int c, r; + + while (1) + { + if (_rl_arg_overflow ()) + return 1; + + c = _rl_arg_getchar (); + + if (c < 0) + { + _rl_abort_internal (); + return -1; + } + + r = _rl_arg_dispatch (_rl_argcxt, c); + if (r <= 0 || (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)) + break; + } + + return r; +} + +/* Create a default argument. */ +void +_rl_reset_argument (void) +{ + rl_numeric_arg = rl_arg_sign = 1; + rl_explicit_arg = 0; + _rl_argcxt = 0; +} + +/* Start a numeric argument with initial value KEY */ +int +rl_digit_argument (int ignore, int key) +{ + _rl_arg_init (); + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_arg_dispatch (_rl_argcxt, key); + rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); + return 0; + } + else + { + rl_execute_next (key); + return (rl_digit_loop ()); + } +} + +/* C-u, universal argument. Multiply the current argument by 4. + Read a key. If the key has nothing to do with arguments, then + dispatch on it. If the key is the abort character then abort. */ +int +rl_universal_argument (int count, int key) +{ + _rl_arg_init (); + rl_numeric_arg *= 4; + + return (RL_ISSTATE (RL_STATE_CALLBACK) ? 0 : rl_digit_loop ()); +} + +int +_rl_arg_callback (_rl_arg_cxt cxt) +{ + int c, r; + + c = _rl_arg_getchar (); + if (c < 0) + return (1); /* EOF */ + + if (_rl_argcxt & NUM_READONE) + { + _rl_argcxt &= ~NUM_READONE; + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + rl_execute_next (c); + return 0; + } + + r = _rl_arg_dispatch (cxt, c); + if (r > 0) + rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); + return (r != 1); +} + +/* What to do when you abort reading an argument. */ +int +rl_discard_argument (void) +{ + rl_ding (); + rl_clear_message (); + _rl_reset_argument (); + + return 0; +} + +/* **************************************************************** */ +/* */ +/* History Utilities */ +/* */ +/* **************************************************************** */ + +/* We already have a history library, and that is what we use to control + the history features of readline. This is our local interface to + the history mechanism. */ + +/* While we are editing the history, this is the saved + version of the original line. */ +HIST_ENTRY *_rl_saved_line_for_history = (HIST_ENTRY *)NULL; + +/* Set the history pointer back to the last entry in the history. */ +void +_rl_start_using_history (void) +{ + using_history (); + if (_rl_saved_line_for_history) + _rl_free_saved_history_line (); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; + _rl_history_search_pos = -99; /* some random invalid history position */ +} + +/* Free the contents (and containing structure) of a HIST_ENTRY. */ +void +_rl_free_history_entry (HIST_ENTRY *entry) +{ + if (entry == 0) + return; + + FREE (entry->line); + FREE (entry->timestamp); + + xfree (entry); +} + +/* Perhaps put back the current line if it has changed. */ +int +rl_maybe_replace_line (void) +{ + HIST_ENTRY *temp; + + temp = current_history (); + /* If the current line has changed, save the changes. */ + if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list)) + { + temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); + xfree (temp->line); + FREE (temp->timestamp); + xfree (temp); + } + return 0; +} + +/* Restore the _rl_saved_line_for_history if there is one. */ +int +rl_maybe_unsave_line (void) +{ + if (_rl_saved_line_for_history) + { + /* Can't call with `1' because rl_undo_list might point to an undo + list from a history entry, as in rl_replace_from_history() below. */ + rl_replace_line (_rl_saved_line_for_history->line, 0); + rl_undo_list = (UNDO_LIST *)_rl_saved_line_for_history->data; + + /* Doesn't free `data'. */ + _rl_free_history_entry (_rl_saved_line_for_history); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; + rl_point = rl_end; /* rl_replace_line sets rl_end */ + } + else + rl_ding (); + return 0; +} + +/* Save the current line in _rl_saved_line_for_history. */ +int +rl_maybe_save_line (void) +{ + if (_rl_saved_line_for_history == 0) + { + _rl_saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); + _rl_saved_line_for_history->line = savestring (rl_line_buffer); + _rl_saved_line_for_history->timestamp = (char *)NULL; + _rl_saved_line_for_history->data = (char *)rl_undo_list; + } + + return 0; +} + +int +_rl_free_saved_history_line (void) +{ + UNDO_LIST *orig; + + if (_rl_saved_line_for_history) + { + if (rl_undo_list && rl_undo_list == (UNDO_LIST *)_rl_saved_line_for_history->data) + rl_undo_list = 0; + /* Have to free this separately because _rl_free_history entry can't: + it doesn't know whether or not this has application data. Only the + callers that know this is _rl_saved_line_for_history can know that + it's an undo list. */ + if (_rl_saved_line_for_history->data) + _rl_free_undo_list ((UNDO_LIST *)_rl_saved_line_for_history->data); + _rl_free_history_entry (_rl_saved_line_for_history); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; + } + return 0; +} + +static void +_rl_history_set_point (void) +{ + rl_point = (_rl_history_preserve_point && _rl_history_saved_point != -1) + ? _rl_history_saved_point + : rl_end; + if (rl_point > rl_end) + rl_point = rl_end; + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode && _rl_keymap != vi_insertion_keymap) + rl_point = 0; +#endif /* VI_MODE */ + + if (rl_editing_mode == emacs_mode) + rl_mark = (rl_point == rl_end ? 0 : rl_end); +} + +void +rl_replace_from_history (HIST_ENTRY *entry, int flags) +{ + /* Can't call with `1' because rl_undo_list might point to an undo list + from a history entry, just like we're setting up here. */ + rl_replace_line (entry->line, 0); + rl_undo_list = (UNDO_LIST *)entry->data; + rl_point = rl_end; + rl_mark = 0; + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + { + rl_point = 0; + rl_mark = rl_end; + } +#endif +} + +/* Process and free undo lists attached to each history entry prior to the + current entry, inclusive, reverting each line to its saved state. This + is destructive, and state about the current line is lost. This is not + intended to be called while actively editing, and the current line is + not assumed to have been added to the history list. */ +void +_rl_revert_previous_lines (void) +{ + int hpos; + HIST_ENTRY *entry; + UNDO_LIST *ul, *saved_undo_list; + char *lbuf; + + lbuf = savestring (rl_line_buffer); + saved_undo_list = rl_undo_list; + hpos = where_history (); + + entry = (hpos == history_length) ? previous_history () : current_history (); + while (entry) + { + if (ul = (UNDO_LIST *)entry->data) + { + if (ul == saved_undo_list) + saved_undo_list = 0; + /* Set up rl_line_buffer and other variables from history entry */ + rl_replace_from_history (entry, 0); /* entry->line is now current */ + entry->data = 0; /* entry->data is now current undo list */ + /* Undo all changes to this history entry */ + while (rl_undo_list) + rl_do_undo (); + /* And copy the reverted line back to the history entry, preserving + the timestamp. */ + FREE (entry->line); + entry->line = savestring (rl_line_buffer); + } + entry = previous_history (); + } + + /* Restore history state */ + rl_undo_list = saved_undo_list; /* may have been set to null */ + history_set_pos (hpos); + + /* reset the line buffer */ + rl_replace_line (lbuf, 0); + _rl_set_the_line (); + + /* and clean up */ + xfree (lbuf); +} + +/* Revert all lines in the history by making sure we are at the end of the + history before calling _rl_revert_previous_lines() */ +void +_rl_revert_all_lines (void) +{ + int pos; + + pos = where_history (); + using_history (); + _rl_revert_previous_lines (); + history_set_pos (pos); +} + +/* Free the history list, including private readline data and take care + of pointer aliases to history data. Resets rl_undo_list if it points + to an UNDO_LIST * saved as some history entry's data member. This + should not be called while editing is active. */ +void +rl_clear_history (void) +{ + HIST_ENTRY **hlist, *hent; + register int i; + UNDO_LIST *ul, *saved_undo_list; + + saved_undo_list = rl_undo_list; + hlist = history_list (); /* direct pointer, not copy */ + + for (i = 0; i < history_length; i++) + { + hent = hlist[i]; + if (ul = (UNDO_LIST *)hent->data) + { + if (ul == saved_undo_list) + saved_undo_list = 0; + _rl_free_undo_list (ul); + hent->data = 0; + } + _rl_free_history_entry (hent); + } + + history_offset = history_length = 0; + rl_undo_list = saved_undo_list; /* should be NULL */ +} + +/* **************************************************************** */ +/* */ +/* History Commands */ +/* */ +/* **************************************************************** */ + +/* Meta-< goes to the start of the history. */ +int +rl_beginning_of_history (int count, int 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 (int count, int key) +{ + rl_maybe_replace_line (); + using_history (); + rl_maybe_unsave_line (); + return 0; +} + +/* Move down to the next history line. */ +int +rl_get_next_history (int count, int key) +{ + HIST_ENTRY *temp; + + if (count < 0) + return (rl_get_previous_history (-count, key)); + + if (count == 0) + return 0; + + rl_maybe_replace_line (); + + /* either not saved by rl_newline or at end of line, so set appropriately. */ + if (_rl_history_saved_point == -1 && (rl_point || rl_end)) + _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; + + temp = (HIST_ENTRY *)NULL; + while (count) + { + temp = next_history (); + if (!temp) + break; + --count; + } + + if (temp == 0) + rl_maybe_unsave_line (); + else + { + rl_replace_from_history (temp, 0); + _rl_history_set_point (); + } + return 0; +} + +/* Get the previous item out of our interactive history, making it the current + line. If there is no previous history, just ding. */ +int +rl_get_previous_history (int count, int key) +{ + HIST_ENTRY *old_temp, *temp; + int had_saved_line; + + if (count < 0) + return (rl_get_next_history (-count, key)); + + if (count == 0 || history_list () == 0) + return 0; + + /* either not saved by rl_newline or at end of line, so set appropriately. */ + if (_rl_history_saved_point == -1 && (rl_point || rl_end)) + _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; + + /* If we don't have a line saved, then save this one. */ + had_saved_line = _rl_saved_line_for_history != 0; + rl_maybe_save_line (); + + /* If the current line has changed, save the changes. */ + rl_maybe_replace_line (); + + temp = old_temp = (HIST_ENTRY *)NULL; + while (count) + { + temp = previous_history (); + if (temp == 0) + break; + + old_temp = temp; + --count; + } + + /* If there was a large argument, and we moved back to the start of the + history, that is not an error. So use the last value found. */ + if (!temp && old_temp) + temp = old_temp; + + if (temp == 0) + { + if (had_saved_line == 0) + _rl_free_saved_history_line (); + rl_ding (); + } + else + { + rl_replace_from_history (temp, 0); + _rl_history_set_point (); + } + + return 0; +} + +/* With an argument, move back that many history lines, else move to the + beginning of history. */ +int +rl_fetch_history (int count, int c) +{ + int wanted, nhist; + + /* 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) + { + nhist = history_base + where_history (); + /* Negative arguments count back from the end of the history list. */ + wanted = (count >= 0) ? nhist - count : -count; + + if (wanted <= 0 || wanted >= nhist) + { + /* In vi mode, we don't change the line with an out-of-range + argument, as for the `G' command. */ + if (rl_editing_mode == vi_mode) + rl_ding (); + else + rl_beginning_of_history (0, 0); + } + else + rl_get_previous_history (wanted, c); + } + else + rl_beginning_of_history (count, 0); + + return (0); +} + +/* The equivalent of the Korn shell C-o operate-and-get-next-history-line + editing command. */ + +/* This could stand to be global to the readline library */ +static rl_hook_func_t *_rl_saved_internal_startup_hook = 0; +static int saved_history_logical_offset = -1; + +#define HISTORY_FULL() (history_is_stifled () && history_length >= history_max_entries) + +static int +set_saved_history () +{ + int absolute_offset, count; + + if (saved_history_logical_offset >= 0) + { + absolute_offset = saved_history_logical_offset - history_base; + count = where_history () - absolute_offset; + rl_get_previous_history (count, 0); + } + saved_history_logical_offset = -1; + _rl_internal_startup_hook = _rl_saved_internal_startup_hook; + + return (0); +} + +int +rl_operate_and_get_next (int count, int c) +{ + /* Accept the current line. */ + rl_newline (1, c); + + saved_history_logical_offset = rl_explicit_arg ? count : where_history () + history_base + 1; + + _rl_saved_internal_startup_hook = _rl_internal_startup_hook; + _rl_internal_startup_hook = set_saved_history; + + return 0; +} + +/* **************************************************************** */ +/* */ +/* Editing Modes */ +/* */ +/* **************************************************************** */ +/* How to toggle back and forth between editing modes. */ +int +rl_vi_editing_mode (int count, int key) +{ +#if defined (VI_MODE) + _rl_set_insert_mode (RL_IM_INSERT, 1); /* vi mode ignores insert mode */ + rl_editing_mode = vi_mode; + rl_vi_insert_mode (1, key); +#endif /* VI_MODE */ + + return 0; +} + +int +rl_emacs_editing_mode (int count, int key) +{ + rl_editing_mode = emacs_mode; + _rl_set_insert_mode (RL_IM_INSERT, 1); /* emacs mode default is insert mode */ + _rl_keymap = emacs_standard_keymap; + + if (_rl_show_mode_in_prompt) + _rl_reset_prompt (); + + return 0; +} + +/* Function for the rest of the library to use to set insert/overwrite mode. */ +void +_rl_set_insert_mode (int im, int force) +{ +#ifdef CURSOR_MODE + _rl_set_cursor (im, force); +#endif + + rl_insert_mode = im; +} + +/* Toggle overwrite mode. A positive explicit argument selects overwrite + mode. A negative or zero explicit argument selects insert mode. */ +int +rl_overwrite_mode (int count, int key) +{ + if (rl_explicit_arg == 0) + _rl_set_insert_mode (rl_insert_mode ^ 1, 0); + else if (count > 0) + _rl_set_insert_mode (RL_IM_OVERWRITE, 0); + else + _rl_set_insert_mode (RL_IM_INSERT, 0); + + return 0; +} diff --git a/nls.c b/nls.c new file mode 100644 index 0000000..5c6a13b --- /dev/null +++ b/nls.c @@ -0,0 +1,344 @@ +/* nls.c -- skeletal internationalization code. */ + +/* Copyright (C) 1996-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#if defined (HAVE_LANGINFO_CODESET) +# include +#endif + +#include + +#include "rldefs.h" +#include "readline.h" +#include "rlshell.h" +#include "rlprivate.h" +#include "xmalloc.h" + +static int utf8locale (char *); + +#define RL_DEFAULT_LOCALE "C" +static char *_rl_current_locale = 0; + +#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", + "utf8", + 0 +}; + +static char *normalize_codeset (char *); +#endif /* !HAVE_SETLOCALE */ + +static char *find_codeset (char *, size_t *); + +static char *_rl_get_locale_var (const char *); + +static char * +_rl_get_locale_var (const char *v) +{ + char *lspec; + + lspec = sh_get_env_value ("LC_ALL"); + if (lspec == 0 || *lspec == 0) + lspec = sh_get_env_value (v); + if (lspec == 0 || *lspec == 0) + lspec = sh_get_env_value ("LANG"); + + return lspec; +} + +static int +utf8locale (char *lspec) +{ + char *cp; + size_t len; + +#if HAVE_LANGINFO_CODESET + cp = nl_langinfo (CODESET); + return (STREQ (cp, "UTF-8") || STREQ (cp, "utf8")); +#else + cp = find_codeset (lspec, &len); + + if (cp == 0 || len < 4 || len > 5) + return 0; + return ((len == 5) ? strncmp (cp, "UTF-8", len) == 0 : strncmp (cp, "utf8", 4) == 0); +#endif +} + +/* Query the right environment variables and call setlocale() to initialize + the C library locale settings. */ +char * +_rl_init_locale (void) +{ + char *ret, *lspec; + + /* Set the LC_CTYPE locale category from environment variables. */ + lspec = _rl_get_locale_var ("LC_CTYPE"); + /* Since _rl_get_locale_var queries the right environment variables, + we query the current locale settings with setlocale(), and, if + that doesn't return anything, we set lspec to the empty string to + force the subsequent call to setlocale() to define the `native' + environment. */ +#if defined (HAVE_SETLOCALE) + if (lspec == 0 || *lspec == 0) + lspec = setlocale (LC_CTYPE, (char *)NULL); + if (lspec == 0) + lspec = ""; + ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */ +#else + ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec; +#endif + + _rl_utf8locale = (ret && *ret) ? utf8locale (ret) : 0; + + _rl_current_locale = savestring (ret); + return ret; +} + +/* If we have setlocale(3), just check the current LC_CTYPE category + value (passed as LOCALESTR), and go into eight-bit mode if it's not "C" + or "POSIX". If FORCE is non-zero, we reset the locale variables to values + appropriate for the C locale if the locale is "C" or "POSIX". FORCE is 0 + when this is called from _rl_init_eightbit, since we're modifying the + default initial values and don't need to change anything else. If we + don't have setlocale(3), we check the codeset portion of LOCALESTR against + a set of known values and go into eight-bit mode if it matches one of those. + Returns 1 if we set eight-bit (multibyte) mode. */ +static int +_rl_set_localevars (char *localestr, int force) +{ +#if defined (HAVE_SETLOCALE) + if (localestr && *localestr && (localestr[0] != 'C' || localestr[1]) && (STREQ (localestr, "POSIX") == 0)) + { + _rl_meta_flag = 1; + _rl_convert_meta_chars_to_ascii = 0; + _rl_output_meta_chars = 1; + return (1); + } + else if (force) + { + /* Default "C" locale settings. */ + _rl_meta_flag = 0; + _rl_convert_meta_chars_to_ascii = 1; + _rl_output_meta_chars = 0; + return (0); + } + else + return (0); + +#else /* !HAVE_SETLOCALE */ + char *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. */ + if (localestr == 0 || (t = normalize_codeset (localestr)) == 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; + } + + if (force && legal_lang_values[i] == 0) /* didn't find it */ + { + /* Default "C" locale settings. */ + _rl_meta_flag = 0; + _rl_convert_meta_chars_to_ascii = 1; + _rl_output_meta_chars = 0; + } + + _rl_utf8locale = *t ? STREQ (t, "utf8") : 0; + + xfree (t); + return (legal_lang_values[i] ? 1 : 0); +#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 (void) +{ + char *t, *ol; + + ol = _rl_current_locale; + t = _rl_init_locale (); /* resets _rl_current_locale, returns static pointer */ + xfree (ol); + + return (_rl_set_localevars (t, 0)); +} + +#if !defined (HAVE_SETLOCALE) +static char * +normalize_codeset (char *codeset) +{ + size_t namelen, i; + int len, all_digits; + char *wp, *retval; + + codeset = find_codeset (codeset, &namelen); + + if (codeset == 0) + return (codeset); + + all_digits = 1; + for (len = 0, i = 0; i < namelen; i++) + { + if (ISALNUM ((unsigned char)codeset[i])) + { + len++; + all_digits &= _rl_digit_p (codeset[i]); + } + } + + retval = (char *)malloc ((all_digits ? 3 : 0) + len + 1); + if (retval == 0) + return ((char *)0); + + wp = retval; + /* Add `iso' to beginning of an all-digit codeset */ + if (all_digits) + { + *wp++ = 'i'; + *wp++ = 's'; + *wp++ = 'o'; + } + + for (i = 0; i < namelen; i++) + if (ISALPHA ((unsigned char)codeset[i])) + *wp++ = _rl_to_lower (codeset[i]); + else if (_rl_digit_p (codeset[i])) + *wp++ = codeset[i]; + *wp = '\0'; + + return retval; +} +#endif /* !HAVE_SETLOCALE */ + +/* Isolate codeset portion of locale specification. */ +static char * +find_codeset (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; +} + +void +_rl_reset_locale (void) +{ + char *ol, *nl; + + /* This should not be NULL; _rl_init_eightbit sets it on the first call to + readline() or rl_initialize(). */ + ol = _rl_current_locale; + nl = _rl_init_locale (); /* resets _rl_current_locale */ + + if ((ol == 0 && nl) || (ol && nl && (STREQ (ol, nl) == 0))) + (void)_rl_set_localevars (nl, 1); + + xfree (ol); +} diff --git a/parens.c b/parens.c new file mode 100644 index 0000000..57ce704 --- /dev/null +++ b/parens.c @@ -0,0 +1,184 @@ +/* parens.c -- implementation of matching parentheses feature. */ + +/* Copyright (C) 1987, 1989, 1992-2015, 2017, 2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# include +#endif + +#include "rlconf.h" + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "posixselect.h" + +#if defined (HAVE_STRING_H) +# include +#else /* !HAVE_STRING_H */ +# include +#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 (char *, int, int); + +/* Non-zero means try to blink the matching open parenthesis when the + close parenthesis is inserted. */ +int rl_blink_matching_paren = 0; + +static int _paren_blink_usec = 500000; + +/* Change emacs_standard_keymap to have bindings for paren matching when + ON_OR_OFF is 1, change them back to self_insert when ON_OR_OFF == 0. */ +void +_rl_enable_paren_matching (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); + +#if defined (VI_MODE) + /* ([{ */ + rl_bind_key_in_map (')', rl_insert_close, vi_insertion_keymap); + rl_bind_key_in_map (']', rl_insert_close, vi_insertion_keymap); + rl_bind_key_in_map ('}', rl_insert_close, vi_insertion_keymap); +#endif + } + 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); + +#if defined (VI_MODE) + /* ([{ */ + rl_bind_key_in_map (')', rl_insert, vi_insertion_keymap); + rl_bind_key_in_map (']', rl_insert, vi_insertion_keymap); + rl_bind_key_in_map ('}', rl_insert, vi_insertion_keymap); +#endif + } +} + +int +rl_set_paren_blink_timeout (int u) +{ + int o; + + o = _paren_blink_usec; + if (u > 0) + _paren_blink_usec = u; + return (o); +} + +int +rl_insert_close (int count, int invoking_key) +{ + if (rl_explicit_arg || !rl_blink_matching_paren) + _rl_insert_char (count, invoking_key); + else + { +#if defined (HAVE_SELECT) + int orig_point, match_point, ready; + struct timeval timer; + fd_set readfds; + + _rl_insert_char (1, invoking_key); + (*rl_redisplay_function) (); + match_point = + find_matching_open (rl_line_buffer, rl_point - 2, invoking_key); + + /* Emacs might message or ring the bell here, but I don't. */ + if (match_point < 0) + return 1; + + FD_ZERO (&readfds); + FD_SET (fileno (rl_instream), &readfds); + USEC_TO_TIMEVAL (_paren_blink_usec, timer); + + orig_point = rl_point; + rl_point = match_point; + (*rl_redisplay_function) (); +# if defined (RL_TIMEOUT_USE_SELECT) + ready = _rl_timeout_select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer, NULL); +# else + ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer); +# endif + rl_point = orig_point; +#else /* !HAVE_SELECT */ + _rl_insert_char (count, invoking_key); +#endif /* !HAVE_SELECT */ + } + return 0; +} + +static int +find_matching_open (char *string, int from, int 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/parse-colors.c b/parse-colors.c new file mode 100644 index 0000000..05ec9bc --- /dev/null +++ b/parse-colors.c @@ -0,0 +1,440 @@ +/* `dir', `vdir' and `ls' directory listing programs for GNU. + + Modified by Chet Ramey for Readline. + + Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012, 2017 + 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 3 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, see . */ + +/* Written by Richard Stallman and David MacKenzie. */ + +/* Color support by Peter Anvin and Dennis + Flaherty based on original patches by + Greg Lee . */ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +// strdup() / strcpy() +#if defined (HAVE_STRING_H) +# include +#else /* !HAVE_STRING_H */ +# include +#endif /* !HAVE_STRING_H */ + +// abort() +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include "rldefs.h" // STREQ, savestring +#include "readline.h" +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +#include "colors.h" +#include "parse-colors.h" + +#if defined (COLOR_SUPPORT) + +static bool get_funky_string (char **dest, const char **src, bool equals_end, size_t *output_count); + +struct bin_str _rl_color_indicator[] = + { + { LEN_STR_PAIR ("\033[") }, // lc: Left of color sequence + { LEN_STR_PAIR ("m") }, // rc: Right of color sequence + { 0, NULL }, // ec: End color (replaces lc+no+rc) + { LEN_STR_PAIR ("0") }, // rs: Reset to ordinary colors + { 0, NULL }, // no: Normal + { 0, NULL }, // fi: File: default + { LEN_STR_PAIR ("01;34") }, // di: Directory: bright blue + { LEN_STR_PAIR ("01;36") }, // ln: Symlink: bright cyan + { LEN_STR_PAIR ("33") }, // pi: Pipe: yellow/brown + { LEN_STR_PAIR ("01;35") }, // so: Socket: bright magenta + { LEN_STR_PAIR ("01;33") }, // bd: Block device: bright yellow + { LEN_STR_PAIR ("01;33") }, // cd: Char device: bright yellow + { 0, NULL }, // mi: Missing file: undefined + { 0, NULL }, // or: Orphaned symlink: undefined + { LEN_STR_PAIR ("01;32") }, // ex: Executable: bright green + { LEN_STR_PAIR ("01;35") }, // do: Door: bright magenta + { LEN_STR_PAIR ("37;41") }, // su: setuid: white on red + { LEN_STR_PAIR ("30;43") }, // sg: setgid: black on yellow + { LEN_STR_PAIR ("37;44") }, // st: sticky: black on blue + { LEN_STR_PAIR ("34;42") }, // ow: other-writable: blue on green + { LEN_STR_PAIR ("30;42") }, // tw: ow w/ sticky: black on green + { LEN_STR_PAIR ("30;41") }, // ca: black on red + { 0, NULL }, // mh: disabled by default + { LEN_STR_PAIR ("\033[K") }, // cl: clear to end of line + }; + +/* Parse a string as part of the LS_COLORS variable; this may involve + decoding all kinds of escape characters. If equals_end is set an + unescaped equal sign ends the string, otherwise only a : or \0 + does. Set *OUTPUT_COUNT to the number of bytes output. Return + true if successful. + + The resulting string is *not* null-terminated, but may contain + embedded nulls. + + Note that both dest and src are char **; on return they point to + the first free byte after the array and the character that ended + the input string, respectively. */ + +static bool +get_funky_string (char **dest, const char **src, bool equals_end, size_t *output_count) { + char num; /* For numerical codes */ + size_t count; /* Something to count with */ + enum { + ST_GND, ST_BACKSLASH, ST_OCTAL, ST_HEX, ST_CARET, ST_END, ST_ERROR + } state; + const char *p; + char *q; + + p = *src; /* We don't want to double-indirect */ + q = *dest; /* the whole darn time. */ + + count = 0; /* No characters counted in yet. */ + num = 0; + + state = ST_GND; /* Start in ground state. */ + while (state < ST_END) + { + switch (state) + { + case ST_GND: /* Ground state (no escapes) */ + switch (*p) + { + case ':': + case '\0': + state = ST_END; /* End of string */ + break; + case '\\': + state = ST_BACKSLASH; /* Backslash scape sequence */ + ++p; + break; + case '^': + state = ST_CARET; /* Caret escape */ + ++p; + break; + case '=': + if (equals_end) + { + state = ST_END; /* End */ + break; + } + /* else fall through */ + default: + *(q++) = *(p++); + ++count; + break; + } + break; + + case ST_BACKSLASH: /* Backslash escaped character */ + switch (*p) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + state = ST_OCTAL; /* Octal sequence */ + num = *p - '0'; + break; + case 'x': + case 'X': + state = ST_HEX; /* Hex sequence */ + num = 0; + break; + case 'a': /* Bell */ + num = '\a'; + break; + case 'b': /* Backspace */ + num = '\b'; + break; + case 'e': /* Escape */ + num = 27; + break; + case 'f': /* Form feed */ + num = '\f'; + break; + case 'n': /* Newline */ + num = '\n'; + break; + case 'r': /* Carriage return */ + num = '\r'; + break; + case 't': /* Tab */ + num = '\t'; + break; + case 'v': /* Vtab */ + num = '\v'; + break; + case '?': /* Delete */ + num = 127; + break; + case '_': /* Space */ + num = ' '; + break; + case '\0': /* End of string */ + state = ST_ERROR; /* Error! */ + break; + default: /* Escaped character like \ ^ : = */ + num = *p; + break; + } + if (state == ST_BACKSLASH) + { + *(q++) = num; + ++count; + state = ST_GND; + } + ++p; + break; + + case ST_OCTAL: /* Octal sequence */ + if (*p < '0' || *p > '7') + { + *(q++) = num; + ++count; + state = ST_GND; + } + else + num = (num << 3) + (*(p++) - '0'); + break; + + case ST_HEX: /* Hex sequence */ + switch (*p) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + num = (num << 4) + (*(p++) - '0'); + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + num = (num << 4) + (*(p++) - 'a') + 10; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + num = (num << 4) + (*(p++) - 'A') + 10; + break; + default: + *(q++) = num; + ++count; + state = ST_GND; + break; + } + break; + + case ST_CARET: /* Caret escape */ + state = ST_GND; /* Should be the next state... */ + if (*p >= '@' && *p <= '~') + { + *(q++) = *(p++) & 037; + ++count; + } + else if (*p == '?') + { + *(q++) = 127; + ++count; + } + else + state = ST_ERROR; + break; + + default: + /* should we ? */ + /* abort (); no, we should not */ + state = ST_ERROR; + break; + } + } + + *dest = q; + *src = p; + *output_count = count; + + return state != ST_ERROR; +} +#endif /* COLOR_SUPPORT */ + +void _rl_parse_colors(void) +{ +#if defined (COLOR_SUPPORT) + const char *p; /* Pointer to character being parsed */ + char *buf; /* color_buf buffer pointer */ + int state; /* State of parser */ + int ind_no; /* Indicator number */ + char label[3]; /* Indicator label */ + COLOR_EXT_TYPE *ext; /* Extension we are working on */ + + p = sh_get_env_value ("LS_COLORS"); + if (p == 0 || *p == '\0') + { + _rl_color_ext_list = NULL; + return; + } + + ext = NULL; + strcpy (label, "??"); + + /* This is an overly conservative estimate, but any possible + LS_COLORS string will *not* generate a color_buf longer than + itself, so it is a safe way of allocating a buffer in + advance. */ + buf = color_buf = savestring (p); + + state = 1; + while (state > 0) + { + switch (state) + { + case 1: /* First label character */ + switch (*p) + { + case ':': + ++p; + break; + + case '*': + /* Allocate new extension block and add to head of + linked list (this way a later definition will + override an earlier one, which can be useful for + having terminal-specific defs override global). */ + + ext = (COLOR_EXT_TYPE *)xmalloc (sizeof *ext); + ext->next = _rl_color_ext_list; + _rl_color_ext_list = ext; + + ++p; + ext->ext.string = buf; + + state = (get_funky_string (&buf, &p, true, &ext->ext.len) + ? 4 : -1); + break; + + case '\0': + state = 0; /* Done! */ + break; + + default: /* Assume it is file type label */ + label[0] = *(p++); + state = 2; + break; + } + break; + + case 2: /* Second label character */ + if (*p) + { + label[1] = *(p++); + state = 3; + } + else + state = -1; /* Error */ + break; + + case 3: /* Equal sign after indicator label */ + state = -1; /* Assume failure... */ + if (*(p++) == '=')/* It *should* be... */ + { + for (ind_no = 0; indicator_name[ind_no] != NULL; ++ind_no) + { + if (STREQ (label, indicator_name[ind_no])) + { + _rl_color_indicator[ind_no].string = buf; + state = (get_funky_string (&buf, &p, false, + &_rl_color_indicator[ind_no].len) + ? 1 : -1); + break; + } + } + if (state == -1) + { + _rl_errmsg ("LS_COLORS: unrecognized prefix: %s", label); + /* recover from an unrecognized prefix */ + while (p && *p && *p != ':') + p++; + if (p && *p == ':') + state = 1; + else if (p && *p == 0) + state = 0; + } + } + break; + + case 4: /* Equal sign after *.ext */ + if (*(p++) == '=') + { + ext->seq.string = buf; + state = (get_funky_string (&buf, &p, false, &ext->seq.len) + ? 1 : -1); + } + else + state = -1; + /* XXX - recover here as with an unrecognized prefix? */ + if (state == -1 && ext->ext.string) + _rl_errmsg ("LS_COLORS: syntax error: %s", ext->ext.string); + break; + } + } + + if (state < 0) + { + COLOR_EXT_TYPE *e; + COLOR_EXT_TYPE *e2; + + _rl_errmsg ("unparsable value for LS_COLORS environment variable"); + free (color_buf); + for (e = _rl_color_ext_list; e != NULL; /* empty */) + { + e2 = e; + e = e->next; + free (e2); + } + _rl_color_ext_list = NULL; + _rl_colored_stats = 0; /* can't have colored stats without colors */ + } +#else /* !COLOR_SUPPORT */ + ; +#endif /* !COLOR_SUPPORT */ +} diff --git a/parse-colors.h b/parse-colors.h new file mode 100644 index 0000000..aef86f7 --- /dev/null +++ b/parse-colors.h @@ -0,0 +1,46 @@ +/* `dir', `vdir' and `ls' directory listing programs for GNU. + + Modified by Chet Ramey for Readline. + + Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012 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 3 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, see . */ + +/* Written by Richard Stallman and David MacKenzie. */ + +/* Color support by Peter Anvin and Dennis + Flaherty based on original patches by + Greg Lee . */ + +#ifndef _PARSE_COLORS_H_ +#define _PARSE_COLORS_H_ + +#include "readline.h" + +#define LEN_STR_PAIR(s) sizeof (s) - 1, s + +void _rl_parse_colors (void); + +static const char *const indicator_name[]= + { + "lc", "rc", "ec", "rs", "no", "fi", "di", "ln", "pi", "so", + "bd", "cd", "mi", "or", "ex", "do", "su", "sg", "st", + "ow", "tw", "ca", "mh", "cl", NULL + }; + +/* Buffer for color sequences */ +static char *color_buf; + +#endif /* !_PARSE_COLORS_H_ */ diff --git a/patchlevel b/patchlevel new file mode 100644 index 0000000..d8c9df7 --- /dev/null +++ b/patchlevel @@ -0,0 +1,3 @@ +# Do not edit -- exists only for use by patch + +0 diff --git a/posixdir.h b/posixdir.h new file mode 100644 index 0000000..b737bd7 --- /dev/null +++ b/posixdir.h @@ -0,0 +1,71 @@ +/* posixdir.h -- Posix directory reading includes and defines. */ + +/* Copyright (C) 1987,1991,2012,2019,2021 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 3 of the License, 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. If not, see . +*/ + +/* This file should be included instead of or . */ + +#if !defined (_POSIXDIR_H_) +#define _POSIXDIR_H_ + +#if defined (HAVE_DIRENT_H) +# include +# if defined (HAVE_STRUCT_DIRENT_D_NAMLEN) +# define D_NAMLEN(d) ((d)->d_namlen) +# else +# define D_NAMLEN(d) (strlen ((d)->d_name)) +# endif /* !HAVE_STRUCT_DIRENT_D_NAMLEN */ +#else +# if defined (HAVE_SYS_NDIR_H) +# include +# endif +# if defined (HAVE_SYS_DIR_H) +# include +# endif +# if defined (HAVE_NDIR_H) +# include +# endif +# if !defined (dirent) +# define dirent direct +# endif /* !dirent */ +# define D_NAMLEN(d) ((d)->d_namlen) +#endif /* !HAVE_DIRENT_H */ + +/* The bash code fairly consistently uses d_fileno; make sure it's available */ +#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (HAVE_STRUCT_DIRENT_D_FILENO) +# define d_fileno d_ino +#endif + +/* Posix does not require that the d_ino field be present, and some + systems do not provide it. */ +#if !defined (HAVE_STRUCT_DIRENT_D_INO) || defined (BROKEN_DIRENT_D_INO) +# define REAL_DIR_ENTRY(dp) 1 +#else +# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) +#endif /* _POSIX_SOURCE */ + +#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (BROKEN_DIRENT_D_INO) +# define D_INO_AVAILABLE +#endif + +/* Signal the rest of the code that it can safely use dirent.d_fileno */ +#if defined (D_INO_AVAILABLE) || defined (HAVE_STRUCT_DIRENT_D_FILENO) +# define D_FILENO_AVAILABLE 1 +#endif + +#endif /* !_POSIXDIR_H_ */ diff --git a/posixjmp.h b/posixjmp.h new file mode 100644 index 0000000..9c7e99e --- /dev/null +++ b/posixjmp.h @@ -0,0 +1,46 @@ +/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */ + +/* Copyright (C) 1987,1991-2015 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 3 of the License, 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. If not, see . +*/ + +#ifndef _POSIXJMP_H_ +#define _POSIXJMP_H_ + +#include + +/* This *must* be included *after* config.h */ + +#if defined (HAVE_POSIX_SIGSETJMP) +# define procenv_t sigjmp_buf + +# define setjmp_nosigs(x) sigsetjmp((x), 0) +# define setjmp_sigs(x) sigsetjmp((x), 1) + +# define _rl_longjmp(x, n) siglongjmp((x), (n)) +# define sh_longjmp(x, n) siglongjmp((x), (n)) +#else +# define procenv_t jmp_buf + +# define setjmp_nosigs setjmp +# define setjmp_sigs setjmp + +# define _rl_longjmp(x, n) longjmp((x), (n)) +# define sh_longjmp(x, n) longjmp((x), (n)) +#endif + +#endif /* _POSIXJMP_H_ */ diff --git a/posixselect.h b/posixselect.h new file mode 100644 index 0000000..da6a1ac --- /dev/null +++ b/posixselect.h @@ -0,0 +1,47 @@ +/* posixselect.h -- wrapper for select(2) includes and definitions */ + +/* Copyright (C) 2009 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 3 of the License, 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. If not, see . +*/ + +#ifndef _POSIXSELECT_H_ +#define _POSIXSELECT_H_ + +#if defined (FD_SET) && !defined (HAVE_SELECT) +# define HAVE_SELECT 1 +#endif + +#if defined (HAVE_SELECT) +# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX) +# include +# endif +#endif /* HAVE_SELECT */ +#if defined (HAVE_SYS_SELECT_H) +# include +#endif + +#ifndef USEC_PER_SEC +# define USEC_PER_SEC 1000000 +#endif + +#define USEC_TO_TIMEVAL(us, tv) \ +do { \ + (tv).tv_sec = (us) / USEC_PER_SEC; \ + (tv).tv_usec = (us) % USEC_PER_SEC; \ +} while (0) + +#endif /* _POSIXSELECT_H_ */ diff --git a/posixstat.h b/posixstat.h new file mode 100644 index 0000000..b607786 --- /dev/null +++ b/posixstat.h @@ -0,0 +1,162 @@ +/* posixstat.h -- Posix stat(2) definitions for systems that + don't have them. */ + +/* Copyright (C) 1987-2019 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 3 of the License, 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. If not, see . +*/ + +/* This file should be included instead of . + It relies on the local sys/stat.h to work though. */ +#if !defined (_POSIXSTAT_H_) +#define _POSIXSTAT_H_ + +#include + +#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 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 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) +#else /* !S_IRWXU */ + /* S_IRWXU is defined, but "group" and "other" bits might not be + (happens in certain versions of MinGW). */ +# if !defined (S_IRGRP) +# define S_IRGRP (S_IREAD >> 3) /* read, group */ +# define S_IWGRP (S_IWRITE >> 3) /* write, group */ +# define S_IXGRP (S_IEXEC >> 3) /* execute, group */ +# endif /* !S_IRGRP */ + +# if !defined (S_IROTH) +# 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_IROTH */ +# if !defined (S_IRWXG) +# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) +# endif +# if !defined (S_IRWXO) +# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +# endif +#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/posixtime.h b/posixtime.h new file mode 100644 index 0000000..e70ebec --- /dev/null +++ b/posixtime.h @@ -0,0 +1,84 @@ +/* posixtime.h -- wrapper for time.h, sys/times.h mess. */ + +/* Copyright (C) 1999-2021 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 3 of the License, 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. If not, see . +*/ + +#ifndef _POSIXTIME_H_ +#define _POSIXTIME_H_ + +/* include this after config.h */ +/* Some systems require this, mostly for the definition of `struct timezone'. + For example, Dynix/ptx has that definition in rather than + sys/time.h */ +#if defined (HAVE_SYS_TIME_H) +# include +#endif +#include + +#if !defined (HAVE_SYSCONF) || !defined (_SC_CLK_TCK) +# if !defined (CLK_TCK) +# if defined (HZ) +# define CLK_TCK HZ +# else +# define CLK_TCK 60 /* 60HZ */ +# endif +# endif /* !CLK_TCK */ +#endif /* !HAVE_SYSCONF && !_SC_CLK_TCK */ + +#if !HAVE_TIMEVAL +struct timeval +{ + time_t tv_sec; + long int tv_usec; +}; +#endif + +#if !HAVE_GETTIMEOFDAY +extern int gettimeofday PARAMS((struct timeval *, void *)); +#endif + +/* These exist on BSD systems, at least. */ +#if !defined (timerclear) +# define timerclear(tvp) do { (tvp)->tv_sec = 0; (tvp)->tv_usec = 0; } while (0) +#endif +#if !defined (timerisset) +# define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#endif +#if !defined (timercmp) +# define timercmp(a, b, CMP) \ + (((a)->tv_sec == (b)->tv_sec) ? ((a)->tv_usec CMP (b)->tv_usec) \ + : ((a)->tv_sec CMP (b)->tv_sec)) +#endif + +/* These are non-standard. */ +#if !defined (timerisunset) +# define timerisunset(tvp) ((tvp)->tv_sec == 0 && (tvp)->tv_usec == 0) +#endif +#if !defined (timerset) +# define timerset(tvp, s, u) do { tvp->tv_sec = s; tvp->tv_usec = u; } while (0) +#endif + +#ifndef TIMEVAL_TO_TIMESPEC +# define TIMEVAL_TO_TIMESPEC(tv, ts) \ + do { \ + (ts)->tv_sec = (tv)->tv_sec; \ + (ts)->tv_nsec = (tv)->tv_usec * 1000; \ + } while (0) +#endif + +#endif /* _POSIXTIME_H_ */ diff --git a/readline.c b/readline.c new file mode 100644 index 0000000..9d42a8d --- /dev/null +++ b/readline.c @@ -0,0 +1,1575 @@ +/* readline.c -- a general facility for reading lines of input + with emacs style editing and completion. */ + +/* Copyright (C) 1987-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include "posixstat.h" +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif /* HAVE_SYS_FILE_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include +#include "posixjmp.h" +#include + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#if defined (__EMX__) +# define INCL_DOSPROCESS +# include +#endif /* __EMX__ */ + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +#if defined (COLOR_SUPPORT) +# include "parse-colors.h" +#endif + +#ifndef RL_LIBRARY_VERSION +# define RL_LIBRARY_VERSION "8.1" +#endif + +#ifndef RL_READLINE_VERSION +# define RL_READLINE_VERSION 0x0801 +#endif + +/* Forward declarations used in this file. */ +static char *readline_internal (void); +static void readline_initialize_everything (void); + +static void run_startup_hooks (void); + +static void bind_arrow_keys_internal (Keymap); +static void bind_arrow_keys (void); + +static void bind_bracketed_paste_prefix (void); + +static void readline_default_bindings (void); +static void reset_default_bindings (void); + +static int _rl_subseq_result (int, Keymap, int, int); +static int _rl_subseq_getchar (int); + +/* **************************************************************** */ +/* */ +/* Line editing input utility */ +/* */ +/* **************************************************************** */ + +const char *rl_library_version = RL_LIBRARY_VERSION; + +int rl_readline_version = RL_READLINE_VERSION; + +/* True if this is `real' readline as opposed to some stub substitute. */ +int rl_gnu_readline_p = 1; + +/* A pointer to the keymap that is currently in use. + By default, it is the standard emacs keymap. */ +Keymap _rl_keymap = emacs_standard_keymap; + +/* The current style of editing. */ +int rl_editing_mode = emacs_mode; + +/* The current insert mode: input (the default) or overwrite */ +int rl_insert_mode = RL_IM_DEFAULT; + +/* Non-zero if we called this function from _rl_dispatch(). It's present + so functions can find out whether they were called from a key binding + or directly from an application. */ +int rl_dispatching; + +/* Non-zero if the previous command was a kill command. */ +int _rl_last_command_was_kill = 0; + +/* The current value of the numeric argument specified by the user. */ +int rl_numeric_arg = 1; + +/* Non-zero if an argument was typed. */ +int rl_explicit_arg = 0; + +/* Temporary value used while generating the argument. */ +int rl_arg_sign = 1; + +/* Non-zero means we have been called at least once before. */ +static int rl_initialized; + +#if 0 +/* If non-zero, this program is running in an EMACS buffer. */ +static int running_in_emacs; +#endif + +/* Flags word encapsulating the current readline state. */ +unsigned long rl_readline_state = RL_STATE_NONE; + +/* The current offset in the current input line. */ +int rl_point; + +/* Mark in the current input line. */ +int rl_mark; + +/* Length of the current input line. */ +int rl_end; + +/* Make this non-zero to return the current input_line. */ +int rl_done; + +/* If non-zero when readline_internal returns, it means we found EOF */ +int rl_eof_found = 0; + +/* The last function executed by readline. */ +rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL; + +/* Top level environment for readline_internal (). */ +procenv_t _rl_top_level; + +/* The streams we interact with. */ +FILE *_rl_in_stream, *_rl_out_stream; + +/* The names of the streams that we do input and output to. */ +FILE *rl_instream = (FILE *)NULL; +FILE *rl_outstream = (FILE *)NULL; + +/* Non-zero means echo characters as they are read. Defaults to no echo; + set to 1 if there is a controlling terminal, we can get its attributes, + and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings + for the code that sets it. */ +int _rl_echoing_p = 0; + +/* Current prompt. */ +char *rl_prompt = (char *)NULL; +int rl_visible_prompt_length = 0; + +/* Set to non-zero by calling application if it has already printed rl_prompt + and does not want readline to do it the first time. */ +int rl_already_prompted = 0; + +/* The number of characters read in order to type this complete command. */ +int rl_key_sequence_length = 0; + +/* If non-zero, then this is the address of a function to call just + before readline_internal_setup () prints the first prompt. */ +rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL; + +/* Any readline function can set this and have it run just before the user's + rl_startup_hook. */ +rl_hook_func_t *_rl_internal_startup_hook = (rl_hook_func_t *)NULL; + +/* If non-zero, this is the address of a function to call just before + readline_internal_setup () returns and readline_internal starts + reading input characters. */ +rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL; + +/* What we use internally. You should always refer to RL_LINE_BUFFER. */ +static char *the_line; + +/* The character that can generate an EOF. Really read from + the terminal driver... just defaulted here. */ +int _rl_eof_char = CTRL ('D'); + +/* Non-zero makes this the next keystroke to read. */ +int rl_pending_input = 0; + +/* Pointer to a useful terminal name. */ +const char *rl_terminal_name = (const char *)NULL; + +/* Non-zero means to always use horizontal scrolling in line display. */ +int _rl_horizontal_scroll_mode = 0; + +/* Non-zero means to display an asterisk at the starts of history lines + which have been modified. */ +int _rl_mark_modified_lines = 0; + +/* The style of `bell' notification preferred. This can be set to NO_BELL, + AUDIBLE_BELL, or VISIBLE_BELL. */ +int _rl_bell_preference = AUDIBLE_BELL; + +/* String inserted into the line by rl_insert_comment (). */ +char *_rl_comment_begin; + +/* Keymap holding the function currently being executed. */ +Keymap rl_executing_keymap; + +/* The function currently being executed. */ +rl_command_func_t *_rl_executing_func; + +/* Keymap we're currently using to dispatch. */ +Keymap _rl_dispatching_keymap; + +/* Non-zero means to erase entire line, including prompt, on empty input lines. */ +int rl_erase_empty_line = 0; + +/* Non-zero means to read only this many characters rather than up to a + character bound to accept-line. */ +int rl_num_chars_to_read = 0; + +/* Line buffer and maintenance. */ +char *rl_line_buffer = (char *)NULL; +int rl_line_buffer_len = 0; + +/* Key sequence `contexts' */ +_rl_keyseq_cxt *_rl_kscxt = 0; + +int rl_executing_key; +char *rl_executing_keyseq = 0; +int _rl_executing_keyseq_size = 0; + +struct _rl_cmd _rl_pending_command; +struct _rl_cmd *_rl_command_to_execute = (struct _rl_cmd *)NULL; + +/* Timeout (specified in milliseconds) when reading characters making up an + ambiguous multiple-key sequence */ +int _rl_keyseq_timeout = 500; + +#define RESIZE_KEYSEQ_BUFFER() \ + do \ + { \ + if (rl_key_sequence_length + 2 >= _rl_executing_keyseq_size) \ + { \ + _rl_executing_keyseq_size += 16; \ + rl_executing_keyseq = xrealloc (rl_executing_keyseq, _rl_executing_keyseq_size); \ + } \ + } \ + while (0); + +/* Forward declarations used by the display, termcap, and history code. */ + +/* **************************************************************** */ +/* */ +/* `Forward' declarations */ +/* */ +/* **************************************************************** */ + +/* Non-zero means do not parse any lines other than comments and + parser directives. */ +unsigned char _rl_parsing_conditionalized_out = 0; + +/* Non-zero means to convert characters with the meta bit set to + escape-prefixed characters so we can indirect through + emacs_meta_keymap or vi_escape_keymap. */ +int _rl_convert_meta_chars_to_ascii = 1; + +/* Non-zero means to output characters with the meta bit set directly + rather than as a meta-prefixed escape sequence. */ +int _rl_output_meta_chars = 0; + +/* Non-zero means to look at the termios special characters and bind + them to equivalent readline functions at startup. */ +int _rl_bind_stty_chars = 1; + +/* Non-zero means to go through the history list at every newline (or + whenever rl_done is set and readline returns) and revert each line to + its initial state. */ +int _rl_revert_all_at_newline = 0; + +/* Non-zero means to honor the termios ECHOCTL bit and echo control + characters corresponding to keyboard-generated signals. */ +int _rl_echo_control_chars = 1; + +/* Non-zero means to prefix the displayed prompt with a character indicating + the editing mode: @ for emacs, : for vi-command, + for vi-insert. */ +int _rl_show_mode_in_prompt = 0; + +/* Non-zero means to attempt to put the terminal in `bracketed paste mode', + where it will prefix pasted text with an escape sequence and send + another to mark the end of the paste. */ +int _rl_enable_bracketed_paste = BRACKETED_PASTE_DEFAULT; +int _rl_enable_active_region = BRACKETED_PASTE_DEFAULT; + +/* **************************************************************** */ +/* */ +/* Top Level Functions */ +/* */ +/* **************************************************************** */ + +/* Non-zero means treat 0200 bit in terminal input as Meta bit. */ +int _rl_meta_flag = 0; /* Forward declaration */ + +/* Set up the prompt and expand it. Called from readline() and + rl_callback_handler_install (). */ +int +rl_set_prompt (const char *prompt) +{ + FREE (rl_prompt); + rl_prompt = prompt ? savestring (prompt) : (char *)NULL; + rl_display_prompt = rl_prompt ? rl_prompt : ""; + + rl_visible_prompt_length = rl_expand_prompt (rl_prompt); + return 0; +} + +/* Read a line of input. Prompt with PROMPT. An empty PROMPT means + none. A return value of NULL means that EOF was encountered. */ +char * +readline (const char *prompt) +{ + char *value; +#if 0 + int in_callback; +#endif + + /* If we are at EOF return a NULL string. */ + if (rl_pending_input == EOF) + { + rl_clear_pending_input (); + return ((char *)NULL); + } + +#if 0 + /* If readline() is called after installing a callback handler, temporarily + turn off the callback state to avoid ensuing messiness. Patch supplied + by the gdb folks. XXX -- disabled. This can be fooled and readline + left in a strange state by a poorly-timed longjmp. */ + if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK)) + RL_UNSETSTATE (RL_STATE_CALLBACK); +#endif + + rl_set_prompt (prompt); + + rl_initialize (); + if (rl_prep_term_function) + (*rl_prep_term_function) (_rl_meta_flag); + +#if defined (HANDLE_SIGNALS) + rl_set_signals (); +#endif + + value = readline_internal (); + if (rl_deprep_term_function) + (*rl_deprep_term_function) (); + +#if defined (HANDLE_SIGNALS) + rl_clear_signals (); +#endif + +#if 0 + if (in_callback) + RL_SETSTATE (RL_STATE_CALLBACK); +#endif + +#if HAVE_DECL_AUDIT_USER_TTY && defined (HAVE_LIBAUDIT_H) && defined (ENABLE_TTY_AUDIT_SUPPORT) + if (value) + _rl_audit_tty (value); +#endif + + return (value); +} + +static void +run_startup_hooks (void) +{ + if (rl_startup_hook) + (*rl_startup_hook) (); + + if (_rl_internal_startup_hook) + (*_rl_internal_startup_hook) (); +} + +#if defined (READLINE_CALLBACKS) +# define STATIC_CALLBACK +#else +# define STATIC_CALLBACK static +#endif + +STATIC_CALLBACK void +readline_internal_setup (void) +{ + char *nprompt; + + _rl_in_stream = rl_instream; + _rl_out_stream = rl_outstream; + + /* Enable the meta key only for the duration of readline(), if this + terminal has one and the terminal has been initialized */ + if (_rl_enable_meta & RL_ISSTATE (RL_STATE_TERMPREPPED)) + _rl_enable_meta_key (); + + run_startup_hooks (); + + rl_deactivate_mark (); + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + rl_vi_insertion_mode (1, 'i'); /* don't want to reset last */ + else +#endif /* VI_MODE */ + if (_rl_show_mode_in_prompt) + _rl_reset_prompt (); + + /* If we're not echoing, we still want to at least print a prompt, because + rl_redisplay will not do it for us. If the calling application has a + custom redisplay function, though, let that function handle it. */ + if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay) + { + if (rl_prompt && rl_already_prompted == 0) + { + nprompt = _rl_strip_prompt (rl_prompt); + fprintf (_rl_out_stream, "%s", nprompt); + fflush (_rl_out_stream); + xfree (nprompt); + } + } + else + { + if (rl_prompt && rl_already_prompted) + rl_on_new_line_with_prompt (); + else + rl_on_new_line (); + (*rl_redisplay_function) (); + } + + if (rl_pre_input_hook) + (*rl_pre_input_hook) (); + + RL_CHECK_SIGNALS (); +} + +STATIC_CALLBACK char * +readline_internal_teardown (int eof) +{ + char *temp; + HIST_ENTRY *entry; + + RL_CHECK_SIGNALS (); + + if (eof) + RL_SETSTATE (RL_STATE_EOF); /* XXX */ + + /* 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 (); + + /* We don't want to do this if we executed functions that call + history_set_pos to set the history offset to the line containing the + non-incremental search string. */ + 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); + xfree (temp); + } + + if (_rl_revert_all_at_newline) + _rl_revert_all_lines (); + + /* At any rate, it is highly likely that this line has an undo list. Get + rid of it now. */ + if (rl_undo_list) + rl_free_undo_list (); + + /* Disable the meta key, if this terminal has one and we were told to use it. + The check whether or not we sent the enable string is in + _rl_disable_meta_key(); the flag is set in _rl_enable_meta_key */ + _rl_disable_meta_key (); + + /* Restore normal cursor, if available. */ + _rl_set_insert_mode (RL_IM_INSERT, 0); + + return (eof ? (char *)NULL : savestring (the_line)); +} + +void +_rl_internal_char_cleanup (void) +{ + if (_rl_keep_mark_active) + _rl_keep_mark_active = 0; + else if (rl_mark_active_p ()) + rl_deactivate_mark (); + +#if defined (VI_MODE) + /* In vi mode, when you exit insert mode, the cursor moves back + over the previous character. We explicitly check for that here. */ + if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) + rl_vi_check (); +#endif /* VI_MODE */ + + if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read) + { + (*rl_redisplay_function) (); + _rl_want_redisplay = 0; + rl_newline (1, '\n'); + } + + if (rl_done == 0) + { + (*rl_redisplay_function) (); + _rl_want_redisplay = 0; + } + + /* If the application writer has told us to erase the entire line if + the only character typed was something bound to rl_newline, do so. */ + if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline && + rl_point == 0 && rl_end == 0) + _rl_erase_entire_line (); +} + +STATIC_CALLBACK int +#if defined (READLINE_CALLBACKS) +readline_internal_char (void) +#else +readline_internal_charloop (void) +#endif +{ + static int lastc, eof_found; + int c, code, lk, r; + + lastc = EOF; + +#if !defined (READLINE_CALLBACKS) + eof_found = 0; + while (rl_done == 0) + { +#endif + lk = _rl_last_command_was_kill; + +#if defined (HAVE_POSIX_SIGSETJMP) + code = sigsetjmp (_rl_top_level, 0); +#else + code = setjmp (_rl_top_level); +#endif + + if (code) + { + (*rl_redisplay_function) (); + _rl_want_redisplay = 0; + + /* If we longjmped because of a timeout, handle it here. */ + if (RL_ISSTATE (RL_STATE_TIMEOUT)) + { + RL_SETSTATE (RL_STATE_DONE); + rl_done = 1; + return 1; + } + + /* If we get here, we're not being called from something dispatched + from _rl_callback_read_char(), which sets up its own value of + _rl_top_level (saving and restoring the old, of course), so + we can just return here. */ + if (RL_ISSTATE (RL_STATE_CALLBACK)) + return (0); + } + + if (rl_pending_input == 0) + { + /* Then initialize the argument and number of keys read. */ + _rl_reset_argument (); + rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; + } + + RL_SETSTATE(RL_STATE_READCMD); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_READCMD); + + /* look at input.c:rl_getc() for the circumstances under which this will + be returned; punt immediately on read error without converting it to + a newline; assume that rl_read_key has already called the signal + handler. */ + if (c == READERR) + { +#if defined (READLINE_CALLBACKS) + RL_SETSTATE(RL_STATE_DONE); + return (rl_done = 1); +#else + RL_SETSTATE(RL_STATE_EOF); + eof_found = 1; + break; +#endif + } + + /* EOF typed to a non-blank line is ^D the first time, EOF the second + time in a row. This won't return any partial line read from the tty. + If we want to change this, to force any existing line to be returned + when read(2) reads EOF, for example, this is the place to change. */ + if (c == EOF && rl_end) + { + if (RL_SIG_RECEIVED ()) + { + RL_CHECK_SIGNALS (); + if (rl_signal_event_hook) + (*rl_signal_event_hook) (); /* XXX */ + } + + /* XXX - reading two consecutive EOFs returns EOF */ + if (RL_ISSTATE (RL_STATE_TERMPREPPED)) + { + if (lastc == _rl_eof_char || lastc == EOF) + rl_end = 0; + else + c = _rl_eof_char; + } + else + c = NEWLINE; + } + + /* The character _rl_eof_char typed to blank line, and not as the + previous character is interpreted as EOF. This doesn't work when + READLINE_CALLBACKS is defined, so hitting a series of ^Ds will + erase all the chars on the line and then return EOF. */ + if (((c == _rl_eof_char && lastc != c) || c == EOF) && rl_end == 0) + { +#if defined (READLINE_CALLBACKS) + RL_SETSTATE(RL_STATE_DONE); + return (rl_done = 1); +#else + RL_SETSTATE(RL_STATE_EOF); + eof_found = 1; + break; +#endif + } + + lastc = c; + r = _rl_dispatch ((unsigned char)c, _rl_keymap); + RL_CHECK_SIGNALS (); + + if (_rl_command_to_execute) + { + (*rl_redisplay_function) (); + + rl_executing_keymap = _rl_command_to_execute->map; + rl_executing_key = _rl_command_to_execute->key; + + _rl_executing_func = _rl_command_to_execute->func; + + rl_dispatching = 1; + RL_SETSTATE(RL_STATE_DISPATCHING); + r = (*(_rl_command_to_execute->func)) (_rl_command_to_execute->count, _rl_command_to_execute->key); + _rl_command_to_execute = 0; + RL_UNSETSTATE(RL_STATE_DISPATCHING); + rl_dispatching = 0; + + RL_CHECK_SIGNALS (); + } + + /* If there was no change in _rl_last_command_was_kill, then no kill + has taken place. Note that if input is pending we are reading + a prefix command, so nothing has changed yet. */ + if (rl_pending_input == 0 && lk == _rl_last_command_was_kill) + _rl_last_command_was_kill = 0; + + _rl_internal_char_cleanup (); + +#if defined (READLINE_CALLBACKS) + return 0; +#else + } + + return (eof_found); +#endif +} + +#if defined (READLINE_CALLBACKS) +static int +readline_internal_charloop (void) +{ + 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 (void) +{ + readline_internal_setup (); + rl_eof_found = readline_internal_charloop (); + return (readline_internal_teardown (rl_eof_found)); +} + +void +_rl_init_line_state (void) +{ + rl_point = rl_end = rl_mark = 0; + the_line = rl_line_buffer; + the_line[0] = 0; +} + +void +_rl_set_the_line (void) +{ + the_line = rl_line_buffer; +} + +#if defined (READLINE_CALLBACKS) +_rl_keyseq_cxt * +_rl_keyseq_cxt_alloc (void) +{ + _rl_keyseq_cxt *cxt; + + cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt)); + + cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0; + + cxt->okey = 0; + cxt->ocxt = _rl_kscxt; + cxt->childval = 42; /* sentinel value */ + + return cxt; +} + +void +_rl_keyseq_cxt_dispose (_rl_keyseq_cxt *cxt) +{ + xfree (cxt); +} + +void +_rl_keyseq_chain_dispose (void) +{ + _rl_keyseq_cxt *cxt; + + while (_rl_kscxt) + { + cxt = _rl_kscxt; + _rl_kscxt = _rl_kscxt->ocxt; + _rl_keyseq_cxt_dispose (cxt); + } +} +#endif + +static int +_rl_subseq_getchar (int key) +{ + int k; + + if (key == ESC) + RL_SETSTATE(RL_STATE_METANEXT); + RL_SETSTATE(RL_STATE_MOREINPUT); + k = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + if (key == ESC) + RL_UNSETSTATE(RL_STATE_METANEXT); + + return k; +} + +#if defined (READLINE_CALLBACKS) +int +_rl_dispatch_callback (_rl_keyseq_cxt *cxt) +{ + int nkey, r; + + /* For now */ + /* The first time this context is used, we want to read input and dispatch + on it. When traversing the chain of contexts back `up', we want to use + the value from the next context down. We're simulating recursion using + a chain of contexts. */ + if ((cxt->flags & KSEQ_DISPATCHED) == 0) + { + nkey = _rl_subseq_getchar (cxt->okey); + if (nkey < 0) + { + _rl_abort_internal (); + return -1; + } + r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg); + cxt->flags |= KSEQ_DISPATCHED; + } + else + r = cxt->childval; + + /* For now */ + if (r != -3) /* don't do this if we indicate there will be other matches */ + r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); + + RL_CHECK_SIGNALS (); + /* We only treat values < 0 specially to simulate recursion. */ + if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */ + { + _rl_keyseq_chain_dispose (); + RL_UNSETSTATE (RL_STATE_MULTIKEY); + return r; + } + + if (r != -3) /* magic value that says we added to the chain */ + _rl_kscxt = cxt->ocxt; + if (_rl_kscxt) + _rl_kscxt->childval = r; + if (r != -3) + _rl_keyseq_cxt_dispose (cxt); + + return r; +} +#endif /* READLINE_CALLBACKS */ + +/* Do the command associated with KEY in MAP. + If the associated command is really a keymap, then read + another key, and dispatch into that map. */ +int +_rl_dispatch (register int key, Keymap map) +{ + _rl_dispatching_keymap = map; + return _rl_dispatch_subseq (key, map, 0); +} + +int +_rl_dispatch_subseq (register int key, Keymap map, int got_subseq) +{ + int r, newkey; + char *macro; + rl_command_func_t *func; +#if defined (READLINE_CALLBACKS) + _rl_keyseq_cxt *cxt; +#endif + + if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) + { + if (map[ESC].type == ISKMAP) + { + if (RL_ISSTATE (RL_STATE_MACRODEF)) + _rl_add_macro_char (ESC); + RESIZE_KEYSEQ_BUFFER (); + rl_executing_keyseq[rl_key_sequence_length++] = ESC; + map = FUNCTION_TO_KEYMAP (map, ESC); + key = UNMETA (key); + return (_rl_dispatch (key, map)); + } + else + rl_ding (); + return 0; + } + + if (RL_ISSTATE (RL_STATE_MACRODEF)) + _rl_add_macro_char (key); + + r = 0; + switch (map[key].type) + { + case ISFUNC: + func = map[key].function; + if (func) + { + /* Special case rl_do_lowercase_version (). */ + if (func == rl_do_lowercase_version) + /* Should we do anything special if key == ANYOTHERKEY? */ + return (_rl_dispatch (_rl_to_lower ((unsigned char)key), map)); + + rl_executing_keymap = map; + rl_executing_key = key; + + _rl_executing_func = func; + + RESIZE_KEYSEQ_BUFFER(); + rl_executing_keyseq[rl_key_sequence_length++] = key; + rl_executing_keyseq[rl_key_sequence_length] = '\0'; + + rl_dispatching = 1; + RL_SETSTATE(RL_STATE_DISPATCHING); + r = (*func) (rl_numeric_arg * rl_arg_sign, key); + RL_UNSETSTATE(RL_STATE_DISPATCHING); + rl_dispatching = 0; + + /* If we have input pending, then the last command was a prefix + command. Don't change the state of rl_last_func. Otherwise, + remember the last command executed in this variable. */ +#if defined (VI_MODE) + if (rl_pending_input == 0 && map[key].function != rl_digit_argument && map[key].function != rl_vi_arg_digit) +#else + if (rl_pending_input == 0 && map[key].function != rl_digit_argument) +#endif + rl_last_func = map[key].function; + + RL_CHECK_SIGNALS (); + } + else if (map[ANYOTHERKEY].function) + { + /* OK, there's no function bound in this map, but there is a + shadow function that was overridden when the current keymap + was created. Return -2 to note that. */ + if (RL_ISSTATE (RL_STATE_MACROINPUT)) + _rl_prev_macro_key (); + else + _rl_unget_char (key); + if (rl_key_sequence_length > 0) + rl_executing_keyseq[--rl_key_sequence_length] = '\0'; + return -2; + } + else if (got_subseq) + { + /* Return -1 to note that we're in a subsequence, but we don't + have a matching key, nor was one overridden. This means + we need to back up the recursion chain and find the last + subsequence that is bound to a function. */ + if (RL_ISSTATE (RL_STATE_MACROINPUT)) + _rl_prev_macro_key (); + else + _rl_unget_char (key); + if (rl_key_sequence_length > 0) + rl_executing_keyseq[--rl_key_sequence_length] = '\0'; + return -1; + } + else + { +#if defined (READLINE_CALLBACKS) + RL_UNSETSTATE (RL_STATE_MULTIKEY); + _rl_keyseq_chain_dispose (); +#endif + _rl_abort_internal (); + return -1; + } + break; + + case ISKMAP: + if (map[key].function != 0) + { +#if defined (VI_MODE) + /* The only way this test will be true is if a subsequence has been + bound starting with ESC, generally the arrow keys. What we do is + check whether there's input in the queue, which there generally + will be if an arrow key has been pressed, and, if there's not, + just dispatch to (what we assume is) rl_vi_movement_mode right + away. This is essentially an input test with a zero timeout (by + default) or a timeout determined by the value of `keyseq-timeout' */ + /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued + takes microseconds, so multiply by 1000 */ + if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap && + (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && + _rl_pushed_input_available () == 0 && + _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0) + return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); + /* This is a very specific test. It can possibly be generalized in + the future, but for now it handles a specific case of ESC being + the last character in a keyboard macro. */ + if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap && + (RL_ISSTATE (RL_STATE_INPUTPENDING) == 0) && + (RL_ISSTATE (RL_STATE_MACROINPUT) && _rl_peek_macro_key () == 0) && + _rl_pushed_input_available () == 0 && + _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0) + return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); +#endif + + RESIZE_KEYSEQ_BUFFER (); + rl_executing_keyseq[rl_key_sequence_length++] = key; + _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key); + + /* Allocate new context here. Use linked contexts (linked through + cxt->ocxt) to simulate recursion */ +#if defined (READLINE_CALLBACKS) +# if defined (VI_MODE) + /* If we're redoing a vi mode command and we know there is a shadowed + function corresponding to this key, just call it -- all the redoable + vi mode commands already have all the input they need, and rl_vi_redo + assumes that one call to rl_dispatch is sufficient to complete the + command. */ + if (_rl_vi_redoing && RL_ISSTATE (RL_STATE_CALLBACK) && + map[ANYOTHERKEY].function != 0) + return (_rl_subseq_result (-2, map, key, got_subseq)); +# endif + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + /* Return 0 only the first time, to indicate success to + _rl_callback_read_char. The rest of the time, we're called + from _rl_dispatch_callback, so we return -3 to indicate + special handling is necessary. */ + r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0; + cxt = _rl_keyseq_cxt_alloc (); + + if (got_subseq) + cxt->flags |= KSEQ_SUBSEQ; + cxt->okey = key; + cxt->oldmap = map; + cxt->dmap = _rl_dispatching_keymap; + cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function; + + RL_SETSTATE (RL_STATE_MULTIKEY); + _rl_kscxt = cxt; + + return r; /* don't indicate immediate success */ + } +#endif + + /* Tentative inter-character timeout for potential multi-key + sequences? If no input within timeout, abort sequence and + act as if we got non-matching input. */ + /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued + takes microseconds, so multiply by 1000 */ + if (_rl_keyseq_timeout > 0 && + (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && + _rl_pushed_input_available () == 0 && + _rl_dispatching_keymap[ANYOTHERKEY].function && + _rl_input_queued (_rl_keyseq_timeout*1000) == 0) + { + if (rl_key_sequence_length > 0) + rl_executing_keyseq[--rl_key_sequence_length] = '\0'; + return (_rl_subseq_result (-2, map, key, got_subseq)); + } + + newkey = _rl_subseq_getchar (key); + if (newkey < 0) + { + _rl_abort_internal (); + return -1; + } + + r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function); + return _rl_subseq_result (r, map, key, got_subseq); + } + else + { + _rl_abort_internal (); /* XXX */ + return -1; + } + break; + + case ISMACR: + if (map[key].function != 0) + { + rl_executing_keyseq[rl_key_sequence_length] = '\0'; + macro = savestring ((char *)map[key].function); + _rl_with_macro_input (macro); + return 0; + } + break; + } + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && + key != ANYOTHERKEY && + _rl_dispatching_keymap == vi_movement_keymap && + _rl_vi_textmod_command (key)) + _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); +#endif + + return (r); +} + +static int +_rl_subseq_result (int r, Keymap map, int key, int got_subseq) +{ + Keymap m; + int type, nt; + rl_command_func_t *func, *nf; + + if (r == -2) + /* We didn't match anything, and the keymap we're indexed into + shadowed a function previously bound to that prefix. Call + the function. The recursive call to _rl_dispatch_subseq has + already taken care of pushing any necessary input back onto + the input queue with _rl_unget_char. */ + { + m = _rl_dispatching_keymap; + type = m[ANYOTHERKEY].type; + func = m[ANYOTHERKEY].function; + if (type == ISFUNC && func == rl_do_lowercase_version) + r = _rl_dispatch (_rl_to_lower ((unsigned char)key), map); + else if (type == ISFUNC) + { + /* If we shadowed a function, whatever it is, we somehow need a + keymap with map[key].func == shadowed-function. + Let's use this one. Then we can dispatch using the original + key, since there are commands (e.g., in vi mode) for which it + matters. */ + nt = m[key].type; + nf = m[key].function; + + m[key].type = type; + m[key].function = func; + /* Don't change _rl_dispatching_keymap, set it here */ + _rl_dispatching_keymap = map; /* previous map */ + r = _rl_dispatch_subseq (key, m, 0); + m[key].type = nt; + m[key].function = nf; + } + else + /* We probably shadowed a keymap, so keep going. */ + r = _rl_dispatch (ANYOTHERKEY, m); + } + else if (r < 0 && map[ANYOTHERKEY].function) + { + /* We didn't match (r is probably -1), so return something to + tell the caller that it should try ANYOTHERKEY for an + overridden function. */ + if (RL_ISSTATE (RL_STATE_MACROINPUT)) + _rl_prev_macro_key (); + else + _rl_unget_char (key); + if (rl_key_sequence_length > 0) + rl_executing_keyseq[--rl_key_sequence_length] = '\0'; + _rl_dispatching_keymap = map; + return -2; + } + else if (r < 0 && got_subseq) /* XXX */ + { + /* OK, back up the chain. */ + if (RL_ISSTATE (RL_STATE_MACROINPUT)) + _rl_prev_macro_key (); + else + _rl_unget_char (key); + if (rl_key_sequence_length > 0) + rl_executing_keyseq[--rl_key_sequence_length] = '\0'; + _rl_dispatching_keymap = map; + return -1; + } + + return r; +} + +/* **************************************************************** */ +/* */ +/* Initializations */ +/* */ +/* **************************************************************** */ + +/* Initialize readline (and terminal if not already). */ +int +rl_initialize (void) +{ + /* Initialize the timeout first to get the precise start time. */ + _rl_timeout_init (); + + /* If we have never been called before, initialize the + terminal and data structures. */ + if (rl_initialized == 0) + { + RL_SETSTATE(RL_STATE_INITIALIZING); + readline_initialize_everything (); + RL_UNSETSTATE(RL_STATE_INITIALIZING); + rl_initialized++; + RL_SETSTATE(RL_STATE_INITIALIZED); + } + else + _rl_reset_locale (); /* check current locale and set locale variables */ + + /* Initialize the current line information. */ + _rl_init_line_state (); + + /* We aren't done yet. We haven't even gotten started yet! */ + rl_done = 0; + RL_UNSETSTATE(RL_STATE_DONE|RL_STATE_TIMEOUT|RL_STATE_EOF); + + /* Tell the history routines what is going on. */ + _rl_start_using_history (); + + /* Make the display buffer match the state of the line. */ + rl_reset_line_state (); + + /* No such function typed yet. */ + rl_last_func = (rl_command_func_t *)NULL; + + /* Parsing of key-bindings begins in an enabled state. */ + _rl_parsing_conditionalized_out = 0; + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + _rl_vi_initialize_line (); +#endif + + /* Each line starts in insert mode (the default). */ + _rl_set_insert_mode (RL_IM_DEFAULT, 1); + + return 0; +} + +#if 0 +#if defined (__EMX__) +static void +_emx_build_environ (void) +{ + 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 (void) +{ +#if 0 +#if defined (__EMX__) + if (environ == 0) + _emx_build_environ (); +#endif +#endif + +#if 0 + /* Find out if we are running in Emacs -- UNUSED. */ + running_in_emacs = sh_get_env_value ("EMACS") != (char *)0; +#endif + + /* Set up input and output if they are not already set up. */ + if (!rl_instream) + rl_instream = stdin; + + if (!rl_outstream) + rl_outstream = stdout; + + /* Bind _rl_in_stream and _rl_out_stream immediately. These values + may change, but they may also be used before readline_internal () + is called. */ + _rl_in_stream = rl_instream; + _rl_out_stream = rl_outstream; + + /* Allocate data structures. */ + if (rl_line_buffer == 0) + rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE); + + /* Initialize the terminal interface. */ + if (rl_terminal_name == 0) + rl_terminal_name = sh_get_env_value ("TERM"); + _rl_init_terminal_io (rl_terminal_name); + + /* Bind tty characters to readline functions. */ + readline_default_bindings (); + + /* Initialize the function names. */ + rl_initialize_funmap (); + + /* Decide whether we should automatically go into eight-bit mode. */ + _rl_init_eightbit (); + + /* Read in the init file. */ + rl_read_init_file ((char *)NULL); + + /* XXX */ + if (_rl_horizontal_scroll_mode && _rl_term_autowrap) + { + _rl_screenwidth--; + _rl_screenchars -= _rl_screenheight; + } + + /* Override the effect of any `set keymap' assignments in the + inputrc file. */ + rl_set_keymap_from_edit_mode (); + + /* Try to bind a common arrow key prefix, if not already bound. */ + bind_arrow_keys (); + + /* Bind the bracketed paste prefix assuming that the user will enable + it on terminals that support it. */ + bind_bracketed_paste_prefix (); + + /* If the completion parser's default word break characters haven't + been set yet, then do so now. */ + if (rl_completer_word_break_characters == 0) + rl_completer_word_break_characters = rl_basic_word_break_characters; + +#if defined (COLOR_SUPPORT) + if (_rl_colored_stats || _rl_colored_completion_prefix) + _rl_parse_colors (); +#endif + + rl_executing_keyseq = malloc (_rl_executing_keyseq_size = 16); + if (rl_executing_keyseq) + rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; +} + +/* 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 (void) +{ + if (_rl_bind_stty_chars) + rl_tty_set_default_bindings (_rl_keymap); +} + +/* Reset the default bindings for the terminal special characters we're + interested in back to rl_insert and read the new ones. */ +static void +reset_default_bindings (void) +{ + if (_rl_bind_stty_chars) + { + rl_tty_unset_default_bindings (_rl_keymap); + rl_tty_set_default_bindings (_rl_keymap); + } +} + +/* Bind some common arrow key sequences in MAP. */ +static void +bind_arrow_keys_internal (Keymap map) +{ + Keymap xkeymap; + + xkeymap = _rl_keymap; + _rl_keymap = map; + +#if defined (__MSDOS__) + rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char); + rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char); + rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history); +#endif + + rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history); + rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char); + rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char); + rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line); + rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line); + + rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history); + rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char); + rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char); + rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line); + rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line); + + /* Key bindings for control-arrow keys */ + rl_bind_keyseq_if_unbound ("\033[1;5C", rl_forward_word); + rl_bind_keyseq_if_unbound ("\033[1;5D", rl_backward_word); + rl_bind_keyseq_if_unbound ("\033[3;5~", rl_kill_word); + + /* Key bindings for alt-arrow keys */ + rl_bind_keyseq_if_unbound ("\033[1;3C", rl_forward_word); + rl_bind_keyseq_if_unbound ("\033[1;3D", rl_backward_word); + +#if defined (__MINGW32__) + rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history); + rl_bind_keyseq_if_unbound ("\340M", rl_forward_char); + rl_bind_keyseq_if_unbound ("\340K", rl_backward_char); + rl_bind_keyseq_if_unbound ("\340G", rl_beg_of_line); + rl_bind_keyseq_if_unbound ("\340O", rl_end_of_line); + rl_bind_keyseq_if_unbound ("\340S", rl_delete); + rl_bind_keyseq_if_unbound ("\340R", rl_overwrite_mode); + + /* These may or may not work because of the embedded NUL. */ + rl_bind_keyseq_if_unbound ("\\000H", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\\000P", rl_get_next_history); + rl_bind_keyseq_if_unbound ("\\000M", rl_forward_char); + rl_bind_keyseq_if_unbound ("\\000K", rl_backward_char); + rl_bind_keyseq_if_unbound ("\\000G", rl_beg_of_line); + rl_bind_keyseq_if_unbound ("\\000O", rl_end_of_line); + rl_bind_keyseq_if_unbound ("\\000S", rl_delete); + rl_bind_keyseq_if_unbound ("\\000R", rl_overwrite_mode); +#endif + + _rl_keymap = xkeymap; +} + +/* Try and bind the common arrow key prefixes after giving termcap and + the inputrc file a chance to bind them and create `real' keymaps + for the arrow key prefix. */ +static void +bind_arrow_keys (void) +{ + bind_arrow_keys_internal (emacs_standard_keymap); + +#if defined (VI_MODE) + bind_arrow_keys_internal (vi_movement_keymap); + /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC + in vi command mode while still allowing the arrow keys to work. */ + if (vi_movement_keymap[ESC].type == ISKMAP) + rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap); + bind_arrow_keys_internal (vi_insertion_keymap); +#endif +} + +static void +bind_bracketed_paste_prefix (void) +{ + Keymap xkeymap; + + xkeymap = _rl_keymap; + + _rl_keymap = emacs_standard_keymap; + rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_bracketed_paste_begin); + +#if defined (VI_MODE) + _rl_keymap = vi_insertion_keymap; + rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_bracketed_paste_begin); + /* XXX - is there a reason to do this in the vi command keymap? */ +#endif + + _rl_keymap = xkeymap; +} + +/* **************************************************************** */ +/* */ +/* Saving and Restoring Readline's state */ +/* */ +/* **************************************************************** */ + +int +rl_save_state (struct readline_state *sp) +{ + if (sp == 0) + return -1; + + sp->point = rl_point; + sp->end = rl_end; + sp->mark = rl_mark; + sp->buffer = rl_line_buffer; + sp->buflen = rl_line_buffer_len; + sp->ul = rl_undo_list; + sp->prompt = rl_prompt; + + sp->rlstate = rl_readline_state; + sp->done = rl_done; + sp->kmap = _rl_keymap; + + sp->lastfunc = rl_last_func; + sp->insmode = rl_insert_mode; + sp->edmode = rl_editing_mode; + sp->kseq = rl_executing_keyseq; + sp->kseqlen = rl_key_sequence_length; + sp->inf = rl_instream; + sp->outf = rl_outstream; + sp->pendingin = rl_pending_input; + sp->macro = rl_executing_macro; + + sp->catchsigs = rl_catch_signals; + sp->catchsigwinch = rl_catch_sigwinch; + + sp->entryfunc = rl_completion_entry_function; + sp->menuentryfunc = rl_menu_completion_entry_function; + sp->ignorefunc = rl_ignore_some_completions_function; + sp->attemptfunc = rl_attempted_completion_function; + sp->wordbreakchars = rl_completer_word_break_characters; + + return (0); +} + +int +rl_restore_state (struct readline_state *sp) +{ + if (sp == 0) + return -1; + + rl_point = sp->point; + rl_end = sp->end; + rl_mark = sp->mark; + the_line = rl_line_buffer = sp->buffer; + rl_line_buffer_len = sp->buflen; + rl_undo_list = sp->ul; + rl_prompt = sp->prompt; + + rl_readline_state = sp->rlstate; + rl_done = sp->done; + _rl_keymap = sp->kmap; + + rl_last_func = sp->lastfunc; + rl_insert_mode = sp->insmode; + rl_editing_mode = sp->edmode; + rl_executing_keyseq = sp->kseq; + rl_key_sequence_length = sp->kseqlen; + rl_instream = sp->inf; + rl_outstream = sp->outf; + rl_pending_input = sp->pendingin; + rl_executing_macro = sp->macro; + + rl_catch_signals = sp->catchsigs; + rl_catch_sigwinch = sp->catchsigwinch; + + rl_completion_entry_function = sp->entryfunc; + rl_menu_completion_entry_function = sp->menuentryfunc; + rl_ignore_some_completions_function = sp->ignorefunc; + rl_attempted_completion_function = sp->attemptfunc; + rl_completer_word_break_characters = sp->wordbreakchars; + + rl_deactivate_mark (); + + return (0); +} + +/* Functions to manage the string that is the current key sequence. */ + +void +_rl_init_executing_keyseq (void) +{ + rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; +} + +void +_rl_term_executing_keyseq (void) +{ + rl_executing_keyseq[rl_key_sequence_length] = '\0'; +} + +void +_rl_end_executing_keyseq (void) +{ + if (rl_key_sequence_length > 0) + rl_executing_keyseq[--rl_key_sequence_length] = '\0'; +} + +void +_rl_add_executing_keyseq (int key) +{ + RESIZE_KEYSEQ_BUFFER (); + rl_executing_keyseq[rl_key_sequence_length++] = key; +} + +/* `delete' the last character added to the executing key sequence. Use this + before calling rl_execute_next to avoid keys being added twice. */ +void +_rl_del_executing_keyseq (void) +{ + if (rl_key_sequence_length > 0) + rl_key_sequence_length--; +} diff --git a/readline.h b/readline.h new file mode 100644 index 0000000..cac269f --- /dev/null +++ b/readline.h @@ -0,0 +1,986 @@ +/* Readline.h -- the names of functions callable from within readline. */ + +/* Copyright (C) 1987-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_READLINE_H_) +#define _READLINE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (READLINE_LIBRARY) +# include "rlstdc.h" +# include "rltypedefs.h" +# include "keymaps.h" +# include "tilde.h" +#else +# include +# include +# include +# include +#endif + +/* Hex-encoded Readline version number. */ +#define RL_READLINE_VERSION 0x0802 /* Readline 8.2 */ +#define RL_VERSION_MAJOR 8 +#define RL_VERSION_MINOR 2 + +/* Readline data structures. */ + +/* Maintaining the state of undo. We remember individual deletes and inserts + on a chain of things to do. */ + +/* The actions that undo knows how to undo. Notice that UNDO_DELETE means + to insert some text, and UNDO_INSERT means to delete some text. I.e., + the code tells undo what to undo, not how to undo it. */ +enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; + +/* What an element of THE_UNDO_LIST looks like. */ +typedef struct undo_list { + struct undo_list *next; + int start, end; /* Where the change took place. */ + char *text; /* The text to insert, if undoing a delete. */ + enum undo_code what; /* Delete, Insert, Begin, End. */ +} UNDO_LIST; + +/* The current undo list for RL_LINE_BUFFER. */ +extern UNDO_LIST *rl_undo_list; + +/* The data structure for mapping textual names to code addresses. */ +typedef struct _funmap { + const char *name; + rl_command_func_t *function; +} FUNMAP; + +extern FUNMAP **funmap; + +/* **************************************************************** */ +/* */ +/* Functions available to bind to key sequences */ +/* */ +/* **************************************************************** */ + +/* Bindable commands for numeric arguments. */ +extern int rl_digit_argument (int, int); +extern int rl_universal_argument (int, int); + +/* Bindable commands for moving the cursor. */ +extern int rl_forward_byte (int, int); +extern int rl_forward_char (int, int); +extern int rl_forward (int, int); +extern int rl_backward_byte (int, int); +extern int rl_backward_char (int, int); +extern int rl_backward (int, int); +extern int rl_beg_of_line (int, int); +extern int rl_end_of_line (int, int); +extern int rl_forward_word (int, int); +extern int rl_backward_word (int, int); +extern int rl_refresh_line (int, int); +extern int rl_clear_screen (int, int); +extern int rl_clear_display (int, int); +extern int rl_skip_csi_sequence (int, int); +extern int rl_arrow_keys (int, int); + +extern int rl_previous_screen_line (int, int); +extern int rl_next_screen_line (int, int); + +/* Bindable commands for inserting and deleting text. */ +extern int rl_insert (int, int); +extern int rl_quoted_insert (int, int); +extern int rl_tab_insert (int, int); +extern int rl_newline (int, int); +extern int rl_do_lowercase_version (int, int); +extern int rl_rubout (int, int); +extern int rl_delete (int, int); +extern int rl_rubout_or_delete (int, int); +extern int rl_delete_horizontal_space (int, int); +extern int rl_delete_or_show_completions (int, int); +extern int rl_insert_comment (int, int); + +/* Bindable commands for changing case. */ +extern int rl_upcase_word (int, int); +extern int rl_downcase_word (int, int); +extern int rl_capitalize_word (int, int); + +/* Bindable commands for transposing characters and words. */ +extern int rl_transpose_words (int, int); +extern int rl_transpose_chars (int, int); + +/* Bindable commands for searching within a line. */ +extern int rl_char_search (int, int); +extern int rl_backward_char_search (int, int); + +/* Bindable commands for readline's interface to the command history. */ +extern int rl_beginning_of_history (int, int); +extern int rl_end_of_history (int, int); +extern int rl_get_next_history (int, int); +extern int rl_get_previous_history (int, int); +extern int rl_operate_and_get_next (int, int); +extern int rl_fetch_history (int, int); + +/* Bindable commands for managing the mark and region. */ +extern int rl_set_mark (int, int); +extern int rl_exchange_point_and_mark (int, int); + +/* Bindable commands to set the editing mode (emacs or vi). */ +extern int rl_vi_editing_mode (int, int); +extern int rl_emacs_editing_mode (int, int); + +/* Bindable commands to change the insert mode (insert or overwrite) */ +extern int rl_overwrite_mode (int, int); + +/* Bindable commands for managing key bindings. */ +extern int rl_re_read_init_file (int, int); +extern int rl_dump_functions (int, int); +extern int rl_dump_macros (int, int); +extern int rl_dump_variables (int, int); + +/* Bindable commands for word completion. */ +extern int rl_complete (int, int); +extern int rl_possible_completions (int, int); +extern int rl_insert_completions (int, int); +extern int rl_old_menu_complete (int, int); +extern int rl_menu_complete (int, int); +extern int rl_backward_menu_complete (int, int); + +/* Bindable commands for killing and yanking text, and managing the kill ring. */ +extern int rl_kill_word (int, int); +extern int rl_backward_kill_word (int, int); +extern int rl_kill_line (int, int); +extern int rl_backward_kill_line (int, int); +extern int rl_kill_full_line (int, int); +extern int rl_unix_word_rubout (int, int); +extern int rl_unix_filename_rubout (int, int); +extern int rl_unix_line_discard (int, int); +extern int rl_copy_region_to_kill (int, int); +extern int rl_kill_region (int, int); +extern int rl_copy_forward_word (int, int); +extern int rl_copy_backward_word (int, int); +extern int rl_yank (int, int); +extern int rl_yank_pop (int, int); +extern int rl_yank_nth_arg (int, int); +extern int rl_yank_last_arg (int, int); +extern int rl_bracketed_paste_begin (int, int); +/* Not available unless _WIN32 is defined. */ +#if defined (_WIN32) +extern int rl_paste_from_clipboard (int, int); +#endif + +/* Bindable commands for incremental searching. */ +extern int rl_reverse_search_history (int, int); +extern int rl_forward_search_history (int, int); + +/* Bindable keyboard macro commands. */ +extern int rl_start_kbd_macro (int, int); +extern int rl_end_kbd_macro (int, int); +extern int rl_call_last_kbd_macro (int, int); +extern int rl_print_last_kbd_macro (int, int); + +/* Bindable undo commands. */ +extern int rl_revert_line (int, int); +extern int rl_undo_command (int, int); + +/* Bindable tilde expansion commands. */ +extern int rl_tilde_expand (int, int); + +/* Bindable terminal control commands. */ +extern int rl_restart_output (int, int); +extern int rl_stop_output (int, int); + +/* Miscellaneous bindable commands. */ +extern int rl_abort (int, int); +extern int rl_tty_status (int, int); + +/* Bindable commands for incremental and non-incremental history searching. */ +extern int rl_history_search_forward (int, int); +extern int rl_history_search_backward (int, int); +extern int rl_history_substr_search_forward (int, int); +extern int rl_history_substr_search_backward (int, int); +extern int rl_noninc_forward_search (int, int); +extern int rl_noninc_reverse_search (int, int); +extern int rl_noninc_forward_search_again (int, int); +extern int rl_noninc_reverse_search_again (int, int); + +/* Bindable command used when inserting a matching close character. */ +extern int rl_insert_close (int, int); + +/* Not available unless READLINE_CALLBACKS is defined. */ +extern void rl_callback_handler_install (const char *, rl_vcpfunc_t *); +extern void rl_callback_read_char (void); +extern void rl_callback_handler_remove (void); +extern void rl_callback_sigcleanup (void); + +/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */ +/* VI-mode bindable commands. */ +extern int rl_vi_redo (int, int); +extern int rl_vi_undo (int, int); +extern int rl_vi_yank_arg (int, int); +extern int rl_vi_fetch_history (int, int); +extern int rl_vi_search_again (int, int); +extern int rl_vi_search (int, int); +extern int rl_vi_complete (int, int); +extern int rl_vi_tilde_expand (int, int); +extern int rl_vi_prev_word (int, int); +extern int rl_vi_next_word (int, int); +extern int rl_vi_end_word (int, int); +extern int rl_vi_insert_beg (int, int); +extern int rl_vi_append_mode (int, int); +extern int rl_vi_append_eol (int, int); +extern int rl_vi_eof_maybe (int, int); +extern int rl_vi_insertion_mode (int, int); +extern int rl_vi_insert_mode (int, int); +extern int rl_vi_movement_mode (int, int); +extern int rl_vi_arg_digit (int, int); +extern int rl_vi_change_case (int, int); +extern int rl_vi_put (int, int); +extern int rl_vi_column (int, int); +extern int rl_vi_delete_to (int, int); +extern int rl_vi_change_to (int, int); +extern int rl_vi_yank_to (int, int); +extern int rl_vi_yank_pop (int, int); +extern int rl_vi_rubout (int, int); +extern int rl_vi_delete (int, int); +extern int rl_vi_back_to_indent (int, int); +extern int rl_vi_unix_word_rubout (int, int); +extern int rl_vi_first_print (int, int); +extern int rl_vi_char_search (int, int); +extern int rl_vi_match (int, int); +extern int rl_vi_change_char (int, int); +extern int rl_vi_subst (int, int); +extern int rl_vi_overstrike (int, int); +extern int rl_vi_overstrike_delete (int, int); +extern int rl_vi_replace (int, int); +extern int rl_vi_set_mark (int, int); +extern int rl_vi_goto_mark (int, int); + +/* VI-mode utility functions. */ +extern int rl_vi_check (void); +extern int rl_vi_domove (int, int *); +extern int rl_vi_bracktype (int); + +extern void rl_vi_start_inserting (int, int, int); + +/* VI-mode pseudo-bindable commands, used as utility functions. */ +extern int rl_vi_fWord (int, int); +extern int rl_vi_bWord (int, int); +extern int rl_vi_eWord (int, int); +extern int rl_vi_fword (int, int); +extern int rl_vi_bword (int, int); +extern int rl_vi_eword (int, int); + +/* **************************************************************** */ +/* */ +/* Well Published Functions */ +/* */ +/* **************************************************************** */ + +/* Readline functions. */ +/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */ +extern char *readline (const char *); + +extern int rl_set_prompt (const char *); +extern int rl_expand_prompt (char *); + +extern int rl_initialize (void); + +/* Undocumented; unused by readline */ +extern int rl_discard_argument (void); + +/* Utility functions to bind keys to readline commands. */ +extern int rl_add_defun (const char *, rl_command_func_t *, int); +extern int rl_bind_key (int, rl_command_func_t *); +extern int rl_bind_key_in_map (int, rl_command_func_t *, Keymap); +extern int rl_unbind_key (int); +extern int rl_unbind_key_in_map (int, Keymap); +extern int rl_bind_key_if_unbound (int, rl_command_func_t *); +extern int rl_bind_key_if_unbound_in_map (int, rl_command_func_t *, Keymap); +extern int rl_unbind_function_in_map (rl_command_func_t *, Keymap); +extern int rl_unbind_command_in_map (const char *, Keymap); +extern int rl_bind_keyseq (const char *, rl_command_func_t *); +extern int rl_bind_keyseq_in_map (const char *, rl_command_func_t *, Keymap); +extern int rl_bind_keyseq_if_unbound (const char *, rl_command_func_t *); +extern int rl_bind_keyseq_if_unbound_in_map (const char *, rl_command_func_t *, Keymap); +extern int rl_generic_bind (int, const char *, char *, Keymap); + +extern char *rl_variable_value (const char *); +extern int rl_variable_bind (const char *, const char *); + +/* Backwards compatibility, use rl_bind_keyseq_in_map instead. */ +extern int rl_set_key (const char *, rl_command_func_t *, Keymap); + +/* Backwards compatibility, use rl_generic_bind instead. */ +extern int rl_macro_bind (const char *, const char *, Keymap); + +/* Undocumented in the texinfo manual; not really useful to programs. */ +extern int rl_translate_keyseq (const char *, char *, int *); +extern char *rl_untranslate_keyseq (int); + +extern rl_command_func_t *rl_named_function (const char *); +extern rl_command_func_t *rl_function_of_keyseq (const char *, Keymap, int *); +extern rl_command_func_t *rl_function_of_keyseq_len (const char *, size_t, Keymap, int *); +extern int rl_trim_arg_from_keyseq (const char *, size_t, Keymap); + +extern void rl_list_funmap_names (void); +extern char **rl_invoking_keyseqs_in_map (rl_command_func_t *, Keymap); +extern char **rl_invoking_keyseqs (rl_command_func_t *); + +extern void rl_function_dumper (int); +extern void rl_macro_dumper (int); +extern void rl_variable_dumper (int); + +extern int rl_read_init_file (const char *); +extern int rl_parse_and_bind (char *); + +/* Functions for manipulating keymaps. */ +extern Keymap rl_make_bare_keymap (void); +extern int rl_empty_keymap (Keymap); +extern Keymap rl_copy_keymap (Keymap); +extern Keymap rl_make_keymap (void); +extern void rl_discard_keymap (Keymap); +extern void rl_free_keymap (Keymap); + +extern Keymap rl_get_keymap_by_name (const char *); +extern char *rl_get_keymap_name (Keymap); +extern void rl_set_keymap (Keymap); +extern Keymap rl_get_keymap (void); + +extern int rl_set_keymap_name (const char *, Keymap); + +/* Undocumented; used internally only. */ +extern void rl_set_keymap_from_edit_mode (void); +extern char *rl_get_keymap_name_from_edit_mode (void); + +/* Functions for manipulating the funmap, which maps command names to functions. */ +extern int rl_add_funmap_entry (const char *, rl_command_func_t *); +extern const char **rl_funmap_names (void); +/* Undocumented, only used internally -- there is only one funmap, and this + function may be called only once. */ +extern void rl_initialize_funmap (void); + +/* Utility functions for managing keyboard macros. */ +extern void rl_push_macro_input (char *); + +/* Functions for undoing, from undo.c */ +extern void rl_add_undo (enum undo_code, int, int, char *); +extern void rl_free_undo_list (void); +extern int rl_do_undo (void); +extern int rl_begin_undo_group (void); +extern int rl_end_undo_group (void); +extern int rl_modifying (int, int); + +/* Functions for redisplay. */ +extern void rl_redisplay (void); +extern int rl_on_new_line (void); +extern int rl_on_new_line_with_prompt (void); +extern int rl_forced_update_display (void); +extern int rl_clear_visible_line (void); +extern int rl_clear_message (void); +extern int rl_reset_line_state (void); +extern int rl_crlf (void); + +/* Functions to manage the mark and region, especially the notion of an + active mark and an active region. */ +extern void rl_keep_mark_active (void); + +extern void rl_activate_mark (void); +extern void rl_deactivate_mark (void); +extern int rl_mark_active_p (void); + +#if defined (USE_VARARGS) && defined (PREFER_STDARG) +extern int rl_message (const char *, ...) __attribute__((__format__ (printf, 1, 2))); +#else +extern int rl_message (); +#endif + +extern int rl_show_char (int); + +/* Undocumented in texinfo manual. */ +extern int rl_character_len (int, int); +extern void rl_redraw_prompt_last_line (void); + +/* Save and restore internal prompt redisplay information. */ +extern void rl_save_prompt (void); +extern void rl_restore_prompt (void); + +/* Modifying text. */ +extern void rl_replace_line (const char *, int); +extern int rl_insert_text (const char *); +extern int rl_delete_text (int, int); +extern int rl_kill_text (int, int); +extern char *rl_copy_text (int, int); + +/* Terminal and tty mode management. */ +extern void rl_prep_terminal (int); +extern void rl_deprep_terminal (void); +extern void rl_tty_set_default_bindings (Keymap); +extern void rl_tty_unset_default_bindings (Keymap); + +extern int rl_tty_set_echoing (int); +extern int rl_reset_terminal (const char *); +extern void rl_resize_terminal (void); +extern void rl_set_screen_size (int, int); +extern void rl_get_screen_size (int *, int *); +extern void rl_reset_screen_size (void); + +extern char *rl_get_termcap (const char *); + +/* Functions for character input. */ +extern int rl_stuff_char (int); +extern int rl_execute_next (int); +extern int rl_clear_pending_input (void); +extern int rl_read_key (void); +extern int rl_getc (FILE *); +extern int rl_set_keyboard_input_timeout (int); + +/* Functions to set and reset timeouts. */ +extern int rl_set_timeout (unsigned int, unsigned int); +extern int rl_timeout_remaining (unsigned int *, unsigned int *); + +#undef rl_clear_timeout +#define rl_clear_timeout() rl_set_timeout (0, 0) + +/* `Public' utility functions . */ +extern void rl_extend_line_buffer (int); +extern int rl_ding (void); +extern int rl_alphabetic (int); +extern void rl_free (void *); + +/* Readline signal handling, from signals.c */ +extern int rl_set_signals (void); +extern int rl_clear_signals (void); +extern void rl_cleanup_after_signal (void); +extern void rl_reset_after_signal (void); +extern void rl_free_line_state (void); + +extern int rl_pending_signal (void); +extern void rl_check_signals (void); + +extern void rl_echo_signal_char (int); + +extern int rl_set_paren_blink_timeout (int); + +/* History management functions. */ + +extern void rl_clear_history (void); + +/* Undocumented. */ +extern int rl_maybe_save_line (void); +extern int rl_maybe_unsave_line (void); +extern int rl_maybe_replace_line (void); + +/* Completion functions. */ +extern int rl_complete_internal (int); +extern void rl_display_match_list (char **, int, int); + +extern char **rl_completion_matches (const char *, rl_compentry_func_t *); +extern char *rl_username_completion_function (const char *, int); +extern char *rl_filename_completion_function (const char *, int); + +extern int rl_completion_mode (rl_command_func_t *); + +#if 0 +/* Backwards compatibility (compat.c). These will go away sometime. */ +extern void free_undo_list (void); +extern int maybe_save_line (void); +extern int maybe_unsave_line (void); +extern int maybe_replace_line (void); + +extern int ding (void); +extern int alphabetic (int); +extern int crlf (void); + +extern char **completion_matches (char *, rl_compentry_func_t *); +extern char *username_completion_function (const char *, int); +extern char *filename_completion_function (const char *, int); +#endif + +/* **************************************************************** */ +/* */ +/* Well Published Variables */ +/* */ +/* **************************************************************** */ + +/* The version of this incarnation of the readline library. */ +extern const char *rl_library_version; /* e.g., "4.2" */ +extern int rl_readline_version; /* e.g., 0x0402 */ + +/* True if this is real GNU readline. */ +extern int rl_gnu_readline_p; + +/* Flags word encapsulating the current readline state. */ +extern unsigned long rl_readline_state; + +/* Says which editing mode readline is currently using. 1 means emacs mode; + 0 means vi mode. */ +extern int rl_editing_mode; + +/* Insert or overwrite mode for emacs mode. 1 means insert mode; 0 means + overwrite mode. Reset to insert mode on each input line. */ +extern int rl_insert_mode; + +/* The name of the calling program. You should initialize this to + whatever was in argv[0]. It is used when parsing conditionals. */ +extern const char *rl_readline_name; + +/* The prompt readline uses. This is set from the argument to + readline (), and should not be assigned to directly. */ +extern char *rl_prompt; + +/* The prompt string that is actually displayed by rl_redisplay. Public so + applications can more easily supply their own redisplay functions. */ +extern char *rl_display_prompt; + +/* The line buffer that is in use. */ +extern char *rl_line_buffer; + +/* The location of point, and end. */ +extern int rl_point; +extern int rl_end; + +/* The mark, or saved cursor position. */ +extern int rl_mark; + +/* Flag to indicate that readline has finished with the current input + line and should return it. */ +extern int rl_done; + +/* Flag to indicate that readline has read an EOF character or read has + returned 0 or error, and is returning a NULL line as a result. */ +extern int rl_eof_found; + +/* If set to a character value, that will be the next keystroke read. */ +extern int rl_pending_input; + +/* Non-zero if we called this function from _rl_dispatch(). It's present + so functions can find out whether they were called from a key binding + or directly from an application. */ +extern int rl_dispatching; + +/* Non-zero if the user typed a numeric argument before executing the + current function. */ +extern int rl_explicit_arg; + +/* The current value of the numeric argument specified by the user. */ +extern int rl_numeric_arg; + +/* The address of the last command function Readline executed. */ +extern rl_command_func_t *rl_last_func; + +/* The name of the terminal to use. */ +extern const char *rl_terminal_name; + +/* The input and output streams. */ +extern FILE *rl_instream; +extern FILE *rl_outstream; + +/* If non-zero, Readline gives values of LINES and COLUMNS from the environment + greater precedence than values fetched from the kernel when computing the + screen dimensions. */ +extern int rl_prefer_env_winsize; + +/* If non-zero, then this is the address of a function to call just + before readline_internal () prints the first prompt. */ +extern rl_hook_func_t *rl_startup_hook; + +/* If non-zero, this is the address of a function to call just before + readline_internal_setup () returns and readline_internal starts + reading input characters. */ +extern rl_hook_func_t *rl_pre_input_hook; + +/* The address of a function to call periodically while Readline is + awaiting character input, or NULL, for no event handling. */ +extern rl_hook_func_t *rl_event_hook; + +/* The address of a function to call if a read is interrupted by a signal. */ +extern rl_hook_func_t *rl_signal_event_hook; + +extern rl_hook_func_t *rl_timeout_event_hook; + +/* The address of a function to call if Readline needs to know whether or not + there is data available from the current input source. */ +extern rl_hook_func_t *rl_input_available_hook; + +/* The address of the function to call to fetch a character from the current + Readline input stream */ +extern rl_getc_func_t *rl_getc_function; + +extern rl_voidfunc_t *rl_redisplay_function; + +extern rl_vintfunc_t *rl_prep_term_function; +extern rl_voidfunc_t *rl_deprep_term_function; + +/* Dispatch variables. */ +extern Keymap rl_executing_keymap; +extern Keymap rl_binding_keymap; + +extern int rl_executing_key; +extern char *rl_executing_keyseq; +extern int rl_key_sequence_length; + +/* Display variables. */ +/* If non-zero, readline will erase the entire line, including any prompt, + if the only thing typed on an otherwise-blank line is something bound to + rl_newline. */ +extern int rl_erase_empty_line; + +/* If non-zero, the application has already printed the prompt (rl_prompt) + before calling readline, so readline should not output it the first time + redisplay is done. */ +extern int rl_already_prompted; + +/* A non-zero value means to read only this many characters rather than + up to a character bound to accept-line. */ +extern int rl_num_chars_to_read; + +/* The text of a currently-executing keyboard macro. */ +extern char *rl_executing_macro; + +/* Variables to control readline signal handling. */ +/* If non-zero, readline will install its own signal handlers for + SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ +extern int rl_catch_signals; + +/* If non-zero, readline will install a signal handler for SIGWINCH + that also attempts to call any calling application's SIGWINCH signal + handler. Note that the terminal is not cleaned up before the + application's signal handler is called; use rl_cleanup_after_signal() + to do that. */ +extern int rl_catch_sigwinch; + +/* If non-zero, the readline SIGWINCH handler will modify LINES and + COLUMNS in the environment. */ +extern int rl_change_environment; + +/* Completion variables. */ +/* Pointer to the generator function for completion_matches (). + NULL means to use rl_filename_completion_function (), the default + filename completer. */ +extern rl_compentry_func_t *rl_completion_entry_function; + +/* Optional generator for menu completion. Default is + rl_completion_entry_function (rl_filename_completion_function). */ +extern rl_compentry_func_t *rl_menu_completion_entry_function; + +/* If rl_ignore_some_completions_function is non-NULL it is the address + of a function to call after all of the possible matches have been + generated, but before the actual completion is done to the input line. + The function is called with one argument; a NULL terminated array + of (char *). If your function removes any of the elements, they + must be free()'ed. */ +extern rl_compignore_func_t *rl_ignore_some_completions_function; + +/* Pointer to alternative function to create matches. + Function is called with TEXT, START, and END. + START and END are indices in RL_LINE_BUFFER saying what the boundaries + of TEXT are. + If this function exists and returns NULL then call the value of + rl_completion_entry_function to try to match, otherwise use the + array of strings returned. */ +extern rl_completion_func_t *rl_attempted_completion_function; + +/* The basic list of characters that signal a break between words for the + completer routine. The initial contents of this variable is what + breaks words in the shell, i.e. "n\"\\'`@$>". */ +extern const char *rl_basic_word_break_characters; + +/* The list of characters that signal a break between words for + rl_complete_internal. The default list is the contents of + rl_basic_word_break_characters. */ +extern const char *rl_completer_word_break_characters; + +/* Hook function to allow an application to set the completion word + break characters before readline breaks up the line. Allows + position-dependent word break characters. */ +extern rl_cpvfunc_t *rl_completion_word_break_hook; + +/* List of characters which can be used to quote a substring of the line. + Completion occurs on the entire substring, and within the substring + rl_completer_word_break_characters are treated as any other character, + unless they also appear within this list. */ +extern const char *rl_completer_quote_characters; + +/* List of quote characters which cause a word break. */ +extern const char *rl_basic_quote_characters; + +/* List of characters that need to be quoted in filenames by the completer. */ +extern const char *rl_filename_quote_characters; + +/* List of characters that are word break characters, but should be left + in TEXT when it is passed to the completion function. The shell uses + this to help determine what kind of completing to do. */ +extern const char *rl_special_prefixes; + +/* If non-zero, then this is the address of a function to call when + completing on a directory name. The function is called with + the address of a string (the current directory name) as an arg. It + changes what is displayed when the possible completions are printed + or inserted. The directory completion hook should perform + any necessary dequoting. This function should return 1 if it modifies + the directory name pointer passed as an argument. If the directory + completion hook returns 0, it should not modify the directory name + pointer passed as an argument. */ +extern rl_icppfunc_t *rl_directory_completion_hook; + +/* If non-zero, this is the address of a function to call when completing + a directory name. This function takes the address of the directory name + to be modified as an argument. Unlike rl_directory_completion_hook, it + only modifies the directory name used in opendir(2), not what is displayed + when the possible completions are printed or inserted. If set, it takes + precedence over rl_directory_completion_hook. The directory rewrite + hook should perform any necessary dequoting. This function has the same + return value properties as the directory_completion_hook. + + I'm not happy with how this works yet, so it's undocumented. I'm trying + it in bash to see how well it goes. */ +extern rl_icppfunc_t *rl_directory_rewrite_hook; + +/* If non-zero, this is the address of a function for the completer to call + before deciding which character to append to a completed name. It should + modify the directory name passed as an argument if appropriate, and return + non-zero if it modifies the name. This should not worry about dequoting + the filename; that has already happened by the time it gets here. */ +extern rl_icppfunc_t *rl_filename_stat_hook; + +/* If non-zero, this is the address of a function to call when reading + directory entries from the filesystem for completion and comparing + them to the partial word to be completed. The function should + either return its first argument (if no conversion takes place) or + newly-allocated memory. This can, for instance, convert filenames + between character sets for comparison against what's typed at the + keyboard. The returned value is what is added to the list of + matches. The second argument is the length of the filename to be + converted. */ +extern rl_dequote_func_t *rl_filename_rewrite_hook; + +/* Backwards compatibility with previous versions of readline. */ +#define rl_symbolic_link_hook rl_directory_completion_hook + +/* If non-zero, then this is the address of a function to call when + completing a word would normally display the list of possible matches. + This function is called instead of actually doing the display. + It takes three arguments: (char **matches, int num_matches, int max_length) + where MATCHES is the array of strings that matched, NUM_MATCHES is the + number of strings in that array, and MAX_LENGTH is the length of the + longest string in that array. */ +extern rl_compdisp_func_t *rl_completion_display_matches_hook; + +/* Non-zero means that the results of the matches are to be treated + as filenames. This is ALWAYS zero on entry, and can only be changed + within a completion entry finder function. */ +extern int rl_filename_completion_desired; + +/* Non-zero means that the results of the matches are to be quoted using + double quotes (or an application-specific quoting mechanism) if the + filename contains any characters in rl_word_break_chars. This is + ALWAYS non-zero on entry, and can only be changed within a completion + entry finder function. */ +extern int rl_filename_quoting_desired; + +/* Set to a function to quote a filename in an application-specific fashion. + Called with the text to quote, the type of match found (single or multiple) + and a pointer to the quoting character to be used, which the function can + reset if desired. */ +extern rl_quote_func_t *rl_filename_quoting_function; + +/* Function to call to remove quoting characters from a filename. Called + before completion is attempted, so the embedded quotes do not interfere + with matching names in the file system. */ +extern rl_dequote_func_t *rl_filename_dequoting_function; + +/* Function to call to decide whether or not a word break character is + quoted. If a character is quoted, it does not break words for the + completer. */ +extern rl_linebuf_func_t *rl_char_is_quoted_p; + +/* Non-zero means to suppress normal filename completion after the + user-specified completion function has been called. */ +extern int rl_attempted_completion_over; + +/* Set to a character describing the type of completion being attempted by + rl_complete_internal; available for use by application completion + functions. */ +extern int rl_completion_type; + +/* Set to the last key used to invoke one of the completion functions */ +extern int rl_completion_invoking_key; + +/* Up to this many items will be displayed in response to a + possible-completions call. After that, we ask the user if she + is sure she wants to see them all. The default value is 100. */ +extern int rl_completion_query_items; + +/* Character appended to completed words when at the end of the line. The + default is a space. Nothing is added if this is '\0'. */ +extern int rl_completion_append_character; + +/* If set to non-zero by an application completion function, + rl_completion_append_character will not be appended. */ +extern int rl_completion_suppress_append; + +/* Set to any quote character readline thinks it finds before any application + completion function is called. */ +extern int rl_completion_quote_character; + +/* Set to a non-zero value if readline found quoting anywhere in the word to + be completed; set before any application completion function is called. */ +extern int rl_completion_found_quote; + +/* If non-zero, the completion functions don't append any closing quote. + This is set to 0 by rl_complete_internal and may be changed by an + application-specific completion function. */ +extern int rl_completion_suppress_quote; + +/* If non-zero, readline will sort the completion matches. On by default. */ +extern int rl_sort_completion_matches; + +/* If non-zero, a slash will be appended to completed filenames that are + symbolic links to directory names, subject to the value of the + mark-directories variable (which is user-settable). This exists so + that application completion functions can override the user's preference + (set via the mark-symlinked-directories variable) if appropriate. + It's set to the value of _rl_complete_mark_symlink_dirs in + rl_complete_internal before any application-specific completion + function is called, so without that function doing anything, the user's + preferences are honored. */ +extern int rl_completion_mark_symlink_dirs; + +/* If non-zero, then disallow duplicates in the matches. */ +extern int rl_ignore_completion_duplicates; + +/* If this is non-zero, completion is (temporarily) inhibited, and the + completion character will be inserted as any other. */ +extern int rl_inhibit_completion; + +/* Applications can set this to non-zero to have readline's signal handlers + installed during the entire duration of reading a complete line, as in + readline-6.2. This should be used with care, because it can result in + readline receiving signals and not handling them until it's called again + via rl_callback_read_char, thereby stealing them from the application. + By default, signal handlers are only active while readline is active. */ +extern int rl_persistent_signal_handlers; + +/* Input error; can be returned by (*rl_getc_function) if readline is reading + a top-level command (RL_ISSTATE (RL_STATE_READCMD)). */ +#define READERR (-2) + +/* Definitions available for use by readline clients. */ +#define RL_PROMPT_START_IGNORE '\001' +#define RL_PROMPT_END_IGNORE '\002' + +/* Possible values for do_replace argument to rl_filename_quoting_function, + called by rl_complete_internal. */ +#define NO_MATCH 0 +#define SINGLE_MATCH 1 +#define MULT_MATCH 2 + +/* Possible state values for rl_readline_state */ +#define RL_STATE_NONE 0x000000 /* no state; before first call */ + +#define RL_STATE_INITIALIZING 0x0000001 /* initializing */ +#define RL_STATE_INITIALIZED 0x0000002 /* initialization done */ +#define RL_STATE_TERMPREPPED 0x0000004 /* terminal is prepped */ +#define RL_STATE_READCMD 0x0000008 /* reading a command key */ +#define RL_STATE_METANEXT 0x0000010 /* reading input after ESC */ +#define RL_STATE_DISPATCHING 0x0000020 /* dispatching to a command */ +#define RL_STATE_MOREINPUT 0x0000040 /* reading more input in a command function */ +#define RL_STATE_ISEARCH 0x0000080 /* doing incremental search */ +#define RL_STATE_NSEARCH 0x0000100 /* doing non-inc search */ +#define RL_STATE_SEARCH 0x0000200 /* doing a history search */ +#define RL_STATE_NUMERICARG 0x0000400 /* reading numeric argument */ +#define RL_STATE_MACROINPUT 0x0000800 /* getting input from a macro */ +#define RL_STATE_MACRODEF 0x0001000 /* defining keyboard macro */ +#define RL_STATE_OVERWRITE 0x0002000 /* overwrite mode */ +#define RL_STATE_COMPLETING 0x0004000 /* doing completion */ +#define RL_STATE_SIGHANDLER 0x0008000 /* in readline sighandler */ +#define RL_STATE_UNDOING 0x0010000 /* doing an undo */ +#define RL_STATE_INPUTPENDING 0x0020000 /* rl_execute_next called */ +#define RL_STATE_TTYCSAVED 0x0040000 /* tty special chars saved */ +#define RL_STATE_CALLBACK 0x0080000 /* using the callback interface */ +#define RL_STATE_VIMOTION 0x0100000 /* reading vi motion arg */ +#define RL_STATE_MULTIKEY 0x0200000 /* reading multiple-key command */ +#define RL_STATE_VICMDONCE 0x0400000 /* entered vi command mode at least once */ +#define RL_STATE_CHARSEARCH 0x0800000 /* vi mode char search */ +#define RL_STATE_REDISPLAYING 0x1000000 /* updating terminal display */ + +#define RL_STATE_DONE 0x2000000 /* done; accepted line */ +#define RL_STATE_TIMEOUT 0x4000000 /* done; timed out */ +#define RL_STATE_EOF 0x8000000 /* done; got eof on read */ + +#define RL_SETSTATE(x) (rl_readline_state |= (x)) +#define RL_UNSETSTATE(x) (rl_readline_state &= ~(x)) +#define RL_ISSTATE(x) (rl_readline_state & (x)) + +struct readline_state { + /* line state */ + int point; + int end; + int mark; + int buflen; + char *buffer; + UNDO_LIST *ul; + char *prompt; + + /* global state */ + int rlstate; + int done; + Keymap kmap; + + /* input state */ + rl_command_func_t *lastfunc; + int insmode; + int edmode; + char *kseq; + int kseqlen; + + int pendingin; + FILE *inf; + FILE *outf; + char *macro; + + /* signal state */ + int catchsigs; + int catchsigwinch; + + /* search state */ + + /* completion state */ + rl_compentry_func_t *entryfunc; + rl_compentry_func_t *menuentryfunc; + rl_compignore_func_t *ignorefunc; + rl_completion_func_t *attemptfunc; + const char *wordbreakchars; + + /* options state */ + + /* hook state */ + + /* reserved for future expansion, so the struct size doesn't change */ + char reserved[64]; +}; + +extern int rl_save_state (struct readline_state *); +extern int rl_restore_state (struct readline_state *); + +#ifdef __cplusplus +} +#endif + +#endif /* _READLINE_H_ */ diff --git a/readline.pc.in b/readline.pc.in new file mode 100644 index 0000000..ff79d71 --- /dev/null +++ b/readline.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Readline +Description: Gnu Readline library for command line editing +URL: http://tiswww.cwru.edu/php/chet/readline/rltop.html +Version: @LIBVERSION@ +Requires.private: @TERMCAP_PKG_CONFIG_LIB@ +Libs: -L${libdir} -lreadline +Cflags: -I${includedir} diff --git a/rlconf.h b/rlconf.h new file mode 100644 index 0000000..b6d6a2f --- /dev/null +++ b/rlconf.h @@ -0,0 +1,79 @@ +/* rlconf.h -- readline configuration definitions */ + +/* Copyright (C) 1992-2015 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#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 + +/* Define this to get support for colors when listing completions and in + other places. */ +#define COLOR_SUPPORT + +/* This definition is needed by readline.c, rltty.c, and signals.c. */ +/* If on, then readline handles signals in a way that doesn't suck. */ +#define HANDLE_SIGNALS + +/* Ugly but working hack for binding prefix meta. */ +#define PREFIX_META_HACK + +/* The next-to-last-ditch effort file name for a user-specific init file. */ +#define DEFAULT_INPUTRC "~/.inputrc" + +/* The ultimate last-ditch filename for an init file -- system-wide. */ +#define SYS_INPUTRC "/etc/inputrc" + +/* If defined, expand tabs to spaces. */ +#define DISPLAY_TABS + +/* If defined, use the terminal escape sequence to move the cursor forward + over a character when updating the line rather than rewriting it. */ +/* #define HACK_TERMCAP_MOTION */ + +/* The string inserted by the `insert comment' command. */ +#define RL_COMMENT_BEGIN_DEFAULT "#" + +/* Define this if you want code that allows readline to be used in an + X `callback' style. */ +#define READLINE_CALLBACKS + +/* Define this if you want the cursor to indicate insert or overwrite mode. */ +/* #define CURSOR_MODE */ + +/* Define this if you want to enable code that talks to the Linux kernel + tty auditing system. */ +/* #define ENABLE_TTY_AUDIT_SUPPORT */ + +/* Defaults for the various editing mode indicators, inserted at the beginning + of the last (maybe only) line of the prompt if show-mode-in-prompt is on */ +#define RL_EMACS_MODESTR_DEFAULT "@" +#define RL_EMACS_MODESTR_DEFLEN 1 + +#define RL_VI_INS_MODESTR_DEFAULT "(ins)" +#define RL_VI_INS_MODESTR_DEFLEN 5 +#define RL_VI_CMD_MODESTR_DEFAULT "(cmd)" +#define RL_VI_CMD_MODESTR_DEFLEN 5 + +#endif /* _RLCONF_H_ */ diff --git a/rldefs.h b/rldefs.h new file mode 100644 index 0000000..98577a6 --- /dev/null +++ b/rldefs.h @@ -0,0 +1,166 @@ +/* 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-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_RLDEFS_H_) +#define _RLDEFS_H_ + +#if defined (HAVE_CONFIG_H) +# include "config.h" +#endif + +#include "rlstdc.h" + +#if defined (STRCOLL_BROKEN) +# undef HAVE_STRCOLL +#endif + +#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING) +# define TERMIOS_TTY_DRIVER +#else +# if defined (HAVE_TERMIO_H) +# define TERMIO_TTY_DRIVER +# else +# if !defined (__MINGW32__) +# define NEW_TTY_DRIVER +# else +# define NO_TTY_DRIVER +# endif +# endif +#endif + +/* Posix macro to check file in statbuf for directory-ness. + This requires that 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 +#else /* !HAVE_STRING_H */ +# include +#endif /* !HAVE_STRING_H */ + +#if !defined (strchr) && !defined (__STDC__) +extern char *strchr (), *strrchr (); +#endif /* !strchr && !__STDC__ */ + +#if defined (PREFER_STDARG) +# include +#else +# if defined (PREFER_VARARGS) +# include +# endif +#endif + +#if defined (HAVE_STRCASECMP) +#define _rl_stricmp strcasecmp +#define _rl_strnicmp strncasecmp +#else +extern int _rl_stricmp (const char *, const char *); +extern int _rl_strnicmp (const char *, const char *, int); +#endif + +#if defined (HAVE_STRPBRK) && !defined (HAVE_MULTIBYTE) +# define _rl_strpbrk(a,b) strpbrk((a),(b)) +#else +extern char *_rl_strpbrk (const char *, const char *); +#endif + +#if !defined (emacs_mode) +# define no_mode -1 +# define vi_mode 0 +# define emacs_mode 1 +#endif + +#if !defined (RL_IM_INSERT) +# define RL_IM_INSERT 1 +# define RL_IM_OVERWRITE 0 +# +# define RL_IM_DEFAULT RL_IM_INSERT +#endif + +/* If you cast map[key].function to type (Keymap) on a Cray, + the compiler takes the value of map[key].function and + divides it by 4 to convert between pointer types (pointers + to functions and pointers to structs are different sizes). + This is not what is wanted. */ +#if defined (CRAY) +# define FUNCTION_TO_KEYMAP(map, key) (Keymap)((int)map[key].function) +# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)((int)(data)) +#else +# define FUNCTION_TO_KEYMAP(map, key) (Keymap)(map[key].function) +# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)(data) +#endif + +#ifndef savestring +#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) +#endif + +/* Possible values for _rl_bell_preference. */ +#define NO_BELL 0 +#define AUDIBLE_BELL 1 +#define VISIBLE_BELL 2 + +/* Definitions used when searching the line for characters. */ +/* NOTE: it is necessary that opposite directions are inverses */ +#define FTO 1 /* forward to */ +#define BTO -1 /* backward to */ +#define FFIND 2 /* forward find */ +#define BFIND -2 /* backward find */ + +/* Possible values for the found_quote flags word used by the completion + functions. It says what kind of (shell-like) quoting we found anywhere + in the line. */ +#define RL_QF_SINGLE_QUOTE 0x01 +#define RL_QF_DOUBLE_QUOTE 0x02 +#define RL_QF_BACKSLASH 0x04 +#define RL_QF_OTHER_QUOTE 0x08 + +/* Default readline line buffer length. */ +#define DEFAULT_BUFFER_SIZE 256 + +#if !defined (STREQ) +#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) +#define STREQN(a, b, n) (((n) == 0) ? (1) \ + : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) +#endif + +#if !defined (RL_STRLEN) +# define RL_STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0) +#endif + +#if !defined (FREE) +# define FREE(x) if (x) free (x) +#endif + +#if !defined (SWAP) +# define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0) +#endif + +/* CONFIGURATION SECTION */ +#include "rlconf.h" + +#endif /* !_RLDEFS_H_ */ diff --git a/rlmbutil.h b/rlmbutil.h new file mode 100644 index 0000000..d906057 --- /dev/null +++ b/rlmbutil.h @@ -0,0 +1,225 @@ +/* rlmbutil.h -- utility functions for multibyte characters. */ + +/* Copyright (C) 2001-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_RL_MBUTIL_H_) +#define _RL_MBUTIL_H_ + +#include "rlstdc.h" + +/************************************************/ +/* check multibyte capability for I18N code */ +/************************************************/ + +/* For platforms which support the ISO C amendment 1 functionality we + support user defined character classes. */ + /* Solaris 2.5 has a bug: must be included before . */ +#if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) && defined (HAVE_LOCALE_H) +# include +# include +# if defined (HAVE_ISWCTYPE) && \ + defined (HAVE_ISWLOWER) && \ + defined (HAVE_ISWUPPER) && \ + defined (HAVE_MBSRTOWCS) && \ + defined (HAVE_MBRTOWC) && \ + defined (HAVE_MBRLEN) && \ + defined (HAVE_TOWLOWER) && \ + defined (HAVE_TOWUPPER) && \ + defined (HAVE_WCHAR_T) && \ + defined (HAVE_WCWIDTH) + /* system is supposed to support XPG5 */ +# define HANDLE_MULTIBYTE 1 +# endif +#endif + +/* If we don't want multibyte chars even on a system that supports them, let + the configuring user turn multibyte support off. */ +#if defined (NO_MULTIBYTE_SUPPORT) +# undef HANDLE_MULTIBYTE +#endif + +/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ +#if HANDLE_MULTIBYTE && !defined (HAVE_MBSTATE_T) +# define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0) +# define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0) +# define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0) +# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) +# define mbrlen(s, n, ps) (mbrlen) (s, n, 0) +# define mbstate_t int +#endif + +/* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to + handle multibyte chars (some systems define MB_LEN_MAX as 1) */ +#ifdef HANDLE_MULTIBYTE +# include +# if defined(MB_LEN_MAX) && (MB_LEN_MAX < 16) +# undef MB_LEN_MAX +# endif +# if !defined (MB_LEN_MAX) +# define MB_LEN_MAX 16 +# endif +#endif + +/************************************************/ +/* end of multibyte capability checks for I18N */ +/************************************************/ + +/* + * wchar_t doesn't work for 32-bit values on Windows using MSVC + */ +#ifdef WCHAR_T_BROKEN +# define WCHAR_T char32_t +# define MBRTOWC mbrtoc32 +# define WCRTOMB c32rtomb +#else /* normal systems */ +# define WCHAR_T wchar_t +# define MBRTOWC mbrtowc +# define WCRTOMB wcrtomb +#endif + +/* + * Flags for _rl_find_prev_mbchar and _rl_find_next_mbchar: + * + * MB_FIND_ANY find any multibyte character + * MB_FIND_NONZERO find a non-zero-width multibyte character + */ + +#define MB_FIND_ANY 0x00 +#define MB_FIND_NONZERO 0x01 + +extern int _rl_find_prev_mbchar (char *, int, int); +extern int _rl_find_next_mbchar (char *, int, int, int); + +#ifdef HANDLE_MULTIBYTE + +extern int _rl_compare_chars (char *, int, mbstate_t *, char *, int, mbstate_t *); +extern int _rl_get_char_len (char *, mbstate_t *); +extern int _rl_adjust_point (char *, int, mbstate_t *); + +extern int _rl_read_mbchar (char *, int); +extern int _rl_read_mbstring (int, char *, int); + +extern int _rl_is_mbchar_matched (char *, int, int, char *, int); + +extern WCHAR_T _rl_char_value (char *, int); +extern int _rl_walphabetic (WCHAR_T); + +#define _rl_to_wupper(wc) (iswlower (wc) ? towupper (wc) : (wc)) +#define _rl_to_wlower(wc) (iswupper (wc) ? towlower (wc) : (wc)) + +#define MB_NEXTCHAR(b,s,c,f) \ + ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \ + ? _rl_find_next_mbchar ((b), (s), (c), (f)) \ + : ((s) + (c))) +#define MB_PREVCHAR(b,s,f) \ + ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \ + ? _rl_find_prev_mbchar ((b), (s), (f)) \ + : ((s) - 1)) + +#define MB_INVALIDCH(x) ((x) == (size_t)-1 || (x) == (size_t)-2) +#define MB_NULLWCH(x) ((x) == 0) + +/* Try and shortcut the printable ascii characters to cut down the number of + calls to a libc wcwidth() */ +static inline int +_rl_wcwidth (WCHAR_T wc) +{ + switch (wc) + { + case ' ': case '!': case '"': case '#': case '%': + case '&': case '\'': case '(': case ')': case '*': + case '+': case ',': case '-': case '.': case '/': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case ':': case ';': case '<': case '=': case '>': + case '?': + case 'A': case 'B': case 'C': case 'D': case 'E': + case 'F': case 'G': case 'H': case 'I': case 'J': + case 'K': case 'L': case 'M': case 'N': case 'O': + case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': case 'Y': + case 'Z': + case '[': case '\\': case ']': case '^': case '_': + case 'a': case 'b': case 'c': case 'd': case 'e': + case 'f': case 'g': case 'h': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': + case 'z': case '{': case '|': case '}': case '~': + return 1; + default: + return wcwidth (wc); + } +} + +/* Unicode combining characters range from U+0300 to U+036F */ +#define UNICODE_COMBINING_CHAR(x) ((x) >= 768 && (x) <= 879) + +#if defined (WCWIDTH_BROKEN) +# define WCWIDTH(wc) ((_rl_utf8locale && UNICODE_COMBINING_CHAR(wc)) ? 0 : _rl_wcwidth(wc)) +#else +# define WCWIDTH(wc) _rl_wcwidth(wc) +#endif + +#if defined (WCWIDTH_BROKEN) +# define IS_COMBINING_CHAR(x) (WCWIDTH(x) == 0 && iswcntrl(x) == 0) +#else +# define IS_COMBINING_CHAR(x) (WCWIDTH(x) == 0) +#endif + +#define UTF8_SINGLEBYTE(c) (((c) & 0x80) == 0) +#define UTF8_MBFIRSTCHAR(c) (((c) & 0xc0) == 0xc0) +#define UTF8_MBCHAR(c) (((c) & 0xc0) == 0x80) + +#else /* !HANDLE_MULTIBYTE */ + +#undef MB_LEN_MAX +#undef MB_CUR_MAX + +#define MB_LEN_MAX 1 +#define MB_CUR_MAX 1 + +#define _rl_find_prev_mbchar(b, i, f) (((i) == 0) ? (i) : ((i) - 1)) +#define _rl_find_next_mbchar(b, i1, i2, f) ((i1) + (i2)) + +#define _rl_char_value(buf,ind) ((buf)[(ind)]) + +#define _rl_walphabetic(c) (rl_alphabetic (c)) + +#define _rl_to_wupper(c) (_rl_to_upper (c)) +#define _rl_to_wlower(c) (_rl_to_lower (c)) + +#define MB_NEXTCHAR(b,s,c,f) ((s) + (c)) +#define MB_PREVCHAR(b,s,f) ((s) - 1) + +#define MB_INVALIDCH(x) (0) +#define MB_NULLWCH(x) (0) + +#define UTF8_SINGLEBYTE(c) (1) + +#if !defined (HAVE_WCHAR_T) && !defined (wchar_t) +# define wchar_t int +#endif + +#endif /* !HANDLE_MULTIBYTE */ + +extern int rl_byte_oriented; + +#endif /* _RL_MBUTIL_H_ */ diff --git a/rlprivate.h b/rlprivate.h new file mode 100644 index 0000000..d87d07a --- /dev/null +++ b/rlprivate.h @@ -0,0 +1,633 @@ +/* rlprivate.h -- functions and variables global to the readline library, + but not intended for use by applications. */ + +/* Copyright (C) 1999-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_RL_PRIVATE_H_) +#define _RL_PRIVATE_H_ + +#include "rlconf.h" /* for VISIBLE_STATS */ +#include "rlstdc.h" +#include "posixjmp.h" /* defines procenv_t */ +#include "rlmbutil.h" /* for HANDLE_MULTIBYTE */ + +/************************************************************************* + * * + * Convenience definitions * + * * + *************************************************************************/ + +#define EMACS_MODE() (rl_editing_mode == emacs_mode) +#define VI_COMMAND_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) +#define VI_INSERT_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_insertion_keymap) + +#define RL_CHECK_SIGNALS() \ + do { \ + if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \ + } while (0) + +#define RL_SIG_RECEIVED() (_rl_caught_signal != 0) +#define RL_SIGINT_RECEIVED() (_rl_caught_signal == SIGINT) +#define RL_SIGWINCH_RECEIVED() (_rl_caught_signal == SIGWINCH) + +#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay) +#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc) + +/************************************************************************* + * * + * Global structs undocumented in texinfo manual and not in readline.h * + * * + *************************************************************************/ +/* search types */ +#define RL_SEARCH_ISEARCH 0x01 /* incremental search */ +#define RL_SEARCH_NSEARCH 0x02 /* non-incremental search */ +#define RL_SEARCH_CSEARCH 0x04 /* intra-line char search */ + +/* search flags */ +#define SF_REVERSE 0x01 +#define SF_FOUND 0x02 +#define SF_FAILED 0x04 +#define SF_CHGKMAP 0x08 +#define SF_PATTERN 0x10 +#define SF_NOCASE 0x20 /* unused so far */ + +typedef struct __rl_search_context +{ + int type; + int sflags; + + char *search_string; + int search_string_index; + int search_string_size; + + char **lines; + char *allocated_line; + int hlen; + int hindex; + + int save_point; + int save_mark; + int save_line; + int last_found_line; + char *prev_line_found; + + UNDO_LIST *save_undo_list; + + Keymap keymap; /* used when dispatching commands in search string */ + Keymap okeymap; /* original keymap */ + + int history_pos; + int direction; + + int prevc; + int lastc; +#if defined (HANDLE_MULTIBYTE) + char mb[MB_LEN_MAX]; + char pmb[MB_LEN_MAX]; +#endif + + char *sline; + int sline_len; + int sline_index; + + char *search_terminators; +} _rl_search_cxt; + +struct _rl_cmd { + Keymap map; + int count; + int key; + rl_command_func_t *func; +}; +extern struct _rl_cmd _rl_pending_command; +extern struct _rl_cmd *_rl_command_to_execute; + +/* Callback data for reading numeric arguments */ +#define NUM_SAWMINUS 0x01 +#define NUM_SAWDIGITS 0x02 +#define NUM_READONE 0x04 + +typedef int _rl_arg_cxt; + +/* A context for reading key sequences longer than a single character when + using the callback interface. */ +#define KSEQ_DISPATCHED 0x01 +#define KSEQ_SUBSEQ 0x02 +#define KSEQ_RECURSIVE 0x04 + +typedef struct __rl_keyseq_context +{ + int flags; + int subseq_arg; + int subseq_retval; /* XXX */ + int okey; + + Keymap dmap; + Keymap oldmap; + + struct __rl_keyseq_context *ocxt; + int childval; +} _rl_keyseq_cxt; + +/* vi-mode commands that use result of motion command to define boundaries */ +#define VIM_DELETE 0x01 +#define VIM_CHANGE 0x02 +#define VIM_YANK 0x04 + +/* various states for vi-mode commands that use motion commands. reflects + RL_READLINE_STATE */ +#define VMSTATE_READ 0x01 +#define VMSTATE_NUMARG 0x02 + +typedef struct __rl_vimotion_context +{ + int op; + int state; + int flags; /* reserved */ + _rl_arg_cxt ncxt; + int numeric_arg; + int start, end; /* rl_point, rl_end */ + int key, motion; /* initial key, motion command */ +} _rl_vimotion_cxt; + +/* fill in more as needed */ +/* `Generic' callback data and functions */ +typedef struct __rl_callback_generic_arg +{ + int count; + int i1, i2; + /* add here as needed */ +} _rl_callback_generic_arg; + +typedef int _rl_callback_func_t (_rl_callback_generic_arg *); + +typedef void _rl_sigcleanup_func_t (int, void *); + +/************************************************************************* + * * + * Global functions undocumented in texinfo manual and not in readline.h * + * * + *************************************************************************/ + +/************************************************************************* + * * + * Global variables undocumented in texinfo manual and not in readline.h * + * * + *************************************************************************/ + +/* complete.c */ +extern int rl_complete_with_tilde_expansion; +#if defined (VISIBLE_STATS) +extern int rl_visible_stats; +#endif /* VISIBLE_STATS */ +#if defined (COLOR_SUPPORT) +extern int _rl_colored_stats; +extern int _rl_colored_completion_prefix; +#endif + +/* readline.c */ +extern int rl_line_buffer_len; +extern int rl_arg_sign; +extern int rl_visible_prompt_length; +extern int rl_byte_oriented; + +/* display.c */ +extern int rl_display_fixed; + +/* parens.c */ +extern int rl_blink_matching_paren; + +/************************************************************************* + * * + * Global functions and variables unused and undocumented * + * * + *************************************************************************/ + +/* kill.c */ +extern int rl_set_retained_kills (int); + +/* terminal.c */ +extern void _rl_set_screen_size (int, int); + +/* undo.c */ +extern int _rl_fix_last_undo_of_type (int, int, int); + +/* util.c */ +extern char *_rl_savestring (const char *); + +/************************************************************************* + * * + * Functions and variables private to the readline library * + * * + *************************************************************************/ + +/* NOTE: Functions and variables prefixed with `_rl_' are + pseudo-global: they are global so they can be shared + between files in the readline library, but are not intended + to be visible to readline callers. */ + +/************************************************************************* + * Undocumented private functions * + *************************************************************************/ + +#if defined(READLINE_CALLBACKS) + +/* readline.c */ +extern void readline_internal_setup (void); +extern char *readline_internal_teardown (int); +extern int readline_internal_char (void); + +extern _rl_keyseq_cxt *_rl_keyseq_cxt_alloc (void); +extern void _rl_keyseq_cxt_dispose (_rl_keyseq_cxt *); +extern void _rl_keyseq_chain_dispose (void); + +extern int _rl_dispatch_callback (_rl_keyseq_cxt *); + +/* callback.c */ +extern _rl_callback_generic_arg *_rl_callback_data_alloc (int); +extern void _rl_callback_data_dispose (_rl_callback_generic_arg *); + +#endif /* READLINE_CALLBACKS */ + +/* bind.c */ +extern char *_rl_untranslate_macro_value (char *, int); + +/* complete.c */ +extern void _rl_reset_completion_state (void); +extern char _rl_find_completion_word (int *, int *); +extern void _rl_free_match_list (char **); + +/* display.c */ +extern char *_rl_strip_prompt (char *); +extern void _rl_reset_prompt (void); +extern void _rl_move_vert (int); +extern void _rl_save_prompt (void); +extern void _rl_restore_prompt (void); +extern char *_rl_make_prompt_for_search (int); +extern void _rl_erase_at_end_of_line (int); +extern void _rl_clear_to_eol (int); +extern void _rl_clear_screen (int); +extern void _rl_update_final (void); +extern void _rl_optimize_redisplay (void); +extern void _rl_redisplay_after_sigwinch (void); +extern void _rl_clean_up_for_exit (void); +extern void _rl_erase_entire_line (void); +extern int _rl_current_display_line (void); +extern void _rl_refresh_line (void); + +/* input.c */ +extern int _rl_any_typein (void); +extern int _rl_input_available (void); +extern int _rl_nchars_available (void); +extern int _rl_input_queued (int); +extern void _rl_insert_typein (int); +extern int _rl_unget_char (int); +extern int _rl_pushed_input_available (void); + +extern int _rl_timeout_init (void); +extern int _rl_timeout_handle_sigalrm (void); +#if defined (_POSIXSELECT_H_) +/* use as a sentinel for fd_set, struct timeval, and sigset_t definitions */ +extern int _rl_timeout_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *, const sigset_t *); +#endif + +/* isearch.c */ +extern _rl_search_cxt *_rl_scxt_alloc (int, int); +extern void _rl_scxt_dispose (_rl_search_cxt *, int); + +extern int _rl_isearch_dispatch (_rl_search_cxt *, int); +extern int _rl_isearch_callback (_rl_search_cxt *); +extern int _rl_isearch_cleanup (_rl_search_cxt *, int); + +extern int _rl_search_getchar (_rl_search_cxt *); + +/* kill.c */ +#ifndef BRACKETED_PASTE_DEFAULT +# define BRACKETED_PASTE_DEFAULT 1 /* XXX - for now */ +#endif + +#define BRACK_PASTE_PREF "\033[200~" +#define BRACK_PASTE_SUFF "\033[201~" + +#define BRACK_PASTE_LAST '~' +#define BRACK_PASTE_SLEN 6 + +#define BRACK_PASTE_INIT "\033[?2004h" +#define BRACK_PASTE_FINI "\033[?2004l\r" + +extern int _rl_read_bracketed_paste_prefix (int); +extern char *_rl_bracketed_text (size_t *); +extern int _rl_bracketed_read_key (void); +extern int _rl_bracketed_read_mbstring (char *, int); + +/* macro.c */ +extern void _rl_with_macro_input (char *); +extern int _rl_peek_macro_key (void); +extern int _rl_next_macro_key (void); +extern int _rl_prev_macro_key (void); +extern void _rl_push_executing_macro (void); +extern void _rl_pop_executing_macro (void); +extern void _rl_add_macro_char (int); +extern void _rl_kill_kbd_macro (void); + +/* misc.c */ +extern int _rl_arg_overflow (void); +extern void _rl_arg_init (void); +extern int _rl_arg_getchar (void); +extern int _rl_arg_callback (_rl_arg_cxt); +extern void _rl_reset_argument (void); + +extern void _rl_start_using_history (void); +extern int _rl_free_saved_history_line (void); +extern void _rl_set_insert_mode (int, int); + +extern void _rl_revert_previous_lines (void); +extern void _rl_revert_all_lines (void); + +/* nls.c */ +extern char *_rl_init_locale (void); +extern int _rl_init_eightbit (void); +extern void _rl_reset_locale (void); + +/* parens.c */ +extern void _rl_enable_paren_matching (int); + +/* readline.c */ +extern void _rl_init_line_state (void); +extern void _rl_set_the_line (void); +extern int _rl_dispatch (int, Keymap); +extern int _rl_dispatch_subseq (int, Keymap, int); +extern void _rl_internal_char_cleanup (void); + +extern void _rl_init_executing_keyseq (void); +extern void _rl_term_executing_keyseq (void); +extern void _rl_end_executing_keyseq (void); +extern void _rl_add_executing_keyseq (int); +extern void _rl_del_executing_keyseq (void); + +extern rl_command_func_t *_rl_executing_func; + +/* rltty.c */ +extern int _rl_disable_tty_signals (void); +extern int _rl_restore_tty_signals (void); + +/* search.c */ +extern int _rl_nsearch_callback (_rl_search_cxt *); +extern int _rl_nsearch_cleanup (_rl_search_cxt *, int); + +/* signals.c */ +extern void _rl_signal_handler (int); + +extern void _rl_block_sigint (void); +extern void _rl_release_sigint (void); +extern void _rl_block_sigwinch (void); +extern void _rl_release_sigwinch (void); + +/* terminal.c */ +extern void _rl_get_screen_size (int, int); +extern void _rl_sigwinch_resize_terminal (void); +extern int _rl_init_terminal_io (const char *); +#ifdef _MINIX +extern void _rl_output_character_function (int); +#else +extern int _rl_output_character_function (int); +#endif +extern void _rl_cr (void); +extern void _rl_output_some_chars (const char *, int); +extern int _rl_backspace (int); +extern void _rl_enable_meta_key (void); +extern void _rl_disable_meta_key (void); +extern void _rl_control_keypad (int); +extern void _rl_set_cursor (int, int); +extern void _rl_standout_on (void); +extern void _rl_standout_off (void); +extern int _rl_reset_region_color (int, const char *); +extern void _rl_region_color_on (void); +extern void _rl_region_color_off (void); + +/* text.c */ +extern void _rl_fix_point (int); +extern void _rl_fix_mark (void); +extern int _rl_replace_text (const char *, int, int); +extern int _rl_forward_char_internal (int); +extern int _rl_backward_char_internal (int); +extern int _rl_insert_char (int, int); +extern int _rl_overwrite_char (int, int); +extern int _rl_overwrite_rubout (int, int); +extern int _rl_rubout_char (int, int); +#if defined (HANDLE_MULTIBYTE) +extern int _rl_char_search_internal (int, int, char *, int); +#else +extern int _rl_char_search_internal (int, int, int); +#endif +extern int _rl_set_mark_at_pos (int); + +/* undo.c */ +extern UNDO_LIST *_rl_copy_undo_entry (UNDO_LIST *); +extern UNDO_LIST *_rl_copy_undo_list (UNDO_LIST *); +extern void _rl_free_undo_list (UNDO_LIST *); + +/* util.c */ +#if defined (USE_VARARGS) && defined (PREFER_STDARG) +extern void _rl_ttymsg (const char *, ...) __attribute__((__format__ (printf, 1, 2))); +extern void _rl_errmsg (const char *, ...) __attribute__((__format__ (printf, 1, 2))); +extern void _rl_trace (const char *, ...) __attribute__((__format__ (printf, 1, 2))); +#else +extern void _rl_ttymsg (); +extern void _rl_errmsg (); +extern void _rl_trace (); +#endif +extern void _rl_audit_tty (char *); + +extern int _rl_tropen (void); + +extern int _rl_abort_internal (void); +extern int _rl_null_function (int, int); +extern char *_rl_strindex (const char *, const char *); +extern int _rl_qsort_string_compare (char **, char **); +extern int (_rl_uppercase_p) (int); +extern int (_rl_lowercase_p) (int); +extern int (_rl_pure_alphabetic) (int); +extern int (_rl_digit_p) (int); +extern int (_rl_to_lower) (int); +extern int (_rl_to_upper) (int); +extern int (_rl_digit_value) (int); + +/* vi_mode.c */ +extern void _rl_vi_initialize_line (void); +extern void _rl_vi_reset_last (void); +extern void _rl_vi_set_last (int, int, int); +extern int _rl_vi_textmod_command (int); +extern int _rl_vi_motion_command (int); +extern void _rl_vi_done_inserting (void); +extern int _rl_vi_domove_callback (_rl_vimotion_cxt *); +extern int _rl_vi_domove_motion_cleanup (int, _rl_vimotion_cxt *); + +/* Use HS_HISTORY_VERSION as the sentinel to see if we've included history.h + and so can use HIST_ENTRY */ +#if defined (HS_HISTORY_VERSION) +extern void _rl_free_history_entry (HIST_ENTRY *); +#endif + +/************************************************************************* + * Undocumented private variables * + *************************************************************************/ + +/* bind.c */ +extern const char * const _rl_possible_control_prefixes[]; +extern const char * const _rl_possible_meta_prefixes[]; + +/* callback.c */ +extern _rl_callback_func_t *_rl_callback_func; +extern _rl_callback_generic_arg *_rl_callback_data; + +/* complete.c */ +extern int _rl_complete_show_all; +extern int _rl_complete_show_unmodified; +extern int _rl_complete_mark_directories; +extern int _rl_complete_mark_symlink_dirs; +extern int _rl_completion_prefix_display_length; +extern int _rl_completion_columns; +extern int _rl_print_completions_horizontally; +extern int _rl_completion_case_fold; +extern int _rl_completion_case_map; +extern int _rl_match_hidden_files; +extern int _rl_page_completions; +extern int _rl_skip_completed_text; +extern int _rl_menu_complete_prefix_first; + +/* display.c */ +extern int _rl_vis_botlin; +extern int _rl_last_c_pos; +extern int _rl_suppress_redisplay; +extern int _rl_want_redisplay; + +extern char *_rl_emacs_mode_str; +extern int _rl_emacs_modestr_len; +extern char *_rl_vi_ins_mode_str; +extern int _rl_vi_ins_modestr_len; +extern char *_rl_vi_cmd_mode_str; +extern int _rl_vi_cmd_modestr_len; + +/* isearch.c */ +extern char *_rl_isearch_terminators; + +extern _rl_search_cxt *_rl_iscxt; + +/* macro.c */ +extern char *_rl_executing_macro; + +/* misc.c */ +extern int _rl_history_preserve_point; +extern int _rl_history_saved_point; + +extern _rl_arg_cxt _rl_argcxt; + +/* nls.c */ +extern int _rl_utf8locale; + +/* readline.c */ +extern int _rl_echoing_p; +extern int _rl_horizontal_scroll_mode; +extern int _rl_mark_modified_lines; +extern int _rl_bell_preference; +extern int _rl_meta_flag; +extern int _rl_convert_meta_chars_to_ascii; +extern int _rl_output_meta_chars; +extern int _rl_bind_stty_chars; +extern int _rl_revert_all_at_newline; +extern int _rl_echo_control_chars; +extern int _rl_show_mode_in_prompt; +extern int _rl_enable_bracketed_paste; +extern int _rl_enable_active_region; +extern char *_rl_active_region_start_color; +extern char *_rl_active_region_end_color; +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 _rl_top_level; +extern _rl_keyseq_cxt *_rl_kscxt; +extern int _rl_keyseq_timeout; + +extern int _rl_executing_keyseq_size; + +extern rl_hook_func_t *_rl_internal_startup_hook; + +/* search.c */ +extern _rl_search_cxt *_rl_nscxt; +extern int _rl_history_search_pos; + +/* signals.c */ +extern int volatile _rl_caught_signal; + +extern _rl_sigcleanup_func_t *_rl_sigcleanup; +extern void *_rl_sigcleanarg; + +extern int _rl_echoctl; + +extern int _rl_intr_char; +extern int _rl_quit_char; +extern int _rl_susp_char; + +/* terminal.c */ +extern int _rl_enable_keypad; +extern int _rl_enable_meta; +extern char *_rl_term_clreol; +extern char *_rl_term_clrpag; +extern char *_rl_term_clrscroll; +extern char *_rl_term_im; +extern char *_rl_term_ic; +extern char *_rl_term_ei; +extern char *_rl_term_DC; +extern char *_rl_term_up; +extern char *_rl_term_dc; +extern char *_rl_term_cr; +extern char *_rl_term_IC; +extern char *_rl_term_forward_char; +extern int _rl_screenheight; +extern int _rl_screenwidth; +extern int _rl_screenchars; +extern int _rl_terminal_can_insert; +extern int _rl_term_autowrap; + +/* text.c */ +extern int _rl_optimize_typeahead; +extern int _rl_keep_mark_active; + +/* undo.c */ +extern int _rl_doing_an_undo; +extern int _rl_undo_group_level; + +/* vi_mode.c */ +extern int _rl_vi_last_command; +extern int _rl_vi_redoing; +extern _rl_vimotion_cxt *_rl_vimvcxt; + +/* Use HS_HISTORY_VERSION as the sentinel to see if we've included history.h + and so can use HIST_ENTRY */ +#if defined (HS_HISTORY_VERSION) +extern HIST_ENTRY *_rl_saved_line_for_history; +#endif + +#endif /* _RL_PRIVATE_H_ */ diff --git a/rlshell.h b/rlshell.h new file mode 100644 index 0000000..6055b14 --- /dev/null +++ b/rlshell.h @@ -0,0 +1,33 @@ +/* rlshell.h -- utility functions normally provided by bash. */ + +/* Copyright (C) 1999-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_RL_SHELL_H_) +#define _RL_SHELL_H_ + +#include "rlstdc.h" + +extern char *sh_single_quote (char *); +extern void sh_set_lines_and_columns (int, int); +extern char *sh_get_env_value (const char *); +extern char *sh_get_home_dir (void); +extern int sh_unset_nodelay_mode (int); + +#endif /* _RL_SHELL_H_ */ diff --git a/rlstdc.h b/rlstdc.h new file mode 100644 index 0000000..2aaa30b --- /dev/null +++ b/rlstdc.h @@ -0,0 +1,57 @@ +/* stdc.h -- macros to make source compile on both ANSI C and K&R C compilers. */ + +/* Copyright (C) 1993-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_RL_STDC_H_) +#define _RL_STDC_H_ + +/* Adapted from BSD /usr/include/sys/cdefs.h. */ + +/* A function can be defined using prototypes and compile on both ANSI C + and traditional C compilers with something like this: + extern char *func PARAMS((char *, char *, int)); */ + +#if !defined (PARAMS) +# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) +# define PARAMS(protos) protos +# else +# define PARAMS(protos) () +# endif +#endif + +#ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) +# define __attribute__(x) +# endif +#endif + +/* Moved from config.h.in because readline.h:rl_message depends on these + defines. */ +#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 + +#endif /* !_RL_STDC_H_ */ diff --git a/rltty.c b/rltty.c new file mode 100644 index 0000000..882a3d4 --- /dev/null +++ b/rltty.c @@ -0,0 +1,995 @@ +/* rltty.c -- functions to prepare and restore the terminal for readline's + use. */ + +/* Copyright (C) 1992-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#include "rldefs.h" + +#include "rltty.h" +#if defined (HAVE_SYS_IOCTL_H) +# include /* include for declaration of ioctl */ +#endif + +#include "readline.h" +#include "rlprivate.h" + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal; +rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal; + +static void set_winsize (int); + +/* **************************************************************** */ +/* */ +/* Saving and Restoring the TTY */ +/* */ +/* **************************************************************** */ + +/* Non-zero means that the terminal is in a prepped state. There are several + flags that are OR'd in to denote whether or not we have sent various + init strings to the terminal. */ +#define TPX_PREPPED 0x01 +#define TPX_BRACKPASTE 0x02 +#define TPX_METAKEY 0x04 + +static int terminal_prepped; + +static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars; + +/* If non-zero, means that this process has called tcflow(fd, TCOOFF) + and output is suspended. */ +#if defined (__ksr1__) +static int ksrflow; +#endif + +/* Dummy call to force a backgrounded readline to stop before it tries + to get the tty settings. */ +static void +set_winsize (tty) + int tty; +{ +#if defined (TIOCGWINSZ) + struct winsize w; + + if (ioctl (tty, TIOCGWINSZ, &w) == 0) + (void) ioctl (tty, TIOCSWINSZ, &w); +#endif /* TIOCGWINSZ */ +} + +#if defined (NO_TTY_DRIVER) +/* Nothing */ +#elif defined (NEW_TTY_DRIVER) + +/* Values for the `flags' field of a struct bsdtty. This tells which + elements of the struct bsdtty have been fetched from the system and + are valid. */ +#define SGTTY_SET 0x01 +#define LFLAG_SET 0x02 +#define TCHARS_SET 0x04 +#define LTCHARS_SET 0x08 + +struct bsdtty { + struct sgttyb sgttyb; /* Basic BSD tty driver information. */ + int lflag; /* Local mode flags, like LPASS8. */ +#if defined (TIOCGETC) + struct tchars tchars; /* Terminal special characters, including ^S and ^Q. */ +#endif +#if defined (TIOCGLTC) + struct ltchars ltchars; /* 4.2 BSD editing characters */ +#endif + int flags; /* Bitmap saying which parts of the struct are valid. */ +}; + +#define TIOTYPE struct bsdtty + +static TIOTYPE otio; + +static void save_tty_chars (TIOTYPE *); +static int _get_tty_settings (int, TIOTYPE *); +static int get_tty_settings (int, TIOTYPE *); +static int _set_tty_settings (int, TIOTYPE *); +static int set_tty_settings (int, TIOTYPE *); + +static void prepare_terminal_settings (int, TIOTYPE, TIOTYPE *); + +static void set_special_char (Keymap, TIOTYPE *, int, rl_command_func_t *); + +static void +save_tty_chars (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_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc; + _rl_quit_char = _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_susp_char = _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 (int tty, TIOTYPE *tiop) +{ + set_winsize (tty); + + tiop->flags = tiop->lflag = 0; + + errno = 0; + if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0) + return -1; + tiop->flags |= SGTTY_SET; + +#if defined (TIOCLGET) + if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0) + tiop->flags |= LFLAG_SET; +#endif + +#if defined (TIOCGETC) + if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0) + tiop->flags |= TCHARS_SET; +#endif + +#if defined (TIOCGLTC) + if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0) + tiop->flags |= LTCHARS_SET; +#endif + + return 0; +} + +static int +set_tty_settings (int tty, TIOTYPE *tiop) +{ + if (tiop->flags & SGTTY_SET) + { + ioctl (tty, TIOCSETN, &(tiop->sgttyb)); + tiop->flags &= ~SGTTY_SET; + } + _rl_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 (int meta_flag, TIOTYPE oldtio, TIOTYPE *tiop) +{ + _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO); + _rl_echoctl = (oldtio.sgttyb.sg_flags & ECHOCTL); + + /* Copy the original settings to the structure we're going to use for + our settings. */ + tiop->sgttyb = oldtio.sgttyb; + tiop->lflag = oldtio.lflag; +#if defined (TIOCGETC) + tiop->tchars = oldtio.tchars; +#endif +#if defined (TIOCGLTC) + tiop->ltchars = oldtio.ltchars; +#endif + tiop->flags = oldtio.flags; + + /* First, the basic settings to put us into character-at-a-time, no-echo + input mode. */ + tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD); + tiop->sgttyb.sg_flags |= CBREAK; + + /* If this terminal doesn't care how the 8th bit is used, then we can + use it for the meta-key. If only one of even or odd parity is + specified, then the terminal is using parity, and we cannot. */ +#if !defined (ANYP) +# define ANYP (EVENP | ODDP) +#endif + if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) || + ((oldtio.sgttyb.sg_flags & ANYP) == 0)) + { + tiop->sgttyb.sg_flags |= ANYP; + + /* Hack on local mode flags if we can. */ +#if defined (TIOCLGET) +# if defined (LPASS8) + tiop->lflag |= LPASS8; +# endif /* LPASS8 */ +#endif /* TIOCLGET */ + } + +#if defined (TIOCGETC) +# if defined (USE_XON_XOFF) + /* Get rid of terminal output start and stop characters. */ + tiop->tchars.t_stopc = -1; /* C-s */ + tiop->tchars.t_startc = -1; /* C-q */ + + /* If there is an XON character, bind it to restart the output. */ + if (oldtio.tchars.t_startc != -1) + rl_bind_key (oldtio.tchars.t_startc, rl_restart_output); +# endif /* USE_XON_XOFF */ + + /* If there is an EOF char, bind _rl_eof_char to it. */ + if (oldtio.tchars.t_eofc != -1) + _rl_eof_char = oldtio.tchars.t_eofc; + +# if defined (NO_KILL_INTR) + /* Get rid of terminal-generated SIGQUIT and SIGINT. */ + tiop->tchars.t_quitc = -1; /* C-\ */ + tiop->tchars.t_intrc = -1; /* C-c */ +# endif /* NO_KILL_INTR */ +#endif /* TIOCGETC */ + +#if defined (TIOCGLTC) + /* Make the interrupt keys go away. Just enough to make people happy. */ + tiop->ltchars.t_dsuspc = -1; /* C-y */ + tiop->ltchars.t_lnextc = -1; /* C-v */ +#endif /* TIOCGLTC */ +} + +#else /* !defined (NEW_TTY_DRIVER) */ + +#if !defined (VMIN) +# define VMIN VEOF +#endif + +#if !defined (VTIME) +# define VTIME VEOL +#endif + +#if defined (TERMIOS_TTY_DRIVER) +# define TIOTYPE struct termios +# define DRAIN_OUTPUT(fd) tcdrain (fd) +# define GETATTR(tty, tiop) (tcgetattr (tty, tiop)) +# ifdef M_UNIX +# define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop)) +# else +# define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop)) +# endif /* !M_UNIX */ +#else +# define TIOTYPE struct termio +# define DRAIN_OUTPUT(fd) +# define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop)) +# define SETATTR(tty, tiop) (ioctl (tty, TCSETAW, tiop)) +#endif /* !TERMIOS_TTY_DRIVER */ + +static TIOTYPE otio; + +static void save_tty_chars (TIOTYPE *); +static int _get_tty_settings (int, TIOTYPE *); +static int get_tty_settings (int, TIOTYPE *); +static int _set_tty_settings (int, TIOTYPE *); +static int set_tty_settings (int, TIOTYPE *); + +static void prepare_terminal_settings (int, TIOTYPE, TIOTYPE *); + +static void set_special_char (Keymap, TIOTYPE *, int, rl_command_func_t *); +static void _rl_bind_tty_special_chars (Keymap, TIOTYPE); + +#if defined (FLUSHO) +# define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO) +#else +# define OUTPUT_BEING_FLUSHED(tp) 0 +#endif + +static void +save_tty_chars (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_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR]; + _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT]; +#ifdef VSUSP + _rl_susp_char = _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 (char *msg) +{ + _rl_errmsg ("warning: %s", msg); +} +#endif + +#if defined (_AIX) +void +setopost (TIOTYPE *tp) +{ + if ((tp->c_oflag & OPOST) == 0) + { + _rl_errmsg ("warning: turning on OPOST for terminal\r"); + tp->c_oflag |= OPOST|ONLCR; + } +} +#endif + +static int +_get_tty_settings (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) + _rl_errmsg ("warning: turning off output flushing"); + tiop->c_lflag &= ~FLUSHO; + break; +#else + continue; +#endif + } + break; + } + + return 0; +} + +static int +get_tty_settings (int tty, TIOTYPE *tiop) +{ + set_winsize (tty); + + errno = 0; + if (_get_tty_settings (tty, tiop) < 0) + return -1; + +#if defined (_AIX) + setopost(tiop); +#endif + + return 0; +} + +static int +_set_tty_settings (int tty, TIOTYPE *tiop) +{ + while (SETATTR (tty, tiop) < 0) + { + if (errno != EINTR) + return -1; + errno = 0; + } + return 0; +} + +static int +set_tty_settings (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 (int meta_flag, TIOTYPE oldtio, TIOTYPE *tiop) +{ + int sc; + Keymap kmap; + + _rl_echoing_p = (oldtio.c_lflag & ECHO); +#if defined (ECHOCTL) + _rl_echoctl = (oldtio.c_lflag & ECHOCTL); +#endif + + tiop->c_lflag &= ~(ICANON | ECHO); + + if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE) + _rl_eof_char = oldtio.c_cc[VEOF]; + +#if defined (USE_XON_XOFF) +#if defined (IXANY) + tiop->c_iflag &= ~(IXON | IXANY); +#else + /* `strict' Posix systems do not define IXANY. */ + tiop->c_iflag &= ~IXON; +#endif /* IXANY */ +#endif /* USE_XON_XOFF */ + + /* Only turn this off if we are using all 8 bits. */ + if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag) + tiop->c_iflag &= ~(ISTRIP | INPCK); + + /* Make sure we differentiate between CR and NL on input. */ + tiop->c_iflag &= ~(ICRNL | INLCR); + +#if !defined (HANDLE_SIGNALS) + tiop->c_lflag &= ~ISIG; +#else + tiop->c_lflag |= ISIG; +#endif + + tiop->c_cc[VMIN] = 1; + tiop->c_cc[VTIME] = 0; + +#if defined (FLUSHO) + if (OUTPUT_BEING_FLUSHED (tiop)) + { + tiop->c_lflag &= ~FLUSHO; + oldtio.c_lflag &= ~FLUSHO; + } +#endif + + /* Turn off characters that we need on Posix systems with job control, + just to be sure. This includes ^Y and ^V. This should not really + be necessary. */ +#if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE) + +#if defined (VLNEXT) + tiop->c_cc[VLNEXT] = _POSIX_VDISABLE; +#endif + +#if defined (VDSUSP) + tiop->c_cc[VDSUSP] = _POSIX_VDISABLE; +#endif + + /* Conditionally disable some other tty special characters if there is a + key binding for them in the current keymap. Readline ordinarily doesn't + bind these characters, but an application or user might. */ +#if defined (VI_MODE) + kmap = (rl_editing_mode == vi_mode) ? vi_insertion_keymap : _rl_keymap; +#else + kmap = _rl_keymap; +#endif +#if defined (VDISCARD) + sc = tiop->c_cc[VDISCARD]; + if (sc != _POSIX_VDISABLE && kmap[(unsigned char)sc].type == ISFUNC) + tiop->c_cc[VDISCARD] = _POSIX_VDISABLE; +#endif /* VDISCARD */ + +#endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */ +} +#endif /* !NEW_TTY_DRIVER */ + +/* Put the terminal in CBREAK mode so that we can detect key presses. */ +#if defined (NO_TTY_DRIVER) +void +rl_prep_terminal (int meta_flag) +{ + _rl_echoing_p = 1; +} + +void +rl_deprep_terminal (void) +{ +} + +#else /* ! NO_TTY_DRIVER */ +void +rl_prep_terminal (int meta_flag) +{ + int tty, nprep; + TIOTYPE tio; + + if (terminal_prepped) + return; + + /* Try to keep this function from being INTerrupted. */ + _rl_block_sigint (); + + tty = rl_instream ? fileno (rl_instream) : fileno (stdin); + + if (get_tty_settings (tty, &tio) < 0) + { +#if defined (ENOTSUP) + /* MacOS X and Linux, at least, lie about the value of errno if + tcgetattr fails. */ + if (errno == ENOTTY || errno == EINVAL || errno == ENOTSUP) +#else + if (errno == ENOTTY || errno == EINVAL) +#endif + _rl_echoing_p = 1; /* XXX */ + + _rl_release_sigint (); + return; + } + + otio = tio; + + if (_rl_bind_stty_chars) + { +#if defined (VI_MODE) + /* If editing in vi mode, make sure we restore the bindings in the + insertion keymap no matter what keymap we ended up in. */ + if (rl_editing_mode == vi_mode) + rl_tty_unset_default_bindings (vi_insertion_keymap); + else +#endif + rl_tty_unset_default_bindings (_rl_keymap); + } + save_tty_chars (&otio); + RL_SETSTATE(RL_STATE_TTYCSAVED); + if (_rl_bind_stty_chars) + { +#if defined (VI_MODE) + /* If editing in vi mode, make sure we set the bindings in the + insertion keymap no matter what keymap we ended up in. */ + if (rl_editing_mode == vi_mode) + _rl_bind_tty_special_chars (vi_insertion_keymap, tio); + else +#endif + _rl_bind_tty_special_chars (_rl_keymap, tio); + } + + prepare_terminal_settings (meta_flag, otio, &tio); + + if (set_tty_settings (tty, &tio) < 0) + { + _rl_release_sigint (); + return; + } + + if (_rl_enable_keypad) + _rl_control_keypad (1); + + nprep = TPX_PREPPED; + + if (_rl_enable_bracketed_paste) + { + fprintf (rl_outstream, BRACK_PASTE_INIT); + nprep |= TPX_BRACKPASTE; + } + + fflush (rl_outstream); + terminal_prepped = nprep; + RL_SETSTATE(RL_STATE_TERMPREPPED); + + _rl_release_sigint (); +} + +/* Restore the terminal's normal settings and modes. */ +void +rl_deprep_terminal (void) +{ + int tty; + + if (terminal_prepped == 0) + return; + + /* Try to keep this function from being interrupted. */ + _rl_block_sigint (); + + tty = rl_instream ? fileno (rl_instream) : fileno (stdin); + + if (terminal_prepped & TPX_BRACKPASTE) + { + fprintf (rl_outstream, BRACK_PASTE_FINI); + /* Since the last character in BRACK_PASTE_FINI is \r */ + _rl_last_c_pos = 0; + if (rl_eof_found && (RL_ISSTATE (RL_STATE_TIMEOUT) == 0)) + fprintf (rl_outstream, "\n"); + else if (_rl_echoing_p == 0) + fprintf (rl_outstream, "\n"); + } + + if (_rl_enable_keypad) + _rl_control_keypad (0); + + fflush (rl_outstream); + + if (set_tty_settings (tty, &otio) < 0) + { + _rl_release_sigint (); + return; + } + + terminal_prepped = 0; + RL_UNSETSTATE(RL_STATE_TERMPREPPED); + + _rl_release_sigint (); +} +#endif /* !NO_TTY_DRIVER */ + +/* Set readline's idea of whether or not it is echoing output to the terminal, + returning the old value. */ +int +rl_tty_set_echoing (int u) +{ + int o; + + o = _rl_echoing_p; + _rl_echoing_p = u; + return o; +} + +/* **************************************************************** */ +/* */ +/* Bogus Flow Control */ +/* */ +/* **************************************************************** */ + +int +rl_restart_output (int count, int key) +{ +#if defined (__MINGW32__) + return 0; +#else /* !__MING32__ */ + + int fildes = fileno (rl_outstream); +#if defined (TIOCSTART) +#if defined (apollo) + ioctl (&fildes, TIOCSTART, 0); +#else + ioctl (fildes, TIOCSTART, 0); +#endif /* apollo */ + +#else /* !TIOCSTART */ +# if defined (TERMIOS_TTY_DRIVER) +# if defined (__ksr1__) + if (ksrflow) + { + ksrflow = 0; + tcflow (fildes, TCOON); + } +# else /* !ksr1 */ + tcflow (fildes, TCOON); /* Simulate a ^Q. */ +# endif /* !ksr1 */ +# else /* !TERMIOS_TTY_DRIVER */ +# if defined (TCXONC) + ioctl (fildes, TCXONC, TCOON); +# endif /* TCXONC */ +# endif /* !TERMIOS_TTY_DRIVER */ +#endif /* !TIOCSTART */ + + return 0; +#endif /* !__MINGW32__ */ +} + +int +rl_stop_output (int count, int key) +{ +#if defined (__MINGW32__) + return 0; +#else + + int fildes = fileno (rl_instream); + +#if defined (TIOCSTOP) +# if defined (apollo) + ioctl (&fildes, TIOCSTOP, 0); +# else + ioctl (fildes, TIOCSTOP, 0); +# endif /* apollo */ +#else /* !TIOCSTOP */ +# if defined (TERMIOS_TTY_DRIVER) +# if defined (__ksr1__) + ksrflow = 1; +# endif /* ksr1 */ + tcflow (fildes, TCOOFF); +# else +# if defined (TCXONC) + ioctl (fildes, TCXONC, TCOON); +# endif /* TCXONC */ +# endif /* !TERMIOS_TTY_DRIVER */ +#endif /* !TIOCSTOP */ + + return 0; +#endif /* !__MINGW32__ */ +} + +/* **************************************************************** */ +/* */ +/* Default Key Bindings */ +/* */ +/* **************************************************************** */ + +#if !defined (NO_TTY_DRIVER) +#define SET_SPECIAL(sc, func) set_special_char(kmap, &ttybuff, sc, func) +#endif + +#if defined (NO_TTY_DRIVER) + +#define SET_SPECIAL(sc, func) +#define RESET_SPECIAL(c) + +#elif defined (NEW_TTY_DRIVER) +static void +set_special_char (Keymap kmap, TIOTYPE *tiop, int sc, rl_command_func_t *func) +{ + if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC) + kmap[(unsigned char)sc].function = func; +} + +#define RESET_SPECIAL(c) \ + if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) \ + kmap[(unsigned char)c].function = rl_insert; + +static void +_rl_bind_tty_special_chars (Keymap kmap, TIOTYPE ttybuff) +{ + if (ttybuff.flags & SGTTY_SET) + { + SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout); + SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard); + } + +# if defined (TIOCGLTC) + if (ttybuff.flags & LTCHARS_SET) + { + SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout); + SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert); + } +# endif /* TIOCGLTC */ +} + +#else /* !NEW_TTY_DRIVER */ +static void +set_special_char (Keymap kmap, TIOTYPE *tiop, int sc, rl_command_func_t *func) +{ + unsigned char uc; + + uc = tiop->c_cc[sc]; + if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) + kmap[uc].function = func; +} + +/* used later */ +#define RESET_SPECIAL(uc) \ + if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \ + kmap[uc].function = rl_insert; + +static void +_rl_bind_tty_special_chars (Keymap kmap, TIOTYPE ttybuff) +{ + SET_SPECIAL (VERASE, rl_rubout); + SET_SPECIAL (VKILL, rl_unix_line_discard); + +# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) + SET_SPECIAL (VLNEXT, rl_quoted_insert); +# endif /* VLNEXT && TERMIOS_TTY_DRIVER */ + +# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) +# if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + SET_SPECIAL (VWERASE, rl_vi_unix_word_rubout); + else +# endif + SET_SPECIAL (VWERASE, rl_unix_word_rubout); +# endif /* VWERASE && TERMIOS_TTY_DRIVER */ +} + +#endif /* !NEW_TTY_DRIVER */ + +/* Set the system's default editing characters to their readline equivalents + in KMAP. Should be static, now that we have rl_tty_set_default_bindings. */ +void +rltty_set_default_bindings (Keymap kmap) +{ +#if !defined (NO_TTY_DRIVER) + TIOTYPE ttybuff; + int tty; + + tty = fileno (rl_instream); + + if (get_tty_settings (tty, &ttybuff) == 0) + _rl_bind_tty_special_chars (kmap, ttybuff); +#endif +} + +/* New public way to set the system default editing chars to their readline + equivalents. */ +void +rl_tty_set_default_bindings (Keymap kmap) +{ + rltty_set_default_bindings (kmap); +} + +/* Rebind all of the tty special chars that readline worries about back + to self-insert. Call this before saving the current terminal special + chars with save_tty_chars(). This only works on POSIX termios or termio + systems. */ +void +rl_tty_unset_default_bindings (Keymap kmap) +{ + /* Don't bother before we've saved the tty special chars at least once. */ + if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0) + return; + + RESET_SPECIAL (_rl_tty_chars.t_erase); + RESET_SPECIAL (_rl_tty_chars.t_kill); + +# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) + RESET_SPECIAL (_rl_tty_chars.t_lnext); +# endif /* VLNEXT && TERMIOS_TTY_DRIVER */ + +# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) + RESET_SPECIAL (_rl_tty_chars.t_werase); +# endif /* VWERASE && TERMIOS_TTY_DRIVER */ +} + +#if defined (HANDLE_SIGNALS) + +#if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER) +int +_rl_disable_tty_signals (void) +{ + return 0; +} + +int +_rl_restore_tty_signals (void) +{ + return 0; +} +#else + +static TIOTYPE sigstty, nosigstty; +static int tty_sigs_disabled = 0; + +int +_rl_disable_tty_signals (void) +{ + if (tty_sigs_disabled) + return 0; + + if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0) + return -1; + + nosigstty = sigstty; + + nosigstty.c_lflag &= ~ISIG; + nosigstty.c_iflag &= ~IXON; + + if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0) + return (_set_tty_settings (fileno (rl_instream), &sigstty)); + + tty_sigs_disabled = 1; + return 0; +} + +int +_rl_restore_tty_signals (void) +{ + int r; + + if (tty_sigs_disabled == 0) + return 0; + + r = _set_tty_settings (fileno (rl_instream), &sigstty); + + if (r == 0) + tty_sigs_disabled = 0; + + return r; +} +#endif /* !NEW_TTY_DRIVER */ + +#endif /* HANDLE_SIGNALS */ diff --git a/rltty.h b/rltty.h new file mode 100644 index 0000000..5bcc946 --- /dev/null +++ b/rltty.h @@ -0,0 +1,80 @@ +/* rltty.h - tty driver-related definitions used by some library files. */ + +/* Copyright (C) 1995-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_RLTTY_H_) +#define _RLTTY_H_ + +/* Posix systems use termios and the Posix signal functions. */ +#if defined (TERMIOS_TTY_DRIVER) +# include +#endif /* TERMIOS_TTY_DRIVER */ + +/* System V machines use termio. */ +#if defined (TERMIO_TTY_DRIVER) +# include +# if !defined (TCOON) +# define TCOON 1 +# endif +#endif /* TERMIO_TTY_DRIVER */ + +/* Other (BSD) machines use sgtty. */ +#if defined (NEW_TTY_DRIVER) +# include +#endif + +#include "rlwinsize.h" + +/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and + it is not already defined. It is used both to determine if a + special character is disabled and to disable certain special + characters. Posix systems should set to 0, USG systems to -1. */ +#if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE) +# if defined (_SVR4_VDISABLE) +# define _POSIX_VDISABLE _SVR4_VDISABLE +# else +# if defined (_POSIX_VERSION) +# define _POSIX_VDISABLE 0 +# else /* !_POSIX_VERSION */ +# define _POSIX_VDISABLE -1 +# endif /* !_POSIX_VERSION */ +# endif /* !_SVR4_DISABLE */ +#endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */ + +typedef struct _rl_tty_chars { + unsigned char t_eof; + unsigned char t_eol; + unsigned char t_eol2; + unsigned char t_erase; + unsigned char t_werase; + unsigned char t_kill; + unsigned char t_reprint; + unsigned char t_intr; + unsigned char t_quit; + unsigned char t_susp; + unsigned char t_dsusp; + unsigned char t_start; + unsigned char t_stop; + unsigned char t_lnext; + unsigned char t_flush; + unsigned char t_status; +} _RL_TTY_CHARS; + +#endif /* _RLTTY_H_ */ diff --git a/rltypedefs.h b/rltypedefs.h new file mode 100644 index 0000000..1636549 --- /dev/null +++ b/rltypedefs.h @@ -0,0 +1,100 @@ +/* rltypedefs.h -- Type declarations for readline functions. */ + +/* Copyright (C) 2000-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#ifndef _RL_TYPEDEFS_H_ +#define _RL_TYPEDEFS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Old-style, attempt to mark as deprecated in some way people will notice. */ + +#if !defined (_FUNCTION_DEF) +# define _FUNCTION_DEF + +#if defined(__GNUC__) || defined(__clang__) +typedef int Function () __attribute__((deprecated)); +typedef void VFunction () __attribute__((deprecated)); +typedef char *CPFunction () __attribute__((deprecated)); +typedef char **CPPFunction () __attribute__((deprecated)); +#else +typedef int Function (); +typedef void VFunction (); +typedef char *CPFunction (); +typedef char **CPPFunction (); +#endif + +#endif /* _FUNCTION_DEF */ + +/* New style. */ + +#if !defined (_RL_FUNCTION_TYPEDEF) +# define _RL_FUNCTION_TYPEDEF + +/* Bindable functions */ +typedef int rl_command_func_t (int, int); + +/* Typedefs for the completion system */ +typedef char *rl_compentry_func_t (const char *, int); +typedef char **rl_completion_func_t (const char *, int, int); + +typedef char *rl_quote_func_t (char *, int, char *); +typedef char *rl_dequote_func_t (char *, int); + +typedef int rl_compignore_func_t (char **); + +typedef void rl_compdisp_func_t (char **, int, int); + +/* Type for input and pre-read hook functions like rl_event_hook */ +typedef int rl_hook_func_t (void); + +/* Input function type */ +typedef int rl_getc_func_t (FILE *); + +/* Generic function that takes a character buffer (which could be the readline + line buffer) and an index into it (which could be rl_point) and returns + an int. */ +typedef int rl_linebuf_func_t (char *, int); + +/* `Generic' function pointer typedefs */ +typedef int rl_intfunc_t (int); +#define rl_ivoidfunc_t rl_hook_func_t +typedef int rl_icpfunc_t (char *); +typedef int rl_icppfunc_t (char **); + +typedef void rl_voidfunc_t (void); +typedef void rl_vintfunc_t (int); +typedef void rl_vcpfunc_t (char *); +typedef void rl_vcppfunc_t (char **); + +typedef char *rl_cpvfunc_t (void); +typedef char *rl_cpifunc_t (int); +typedef char *rl_cpcpfunc_t (char *); +typedef char *rl_cpcppfunc_t (char **); + +#endif /* _RL_FUNCTION_TYPEDEF */ + +#ifdef __cplusplus +} +#endif + +#endif /* _RL_TYPEDEFS_H_ */ diff --git a/rlwinsize.h b/rlwinsize.h new file mode 100644 index 0000000..d198fcf --- /dev/null +++ b/rlwinsize.h @@ -0,0 +1,58 @@ +/* rlwinsize.h -- an attempt to isolate some of the system-specific defines + for `struct winsize' and TIOCGWINSZ. */ + +/* Copyright (C) 1997-2009 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#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 +#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */ + +#if defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL) +# include +#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 +# endif /* HAVE_SYS_STREAM_H */ +# if defined (HAVE_SYS_PTEM_H) /* SVR4.2, at least, has it here */ +# include +# define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */ +# endif /* HAVE_SYS_PTEM_H */ +# if defined (HAVE_SYS_PTE_H) /* ??? */ +# include +# endif /* HAVE_SYS_PTE_H */ +#endif /* !STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ + +#if defined (M_UNIX) && !defined (_SCO_DS) && !defined (tcflow) +# define tcflow(fd, action) ioctl(fd, TCXONC, action) +#endif + +#endif /* _RL_WINSIZE_H */ diff --git a/savestring.c b/savestring.c new file mode 100644 index 0000000..f4bb6aa --- /dev/null +++ b/savestring.c @@ -0,0 +1,40 @@ +/* savestring.c - function version of savestring for backwards compatibility */ + +/* Copyright (C) 1998,2003,2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#include +#ifdef HAVE_STRING_H +# include +#endif +#include "xmalloc.h" + +/* Backwards compatibility, now that savestring has been removed from + all `public' readline header files. */ +char * +savestring (const char *s) +{ + char *ret; + + ret = (char *)xmalloc (strlen (s) + 1); + strcpy (ret, s); + return ret; +} diff --git a/search.c b/search.c new file mode 100644 index 0000000..eea2301 --- /dev/null +++ b/search.c @@ -0,0 +1,707 @@ +/* search.c - code for non-incremental searching in emacs and vi modes. */ + +/* Copyright (C) 1992-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif + +#include "rldefs.h" +#include "rlmbutil.h" + +#include "readline.h" +#include "history.h" +#include "histlib.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +#ifdef abs +# undef abs +#endif +#define abs(x) (((x) >= 0) ? (x) : -(x)) + +_rl_search_cxt *_rl_nscxt = 0; + +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 int _rl_history_search_flags; + +static char *history_search_string; +static int history_string_size; + +static void make_history_line_current (HIST_ENTRY *); +static int noninc_search_from_pos (char *, int, int, int, int *); +static int noninc_dosearch (char *, int, int); +static int noninc_search (int, int); +static int rl_history_search_internal (int, int); +static void rl_history_search_reinit (int); + +static _rl_search_cxt *_rl_nsearch_init (int, int); +static void _rl_nsearch_abort (_rl_search_cxt *); +static int _rl_nsearch_dispatch (_rl_search_cxt *, int); + +/* Make the data from the history entry ENTRY be the contents of the + current line. This doesn't do anything with rl_point; the caller + must set it. */ +static void +make_history_line_current (HIST_ENTRY *entry) +{ + UNDO_LIST *xlist; + + xlist = _rl_saved_line_for_history ? (UNDO_LIST *)_rl_saved_line_for_history->data : 0; + /* At this point, rl_undo_list points to a private search string list. */ + if (rl_undo_list && rl_undo_list != (UNDO_LIST *)entry->data && rl_undo_list != xlist) + rl_free_undo_list (); + + /* Now we create a new undo list with a single insert for this text. + WE DON'T CHANGE THE ORIGINAL HISTORY ENTRY UNDO LIST */ + _rl_replace_text (entry->line, 0, rl_end); + _rl_fix_point (1); +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + /* POSIX.2 says that the `U' command doesn't affect the copy of any + command lines to the edit line. We're going to implement that by + making the undo list start after the matching line is copied to the + current editing buffer. */ + rl_free_undo_list (); +#endif + + /* This will need to free the saved undo list associated with the original + (pre-search) line buffer. + XXX - look at _rl_free_saved_history_line and consider calling it if + rl_undo_list != xlist (or calling rl_free_undo list directly on + _rl_saved_line_for_history->data) */ + if (_rl_saved_line_for_history) + _rl_free_history_entry (_rl_saved_line_for_history); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; +} + +/* Search the history list for STRING starting at absolute history position + POS. If STRING begins with `^', the search must match STRING at the + beginning of a history line, otherwise a full substring match is performed + for STRING. DIR < 0 means to search backwards through the history list, + DIR >= 0 means to search forward. */ +static int +noninc_search_from_pos (char *string, int pos, int dir, int flags, int *ncp) +{ + int ret, old, sflags; + char *s; + + if (pos < 0) + return -1; + + old = where_history (); + if (history_set_pos (pos) == 0) + return -1; + + RL_SETSTATE(RL_STATE_SEARCH); + /* These functions return the match offset in the line; history_offset gives + the matching line in the history list */ + if (flags & SF_PATTERN) + { + s = string; + sflags = 0; /* Non-anchored search */ + if (*s == '^') + { + sflags |= ANCHORED_SEARCH; + s++; + } + ret = _hs_history_patsearch (s, dir, sflags); + } + else if (*string == '^') + ret = history_search_prefix (string + 1, dir); + else + ret = history_search (string, dir); + RL_UNSETSTATE(RL_STATE_SEARCH); + + if (ncp) + *ncp = ret; /* caller will catch -1 to indicate no-op */ + + if (ret != -1) + ret = where_history (); + + history_set_pos (old); + return (ret); +} + +/* Search for a line in the history containing STRING. If DIR is < 0, the + search is backwards through previous entries, else through subsequent + entries. Returns 1 if the search was successful, 0 otherwise. */ +static int +noninc_dosearch (char *string, int dir, int flags) +{ + int oldpos, pos, ind; + HIST_ENTRY *entry; + + if (string == 0 || *string == '\0' || noninc_history_pos < 0) + { + rl_ding (); + return 0; + } + + pos = noninc_search_from_pos (string, noninc_history_pos + dir, dir, flags, &ind); + if (pos == -1) + { + /* Search failed, current history position unchanged. */ + rl_maybe_unsave_line (); + rl_clear_message (); + rl_point = 0; + rl_ding (); + return 0; + } + + noninc_history_pos = pos; + + oldpos = where_history (); + history_set_pos (noninc_history_pos); + entry = current_history (); /* will never be NULL after successful search */ + +#if defined (VI_MODE) + if (rl_editing_mode != vi_mode) +#endif + history_set_pos (oldpos); + + make_history_line_current (entry); + + if (_rl_enable_active_region && ((flags & SF_PATTERN) == 0) && ind > 0 && ind < rl_end) + { + rl_point = ind; + rl_mark = ind + strlen (string); + if (rl_mark > rl_end) + rl_mark = rl_end; /* can't happen? */ + rl_activate_mark (); + } + else + { + rl_point = 0; + rl_mark = rl_end; + } + + rl_clear_message (); + return 1; +} + +static _rl_search_cxt * +_rl_nsearch_init (int dir, int pchar) +{ + _rl_search_cxt *cxt; + char *p; + + cxt = _rl_scxt_alloc (RL_SEARCH_NSEARCH, 0); + if (dir < 0) + cxt->sflags |= SF_REVERSE; /* not strictly needed */ +#if defined (VI_MODE) + if (VI_COMMAND_MODE() && (pchar == '?' || pchar == '/')) + cxt->sflags |= SF_PATTERN; +#endif + + cxt->direction = dir; + cxt->history_pos = cxt->save_line; + + rl_maybe_save_line (); + + /* Clear the undo list, since reading the search string should create its + own undo list, and the whole list will end up being freed when we + finish reading the search string. */ + rl_undo_list = 0; + + /* Use the line buffer to read the search string. */ + rl_line_buffer[0] = 0; + rl_end = rl_point = 0; + + p = _rl_make_prompt_for_search (pchar ? pchar : ':'); + rl_message ("%s", p); + xfree (p); + + RL_SETSTATE(RL_STATE_NSEARCH); + + _rl_nscxt = cxt; + + return cxt; +} + +int +_rl_nsearch_cleanup (_rl_search_cxt *cxt, int r) +{ + _rl_scxt_dispose (cxt, 0); + _rl_nscxt = 0; + + RL_UNSETSTATE(RL_STATE_NSEARCH); + + return (r != 1); +} + +static void +_rl_nsearch_abort (_rl_search_cxt *cxt) +{ + rl_maybe_unsave_line (); + rl_point = cxt->save_point; + rl_mark = cxt->save_mark; + rl_restore_prompt (); + rl_clear_message (); + _rl_fix_point (1); + + RL_UNSETSTATE (RL_STATE_NSEARCH); +} + +/* Process just-read character C according to search context CXT. Return -1 + if the caller should abort the search, 0 if we should break out of the + loop, and 1 if we should continue to read characters. */ +static int +_rl_nsearch_dispatch (_rl_search_cxt *cxt, int c) +{ + int n; + + if (c < 0) + c = CTRL ('C'); + + switch (c) + { + case CTRL('W'): + rl_unix_word_rubout (1, c); + break; + + case CTRL('U'): + rl_unix_line_discard (1, c); + break; + + case RETURN: + case NEWLINE: + return 0; + + case CTRL('H'): + case RUBOUT: + if (rl_point == 0) + { + _rl_nsearch_abort (cxt); + return -1; + } + _rl_rubout_char (1, c); + break; + + case CTRL('C'): + case CTRL('G'): + rl_ding (); + _rl_nsearch_abort (cxt); + return -1; + + case ESC: + /* XXX - experimental code to allow users to bracketed-paste into the + search string. Similar code is in isearch.c:_rl_isearch_dispatch(). + The difference here is that the bracketed paste sometimes doesn't + paste everything, so checking for the prefix and the suffix in the + input queue doesn't work well. We just have to check to see if the + number of chars in the input queue is enough for the bracketed paste + prefix and hope for the best. */ + if (_rl_enable_bracketed_paste && ((n = _rl_nchars_available ()) >= (BRACK_PASTE_SLEN-1))) + { + if (_rl_read_bracketed_paste_prefix (c) == 1) + rl_bracketed_paste_begin (1, c); + else + { + c = rl_read_key (); /* get the ESC that got pushed back */ + _rl_insert_char (1, c); + } + } + else + _rl_insert_char (1, c); + break; + + default: +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_insert_text (cxt->mb); + else +#endif + _rl_insert_char (1, c); + break; + } + + (*rl_redisplay_function) (); + rl_deactivate_mark (); + return 1; +} + +/* Perform one search according to CXT, using NONINC_SEARCH_STRING. Return + -1 if the search should be aborted, any other value means to clean up + using _rl_nsearch_cleanup (). Returns 1 if the search was successful, + 0 otherwise. */ +static int +_rl_nsearch_dosearch (_rl_search_cxt *cxt) +{ + rl_mark = cxt->save_mark; + + /* If rl_point == 0, we want to re-use the previous search string and + start from the saved history position. If there's no previous search + string, punt. */ + if (rl_point == 0) + { + if (noninc_search_string == 0) + { + rl_ding (); + rl_restore_prompt (); + RL_UNSETSTATE (RL_STATE_NSEARCH); + return -1; + } + } + else + { + /* We want to start the search from the current history position. */ + noninc_history_pos = cxt->save_line; + FREE (noninc_search_string); + noninc_search_string = savestring (rl_line_buffer); + + /* If we don't want the subsequent undo list generated by the search + matching a history line to include the contents of the search string, + we need to clear rl_line_buffer here. For now, we just clear the + undo list generated by reading the search string. (If the search + fails, the old undo list will be restored by rl_maybe_unsave_line.) */ + rl_free_undo_list (); + } + + rl_restore_prompt (); + return (noninc_dosearch (noninc_search_string, cxt->direction, cxt->sflags&SF_PATTERN)); +} + +/* Search non-interactively through the history list. DIR < 0 means to + search backwards through the history of previous commands; otherwise + the search is for commands subsequent to the current position in the + history list. PCHAR is the character to use for prompting when reading + the search string; if not specified (0), it defaults to `:'. */ +static int +noninc_search (int dir, int pchar) +{ + _rl_search_cxt *cxt; + int c, r; + + cxt = _rl_nsearch_init (dir, pchar); + + if (RL_ISSTATE (RL_STATE_CALLBACK)) + return (0); + + /* Read the search string. */ + r = 0; + while (1) + { + c = _rl_search_getchar (cxt); + + if (c < 0) + { + _rl_nsearch_abort (cxt); + return 1; + } + + if (c == 0) + break; + + r = _rl_nsearch_dispatch (cxt, c); + if (r < 0) + return 1; + else if (r == 0) + break; + } + + r = _rl_nsearch_dosearch (cxt); + return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1)); +} + +/* Search forward through the history list for a string. If the vi-mode + code calls this, KEY will be `?'. */ +int +rl_noninc_forward_search (int count, int key) +{ + return noninc_search (1, (key == '?') ? '?' : 0); +} + +/* Reverse search the history list for a string. If the vi-mode code + calls this, KEY will be `/'. */ +int +rl_noninc_reverse_search (int count, int key) +{ + return noninc_search (-1, (key == '/') ? '/' : 0); +} + +/* Search forward through the history list for the last string searched + for. If there is no saved search string, abort. If the vi-mode code + calls this, KEY will be `N'. */ +int +rl_noninc_forward_search_again (int count, int key) +{ + int r; + + if (!noninc_search_string) + { + rl_ding (); + return (1); + } +#if defined (VI_MODE) + if (VI_COMMAND_MODE() && key == 'N') + r = noninc_dosearch (noninc_search_string, 1, SF_PATTERN); + else +#endif + r = noninc_dosearch (noninc_search_string, 1, 0); + return (r != 1); +} + +/* Reverse search in the history list for the last string searched + for. If there is no saved search string, abort. If the vi-mode code + calls this, KEY will be `n'. */ +int +rl_noninc_reverse_search_again (int count, int key) +{ + int r; + + if (!noninc_search_string) + { + rl_ding (); + return (1); + } +#if defined (VI_MODE) + if (VI_COMMAND_MODE() && key == 'n') + r = noninc_dosearch (noninc_search_string, -1, SF_PATTERN); + else +#endif + r = noninc_dosearch (noninc_search_string, -1, 0); + return (r != 1); +} + +#if defined (READLINE_CALLBACKS) +int +_rl_nsearch_callback (_rl_search_cxt *cxt) +{ + int c, r; + + c = _rl_search_getchar (cxt); + if (c <= 0) + { + if (c < 0) + _rl_nsearch_abort (cxt); + return 1; + } + r = _rl_nsearch_dispatch (cxt, c); + if (r != 0) + return 1; + + r = _rl_nsearch_dosearch (cxt); + return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1)); +} +#endif + +static int +rl_history_search_internal (int count, int dir) +{ + HIST_ENTRY *temp; + int ret, oldpos, newcol; + int had_saved_line; + char *t; + + had_saved_line = _rl_saved_line_for_history != 0; + rl_maybe_save_line (); + temp = (HIST_ENTRY *)NULL; + + /* Search COUNT times through the history for a line matching + history_search_string. If history_search_string[0] == '^', the + line must match from the start; otherwise any substring can match. + When this loop finishes, TEMP, if non-null, is the history line to + copy into the line buffer. */ + while (count) + { + RL_CHECK_SIGNALS (); + ret = noninc_search_from_pos (history_search_string, _rl_history_search_pos + dir, dir, 0, &newcol); + 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 (); /* will never be NULL after successful search */ + 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) + { + /* XXX - check had_saved_line here? */ + rl_maybe_unsave_line (); + rl_ding (); + /* If you don't want the saved history line (last match) to show up + in the line buffer after the search fails, change the #if 0 to + #if 1 */ +#if 0 + if (rl_point > _rl_history_search_len) + { + rl_point = rl_end = _rl_history_search_len; + rl_line_buffer[rl_end] = '\0'; + rl_mark = 0; + } +#else + rl_point = _rl_history_search_len; /* rl_maybe_unsave_line changes it */ + rl_mark = rl_end; +#endif + return 1; + } + + /* Copy the line we found into the current line buffer. */ + make_history_line_current (temp); + + /* decide where to put rl_point -- need to change this for pattern search */ + if (_rl_history_search_flags & ANCHORED_SEARCH) + rl_point = _rl_history_search_len; /* easy case */ + else + { +#if 0 + t = strstr (rl_line_buffer, history_search_string); /* XXX */ + rl_point = t ? (int)(t - rl_line_buffer) + _rl_history_search_len : rl_end; +#else + rl_point = (newcol >= 0) ? newcol : rl_end; +#endif + } + rl_mark = rl_end; + + return 0; +} + +static void +rl_history_search_reinit (int flags) +{ + int sind; + + _rl_history_search_pos = where_history (); + _rl_history_search_len = rl_point; + _rl_history_search_flags = flags; + + prev_line_found = (char *)NULL; + if (rl_point) + { + /* Allocate enough space for anchored and non-anchored searches */ + if (_rl_history_search_len >= history_string_size - 2) + { + history_string_size = _rl_history_search_len + 2; + history_search_string = (char *)xrealloc (history_search_string, history_string_size); + } + sind = 0; + if (flags & ANCHORED_SEARCH) + history_search_string[sind++] = '^'; + strncpy (history_search_string + sind, rl_line_buffer, rl_point); + history_search_string[rl_point + sind] = '\0'; + } + _rl_free_saved_history_line (); /* XXX rl_undo_list? */ +} + +/* 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. The search is anchored to the beginning of the history line. */ +int +rl_history_search_forward (int count, int 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 (ANCHORED_SEARCH); + + 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 (int count, int 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 (ANCHORED_SEARCH); + + if (_rl_history_search_len == 0) + return (rl_get_previous_history (count, ignore)); + return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); +} + +/* 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. The search succeeds if the search string is present anywhere + in the history line. */ +int +rl_history_substr_search_forward (int count, int ignore) +{ + if (count == 0) + return (0); + + if (rl_last_func != rl_history_substr_search_forward && + rl_last_func != rl_history_substr_search_backward) + rl_history_search_reinit (NON_ANCHORED_SEARCH); + + 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_substr_search_backward (int count, int ignore) +{ + if (count == 0) + return (0); + + if (rl_last_func != rl_history_substr_search_forward && + rl_last_func != rl_history_substr_search_backward) + rl_history_search_reinit (NON_ANCHORED_SEARCH); + + if (_rl_history_search_len == 0) + return (rl_get_previous_history (count, ignore)); + return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); +} diff --git a/shell.c b/shell.c new file mode 100644 index 0000000..36c9148 --- /dev/null +++ b/shell.c @@ -0,0 +1,214 @@ +/* shell.c -- readline utility functions that are normally provided by + bash when readline is linked as part of the shell. */ + +/* Copyright (C) 1997-2009,2017,2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_STRING_H) +# include +#else +# include +#endif /* !HAVE_STRING_H */ + +#if defined (HAVE_LIMITS_H) +# include +#endif + +#if defined (HAVE_FCNTL_H) +#include +#endif +#if defined (HAVE_PWD_H) +#include +#endif + +#include + +#include "rlstdc.h" +#include "rlshell.h" +#include "rldefs.h" + +#include "xmalloc.h" + +#if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS) +extern struct passwd *getpwuid (uid_t); +#endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */ + +#ifndef NULL +# define NULL 0 +#endif + +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +/* Nonzero if the integer type T is signed. */ +#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) + +/* Bound on length of the string representing an integer value of type T. + Subtract one for the sign bit if T is signed; + 302 / 1000 is log10 (2) rounded up; + add one for integer division truncation; + add one more for a minus sign if t is signed. */ +#define INT_STRLEN_BOUND(t) \ + ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \ + + 1 + TYPE_SIGNED (t)) + +/* All of these functions are resolved from bash if we are linking readline + as part of bash. */ + +/* Does shell-like quoting using single quotes. */ +char * +sh_single_quote (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. */ +static char setenv_buf[INT_STRLEN_BOUND (int) + 1]; +static char putenv_buf1[INT_STRLEN_BOUND (int) + 6 + 1]; /* sizeof("LINES=") == 6 */ +static char putenv_buf2[INT_STRLEN_BOUND (int) + 8 + 1]; /* sizeof("COLUMNS=") == 8 */ + +void +sh_set_lines_and_columns (int lines, int cols) +{ +#if defined (HAVE_SETENV) + sprintf (setenv_buf, "%d", lines); + setenv ("LINES", setenv_buf, 1); + + sprintf (setenv_buf, "%d", cols); + setenv ("COLUMNS", setenv_buf, 1); +#else /* !HAVE_SETENV */ +# if defined (HAVE_PUTENV) + sprintf (putenv_buf1, "LINES=%d", lines); + putenv (putenv_buf1); + + sprintf (putenv_buf2, "COLUMNS=%d", cols); + putenv (putenv_buf2); +# endif /* HAVE_PUTENV */ +#endif /* !HAVE_SETENV */ +} + +char * +sh_get_env_value (const char *varname) +{ + return ((char *)getenv (varname)); +} + +char * +sh_get_home_dir (void) +{ + static char *home_dir = (char *)NULL; + struct passwd *entry; + + if (home_dir) + return (home_dir); + + home_dir = (char *)NULL; +#if defined (HAVE_GETPWUID) +# if defined (__TANDEM) + entry = getpwnam (getlogin ()); +# else + entry = getpwuid (getuid ()); +# endif + if (entry) + home_dir = savestring (entry->pw_dir); +#endif + +#if defined (HAVE_GETPWENT) + endpwent (); /* some systems need this */ +#endif + + return (home_dir); +} + +#if !defined (O_NDELAY) +# if defined (FNDELAY) +# define O_NDELAY FNDELAY +# endif +#endif + +int +sh_unset_nodelay_mode (int fd) +{ +#if defined (HAVE_FCNTL) + int flags, bflags; + + if ((flags = fcntl (fd, F_GETFL, 0)) < 0) + return -1; + + bflags = 0; + +#ifdef O_NONBLOCK + bflags |= O_NONBLOCK; +#endif + +#ifdef O_NDELAY + bflags |= O_NDELAY; +#endif + + if (flags & bflags) + { + flags &= ~bflags; + return (fcntl (fd, F_SETFL, flags)); + } +#endif + + return 0; +} diff --git a/shlib/Makefile.in b/shlib/Makefile.in new file mode 100644 index 0000000..d138524 --- /dev/null +++ b/shlib/Makefile.in @@ -0,0 +1,501 @@ +## -*- text -*- ## +# Makefile for the GNU readline library shared library support. +# +# Copyright (C) 1998-2009 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 3 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, see . + +PACKAGE = @PACKAGE_NAME@ +VERSION = @PACKAGE_VERSION@ + +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_VERSION = @PACKAGE_VERSION@ + +RL_LIBRARY_VERSION = @LIBVERSION@ +RL_LIBRARY_NAME = readline + +datarootdir = @datarootdir@ + +srcdir = @srcdir@ +VPATH = @top_srcdir@ +topdir = @top_srcdir@ +BUILD_DIR = @BUILD_DIR@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +CC = @CC@ +RANLIB = @RANLIB@ +AR = @AR@ +ARFLAGS = @ARFLAGS@ +RM = rm -f +CP = cp +MV = mv +LN = ln + +SHELL = @MAKE_SHELL@ + +host_os = @host_os@ +host_vendor = @host_vendor@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +includedir = @includedir@ +bindir = @bindir@ +libdir = @libdir@ +datadir = @datadir@ +localedir = @localedir@ + +# Support an alternate destination root directory for package building +DESTDIR = + +CFLAGS = @CFLAGS@ +LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' @BRACKETED_PASTE@ +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@ + +DEFS = @DEFS@ @CROSS_COMPILE@ +LOCAL_DEFS = @LOCAL_DEFS@ + +# +# These values are generated for configure by ${topdir}/support/shobj-conf. +# If your system is not supported by that script, but includes facilities for +# dynamic loading of shared objects, please update the script and send the +# changes to bash-maintainers@gnu.org. +# +SHOBJ_CC = @SHOBJ_CC@ +SHOBJ_CFLAGS = @SHOBJ_CFLAGS@ +SHOBJ_LD = @SHOBJ_LD@ + +SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@ +SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@ +SHOBJ_LIBS = @SHOBJ_LIBS@ + +SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@ +SHLIB_LIBS = @SHLIB_LIBS@ + +SHLIB_DOT = @SHLIB_DOT@ +SHLIB_LIBPREF = @SHLIB_LIBPREF@ +SHLIB_LIBSUFF = @SHLIB_LIBSUFF@ + +SHLIB_LIBVERSION = @SHLIB_LIBVERSION@ +SHLIB_DLLVERSION = @SHLIB_DLLVERSION@ + +SHLIB_STATUS = @SHLIB_STATUS@ + +TERMCAP_LIB = @TERMCAP_LIB@ + +# shared library versioning +SHLIB_MAJOR= @SHLIB_MAJOR@ +# shared library systems like SVR4's do not use minor versions +SHLIB_MINOR= .@SHLIB_MINOR@ + +# For libraries which include headers from other libraries. +INCLUDES = -I. -I.. -I$(topdir) + +CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(INCLUDES) $(CPPFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) + +.SUFFIXES: .so + +.c.so: + ${RM} $@ + $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -o $*.o $< + $(MV) $*.o $@ + +# The name of the main library target. + +SHARED_READLINE = $(SHLIB_LIBPREF)readline$(SHLIB_DOT)$(SHLIB_LIBVERSION) +SHARED_HISTORY = $(SHLIB_LIBPREF)history$(SHLIB_DOT)$(SHLIB_LIBVERSION) +SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY) + +# The C code source files for this library. +CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \ + $(topdir)/vi_mode.c $(topdir)/parens.c $(topdir)/rltty.c \ + $(topdir)/complete.c $(topdir)/bind.c $(topdir)/isearch.c \ + $(topdir)/display.c $(topdir)/signals.c $(topdir)/emacs_keymap.c \ + $(topdir)/vi_keymap.c $(topdir)/util.c $(topdir)/kill.c \ + $(topdir)/undo.c $(topdir)/macro.c $(topdir)/input.c \ + $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c $(topdir)/xfree.c \ + $(topdir)/history.c $(topdir)/histsearch.c $(topdir)/histexpand.c \ + $(topdir)/histfile.c $(topdir)/nls.c $(topdir)/search.c \ + $(topdir)/shell.c $(topdir)/savestring.c $(topdir)/tilde.c \ + $(topdir)/text.c $(topdir)/misc.c $(topdir)/compat.c \ + $(topdir)/colors.c $(topdir)/parse-colors.c \ + $(topdir)/mbutil.c + +# The header files for this library. +HSOURCES = $(topdir)/readline.h $(topdir)/rldefs.h $(topdir)/chardefs.h \ + $(topdir)/keymaps.h $(topdir)/history.h $(topdir)/histlib.h \ + $(topdir)/posixstat.h $(topdir)/posixdir.h $(topdir)/posixjmp.h \ + $(topdir)/tilde.h $(topdir)/rlconf.h $(topdir)/rltty.h \ + $(topdir)/ansi_stdlib.h $(topdir)/tcap.h $(topdir)/rlstdc.h \ + $(topdir)/xmalloc.h $(topdir)/rlprivate.h $(topdir)/rlshell.h \ + $(topdir)/rltypedefs.h $(topdir)/rlmbutil.h \ + $(topdir)/colors.h $(topdir)/parse-colors.h + +SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.so \ + mbutil.so +SHARED_TILDEOBJ = tilde.so +SHARED_COLORSOBJ = colors.so parse-colors.so +SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \ + rltty.so complete.so bind.so isearch.so display.so signals.so \ + util.so kill.so undo.so macro.so input.so callback.so terminal.so \ + text.so nls.so misc.so \ + $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) $(SHARED_COLORSOBJ) \ + xmalloc.so xfree.so compat.so + +########################################################################## + +all: $(SHLIB_STATUS) + +supported: $(SHARED_LIBS) + +unsupported: + @echo "Your system and compiler (${host_os}-${CC}) are not supported by the" + @echo "${topdir}/support/shobj-conf script." + @echo "If your operating system provides facilities for creating" + @echo "shared libraries, please update the script and re-run configure." + @echo "Please send the changes you made to bash-maintainers@gnu.org" + @echo "for inclusion in future bash and readline releases." + +$(SHARED_READLINE): $(SHARED_OBJ) + $(RM) $@ + $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_OBJ) $(SHLIB_LIBS) + +$(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so xfree.so + $(RM) $@ + $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so xfree.so $(SHLIB_LIBS) + +# Since tilde.c is shared between readline and bash, make sure we compile +# it with the right flags when it's built as part of readline +tilde.so: tilde.c + ${RM} $@ + $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -DREADLINE_LIBRARY -c -o tilde.o $(topdir)/tilde.c + $(MV) tilde.o $@ + +installdirs: $(topdir)/support/mkdirs + -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(libdir) + -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(bindir) + +install-supported: installdirs $(SHLIB_STATUS) + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY) + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_READLINE) + @echo install: you may need to run ldconfig + +install-unsupported: + @echo install: shared libraries not supported + +install: install-$(SHLIB_STATUS) + +uninstall-supported: + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_HISTORY) + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_READLINE) + @echo uninstall: you may need to run ldconfig + +uninstall-unsupported: + @echo uninstall: shared libraries not supported + +uninstall: uninstall-$(SHLIB_STATUS) + +clean mostlyclean: force + $(RM) $(SHARED_OBJ) $(SHARED_LIBS) + +distclean maintainer-clean: clean + $(RM) Makefile + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Dependencies +bind.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h +bind.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +bind.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +bind.so: $(topdir)/rltypedefs.h +bind.so: $(topdir)/tilde.h $(topdir)/history.h +compat.so: ${BUILD_DIR}/config.h +compat.so: $(topdir)/rlstdc.h $(topdir)/rltypedefs.h +callback.so: $(topdir)/rlconf.h +callback.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h +callback.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +callback.so: $(topdir)/rltypedefs.h +callback.so: $(topdir)/tilde.h +complete.so: $(topdir)/ansi_stdlib.h $(topdir)/posixdir.h $(topdir)/posixstat.h +complete.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +complete.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +complete.so: $(topdir)/rltypedefs.h +complete.so: $(topdir)/tilde.h +display.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h +display.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +display.so: $(topdir)/tcap.h +display.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +display.so: $(topdir)/rltypedefs.h +display.so: $(topdir)/tilde.h $(topdir)/history.h +funmap.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +funmap.so: $(topdir)/rltypedefs.h +funmap.so: $(topdir)/rlconf.h $(topdir)/ansi_stdlib.h +funmap.so: ${BUILD_DIR}/config.h $(topdir)/tilde.h +histexpand.so: $(topdir)/ansi_stdlib.h +histexpand.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +histexpand.so: ${BUILD_DIR}/config.h +histfile.so: $(topdir)/ansi_stdlib.h +histfile.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +histfile.so: ${BUILD_DIR}/config.h +history.so: $(topdir)/ansi_stdlib.h +history.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +history.so: ${BUILD_DIR}/config.h +histsearch.so: $(topdir)/ansi_stdlib.h +histsearch.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +histsearch.so: ${BUILD_DIR}/config.h +input.so: $(topdir)/ansi_stdlib.h +input.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +input.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +input.so: $(topdir)/rltypedefs.h +input.so: $(topdir)/tilde.h +isearch.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +isearch.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +isearch.so: $(topdir)/rltypedefs.h +isearch.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h +keymaps.so: $(topdir)/keymaps.h $(topdir)/chardefs.h $(topdir)/rlconf.h +keymaps.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +keymaps.so: $(topdir)/rltypedefs.h +keymaps.so: ${BUILD_DIR}/config.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h +kill.so: $(topdir)/ansi_stdlib.h +kill.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +kill.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +kill.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h +macro.so: $(topdir)/ansi_stdlib.h +macro.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +macro.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +macro.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h +mbutil.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +mbutil.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h +mbutil.so: $(topdir)/chardefs.h $(topdir)/rlstdc.h +misc.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +misc.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +misc.so: $(topdir)/rltypedefs.h +misc.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h +nls.so: $(topdir)/ansi_stdlib.h +nls.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +nls.o: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +nls.o: $(topdir)/rltypedefs.h +nls.o: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rlstdc.h +parens.so: $(topdir)/rlconf.h ${BUILD_DIR}/config.h +parens.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +parens.so: $(topdir)/rltypedefs.h +parens.so: $(topdir)/tilde.h +rltty.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +rltty.so: $(topdir)/rltty.h $(topdir)/tilde.h +rltty.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +rltty.so: $(topdir)/rltypedefs.h +savestring.so: ${BUILD_DIR}/config.h +search.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +search.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +search.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h +search.so: $(topdir)/rltypedefs.h +signals.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +signals.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +signals.so: $(topdir)/history.h $(topdir)/tilde.h +signals.so: $(topdir)/rltypedefs.h +terminal.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +terminal.so: $(topdir)/tcap.h +terminal.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +terminal.so: $(topdir)/tilde.h $(topdir)/history.h +terminal.so: $(topdir)/rltypedefs.h +text.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +text.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +text.so: $(topdir)/rltypedefs.h +text.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h +tilde.so: $(topdir)/ansi_stdlib.h ${BUILD_DIR}/config.h $(topdir)/tilde.h +undo.so: $(topdir)/ansi_stdlib.h +undo.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +undo.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +undo.so: $(topdir)/rltypedefs.h +undo.so: $(topdir)/tilde.h $(topdir)/history.h +util.so: $(topdir)/posixjmp.h $(topdir)/ansi_stdlib.h +util.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +util.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +util.so: $(topdir)/rltypedefs.h $(topdir)/tilde.h +vi_mode.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +vi_mode.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +vi_mode.so: $(topdir)/history.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h +vi_mode.so: $(topdir)/rltypedefs.h +xfree.so: ${BUILD_DIR}/config.h +xfree.so: $(topdir)/ansi_stdlib.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 + +colors.so: $(BUILD_DIR)/config.h $(topdir)/colors.h +colors.so: $(topdir)/rlconf.h +colors.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h +colors.so: $(topdir)/chardefs.h $(topdir)/tilde.h $(topdir)/rlstdc.h +colors.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h +parse-colors.so: $(BUILD_DIR)/config.h $(topdir)/colors.h $(topdir)/parse-colors.h +parse-colors.so: $(topdir)/rldefs.h $(topdir)/rlconf.h +parse-colors.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h +parse-colors.so: $(topdir)/chardefs.h $(topdir)/tilde.h $(topdir)/rlstdc.h + +bind.so: $(topdir)/rlprivate.h +callback.so: $(topdir)/rlprivate.h +complete.so: $(topdir)/rlprivate.h +display.so: $(topdir)/rlprivate.h +input.so: $(topdir)/rlprivate.h +isearch.so: $(topdir)/rlprivate.h +kill.so: $(topdir)/rlprivate.h +macro.so: $(topdir)/rlprivate.h +mbutil.so: $(topdir)/rlprivate.h +misc.so: $(topdir)/rlprivate.h +nls.so: $(topdir)/rlprivate.h +parens.so: $(topdir)/rlprivate.h +readline.so: $(topdir)/rlprivate.h +rltty.so: $(topdir)/rlprivate.h +search.so: $(topdir)/rlprivate.h +signals.so: $(topdir)/rlprivate.h +terminal.so: $(topdir)/rlprivate.h +text.so: $(topdir)/rlprivate.h +undo.so: $(topdir)/rlprivate.h +util.so: $(topdir)/rlprivate.h +vi_mode.so: $(topdir)/rlprivate.h +colors.so: $(topdir)/rlprivate.h +parse-colors.so: $(topdir)/rlprivate.h + +bind.so: $(topdir)/xmalloc.h +callback.so: $(topdir)/xmalloc.h +complete.so: $(topdir)/xmalloc.h +display.so: $(topdir)/xmalloc.h +funmap.so: $(topdir)/xmalloc.h +histexpand.so: $(topdir)/xmalloc.h +histfile.so: $(topdir)/xmalloc.h +history.so: $(topdir)/xmalloc.h +input.so: $(topdir)/xmalloc.h +isearch.so: $(topdir)/xmalloc.h +keymaps.so: $(topdir)/xmalloc.h +kill.so: $(topdir)/xmalloc.h +macro.so: $(topdir)/xmalloc.h +mbutil.so: $(topdir)/xmalloc.h +misc.so: $(topdir)/xmalloc.h +readline.so: $(topdir)/xmalloc.h +savestring.so: $(topdir)/xmalloc.h +search.so: $(topdir)/xmalloc.h +shell.so: $(topdir)/xmalloc.h +terminal.so: $(topdir)/xmalloc.h +text.so: $(topdir)/xmalloc.h +tilde.so: $(topdir)/xmalloc.h +undo.so: $(topdir)/xmalloc.h +util.so: $(topdir)/xmalloc.h +vi_mode.so: $(topdir)/xmalloc.h +xfree.so: $(topdir)/xmalloc.h +xmalloc.so: $(topdir)/xmalloc.h +colors.so: $(topdir)/xmalloc.h +parse-colors.so: $(topdir)/xmalloc.h + +complete.so: $(topdir)/rlmbutil.h +display.so: $(topdir)/rlmbutil.h +histexpand.so: $(topdir)/rlmbutil.h +input.so: $(topdir)/rlmbutil.h +isearch.so: $(topdir)/rlmbutil.h +mbutil.so: $(topdir)/rlmbutil.h +misc.so: $(topdir)/rlmbutil.h +readline.so: $(topdir)/rlmbutil.h +search.so: $(topdir)/rlmbutil.h +text.so: $(topdir)/rlmbutil.h +vi_mode.so: $(topdir)/rlmbutil.h +colors.so: $(topdir)/rlmbutil.h +parse-colors.so: $(topdir)/rlmbutil.h + +bind.so: $(topdir)/bind.c +callback.so: $(topdir)/callback.c +compat.so: $(topdir)/compat.c +complete.so: $(topdir)/complete.c +display.so: $(topdir)/display.c +funmap.so: $(topdir)/funmap.c +input.so: $(topdir)/input.c +isearch.so: $(topdir)/isearch.c +keymaps.so: $(topdir)/keymaps.c $(topdir)/emacs_keymap.c $(topdir)/vi_keymap.c +kill.so: $(topdir)/kill.c +macro.so: $(topdir)/macro.c +mbutil.so: $(topdir)/mbutil.c +misc.so: $(topdir)/mbutil.c +nls.so: $(topdir)/nls.c +parens.so: $(topdir)/parens.c +readline.so: $(topdir)/readline.c +rltty.so: $(topdir)/rltty.c +savestring.so: $(topdir)/savestring.c +search.so: $(topdir)/search.c +shell.so: $(topdir)/shell.c +signals.so: $(topdir)/signals.c +terminal.so: $(topdir)/terminal.c +text.so: $(topdir)/text.c +tilde.so: $(topdir)/tilde.c +undo.so: $(topdir)/undo.c +util.so: $(topdir)/util.c +vi_mode.so: $(topdir)/vi_mode.c +xfree.so: $(topdir)/xfree.c +xmalloc.so: $(topdir)/xmalloc.c + +histexpand.so: $(topdir)/histexpand.c +histfile.so: $(topdir)/histfile.c +history.so: $(topdir)/history.c +histsearch.so: $(topdir)/histsearch.c + +bind.so: bind.c +callback.so: callback.c +comapt.so: compat.c +complete.so: complete.c +display.so: display.c +funmap.so: funmap.c +input.so: input.c +isearch.so: isearch.c +keymaps.so: keymaps.c emacs_keymap.c vi_keymap.c +kill.so: kill.c +macro.so: macro.c +mbutil.so: mbutil.c +misc.so: misc.c +nls.so: nls.c +parens.so: parens.c +readline.so: readline.c +rltty.so: rltty.c +savestring.so: savestring.c +search.so: search.c +signals.so: signals.c +shell.so: shell.c +terminal.so: terminal.c +text.so: text.c +tilde.so: tilde.c +undo.so: undo.c +util.so: util.c +vi_mode.so: vi_mode.c +xfree.so: xfree.c +xmalloc.so: xmalloc.c + +colors.so: colors.c +parse-colors.so: parse-colors.c + +histexpand.so: histexpand.c +histfile.so: histfile.c +history.so: history.c +histsearch.so: histsearch.c diff --git a/signals.c b/signals.c new file mode 100644 index 0000000..9df365e --- /dev/null +++ b/signals.c @@ -0,0 +1,754 @@ +/* signals.c -- signal handling support for readline. */ + +/* Copyright (C) 1987-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include /* Just for NULL. Yuck. */ +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +#if defined (GWINSZ_IN_SYS_IOCTL) +# include +#endif /* GWINSZ_IN_SYS_IOCTL */ + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" + +#if defined (HANDLE_SIGNALS) + +#define SIGHANDLER_RETURN return + +/* This typedef is equivalent to the one for Function; it allows us + to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */ +typedef void SigHandler (int); + +#if defined (HAVE_POSIX_SIGNALS) +typedef struct sigaction sighandler_cxt; +# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh) +#else +typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt; +# define sigemptyset(m) +#endif /* !HAVE_POSIX_SIGNALS */ + +#ifndef SA_RESTART +# define SA_RESTART 0 +#endif + +static SigHandler *rl_set_sighandler (int, SigHandler *, sighandler_cxt *); +static void rl_maybe_set_sighandler (int, SigHandler *, sighandler_cxt *); +static void rl_maybe_restore_sighandler (int, sighandler_cxt *); + +static void rl_signal_handler (int); +static void _rl_handle_signal (int); + +/* Exported variables for use by applications. */ + +/* If non-zero, readline will install its own signal handlers for + SIGINT, SIGTERM, SIGHUP, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ +int rl_catch_signals = 1; + +/* If non-zero, readline will install a signal handler for SIGWINCH. */ +#ifdef SIGWINCH +int rl_catch_sigwinch = 1; +#else +int rl_catch_sigwinch = 0; /* for the readline state struct in readline.c */ +#endif + +/* Private variables. */ +int volatile _rl_caught_signal = 0; /* should be sig_atomic_t, but that requires including everywhere */ + +/* If non-zero, print characters corresponding to received signals as long as + the user has indicated his desire to do so (_rl_echo_control_chars). */ +int _rl_echoctl = 0; + +int _rl_intr_char = 0; +int _rl_quit_char = 0; +int _rl_susp_char = 0; + +static int signals_set_flag; +static int sigwinch_set_flag; + +#if defined (HAVE_POSIX_SIGNALS) +sigset_t _rl_orig_sigset; +#endif /* !HAVE_POSIX_SIGNALS */ + +/* **************************************************************** */ +/* */ +/* Signal Handling */ +/* */ +/* **************************************************************** */ + +static sighandler_cxt old_int, old_term, old_hup, 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 + +_rl_sigcleanup_func_t *_rl_sigcleanup; +void *_rl_sigcleanarg; + +/* Readline signal handler functions. */ + +/* Called from RL_CHECK_SIGNALS() macro to run signal handling code. */ +void +_rl_signal_handler (int sig) +{ + _rl_caught_signal = 0; /* XXX */ + +#if defined (SIGWINCH) + if (sig == SIGWINCH) + { + RL_SETSTATE(RL_STATE_SIGHANDLER); + + rl_resize_terminal (); + /* XXX - experimental for now */ + /* Call a signal hook because though we called the original signal handler + in rl_sigwinch_handler below, we will not resend the signal to + ourselves. */ + if (rl_signal_event_hook) + (*rl_signal_event_hook) (); + + RL_UNSETSTATE(RL_STATE_SIGHANDLER); + } + else +#endif + _rl_handle_signal (sig); + + SIGHANDLER_RETURN; +} + +static void +rl_signal_handler (int sig) +{ + _rl_caught_signal = sig; + SIGHANDLER_RETURN; +} + +/* This is called to handle a signal when it is safe to do so (out of the + signal handler execution path). Called by _rl_signal_handler for all the + signals readline catches except SIGWINCH. */ +static void +_rl_handle_signal (int sig) +{ + int block_sig; + +#if defined (HAVE_POSIX_SIGNALS) + sigset_t set, oset; +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) + long omask; +# else /* !HAVE_BSD_SIGNALS */ + sighandler_cxt dummy_cxt; /* needed for rl_set_sighandler call */ +# endif /* !HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + + RL_SETSTATE(RL_STATE_SIGHANDLER); + +#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS) + /* Since the signal will not be blocked while we are in the signal + handler, ignore it until rl_clear_signals resets the catcher. */ +# if defined (SIGALRM) + if (sig == SIGINT || sig == SIGALRM) +# else + if (sig == SIGINT) +# endif + rl_set_sighandler (sig, SIG_IGN, &dummy_cxt); +#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */ + + /* If there's a sig cleanup function registered, call it and `deregister' + the cleanup function to avoid multiple calls */ + if (_rl_sigcleanup) + { + (*_rl_sigcleanup) (sig, _rl_sigcleanarg); + _rl_sigcleanup = 0; + _rl_sigcleanarg = 0; + } + +#if defined (HAVE_POSIX_SIGNALS) + /* Get the current set of blocked signals. If we want to block a signal for + the duration of the cleanup functions, make sure to add it to SET and + set block_sig = 1 (see the SIGHUP case below). */ + block_sig = 0; /* sentinel to block signals with sigprocmask */ + sigemptyset (&set); + sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set); +#endif + + switch (sig) + { + case SIGINT: + /* We will end up blocking SIGTTOU while we are resetting the tty, so + watch out for this if it causes problems. We could prevent this by + setting block_sig to 1 without modifying SET. */ + _rl_reset_completion_state (); + rl_free_line_state (); +#if defined (READLINE_CALLBACKS) + rl_callback_sigcleanup (); +#endif + + /* FALLTHROUGH */ + +#if defined (SIGTSTP) + case SIGTSTP: + case SIGTTIN: + case SIGTTOU: +# if defined (HAVE_POSIX_SIGNALS) + /* Block SIGTTOU so we can restore the terminal settings to something + sane without stopping on SIGTTOU if we have been placed into the + background. Even trying to get the current terminal pgrp with + tcgetpgrp() will generate SIGTTOU, so we don't bother. We still do + this even if we've been stopped on SIGTTOU, since we handle signals + when we have returned from the signal handler and the signal is no + longer blocked. */ + if (block_sig == 0) + { + sigaddset (&set, SIGTTOU); + block_sig = 1; + } +# endif +#endif /* SIGTSTP */ + /* Any signals that should be blocked during cleanup should go here. */ +#if defined (SIGHUP) + case SIGHUP: +# if defined (_AIX) + if (block_sig == 0) + { + sigaddset (&set, sig); + block_sig = 1; + } +# endif // _AIX +#endif + /* Signals that don't require blocking during cleanup should go here. */ + case SIGTERM: +#if defined (SIGALRM) + case SIGALRM: + if (sig == SIGALRM) + _rl_timeout_handle_sigalrm (); +#endif +#if defined (SIGQUIT) + case SIGQUIT: +#endif + +#if defined (HAVE_POSIX_SIGNALS) + if (block_sig) + sigprocmask (SIG_BLOCK, &set, &oset); +#endif + + rl_echo_signal_char (sig); + rl_cleanup_after_signal (); + + /* At this point, the application's signal handler, if any, is the + current handler. */ + +#if defined (HAVE_POSIX_SIGNALS) + /* Unblock any signal(s) blocked above */ + if (block_sig) + sigprocmask (SIG_UNBLOCK, &oset, (sigset_t *)NULL); +#endif + + /* We don't have to bother unblocking the signal because we are not + running in a signal handler context. */ + +#if defined (__EMX__) + signal (sig, SIG_ACK); +#endif + +#if defined (HAVE_KILL) + kill (getpid (), sig); +#else + raise (sig); /* assume we have raise */ +#endif + + /* We don't need to modify the signal mask now that this is not run in + a signal handler context. */ + + rl_reset_after_signal (); + } + + RL_UNSETSTATE(RL_STATE_SIGHANDLER); + SIGHANDLER_RETURN; +} + +#if defined (SIGWINCH) +static void +rl_sigwinch_handler (int sig) +{ + SigHandler *oh; + +#if defined (MUST_REINSTALL_SIGHANDLERS) + sighandler_cxt dummy_winch; + + /* We don't want to change old_winch -- it holds the state of SIGWINCH + disposition set by the calling application. We need this state + because we call the application's SIGWINCH handler after updating + our own idea of the screen size. */ + rl_set_sighandler (SIGWINCH, rl_sigwinch_handler, &dummy_winch); +#endif + + RL_SETSTATE(RL_STATE_SIGHANDLER); + _rl_caught_signal = sig; + + /* If another sigwinch handler has been installed, call it. */ + oh = (SigHandler *)old_winch.sa_handler; + if (oh && oh != (SigHandler *)SIG_IGN && oh != (SigHandler *)SIG_DFL) + (*oh) (sig); + + RL_UNSETSTATE(RL_STATE_SIGHANDLER); + SIGHANDLER_RETURN; +} +#endif /* SIGWINCH */ + +/* Functions to manage signal handling. */ + +#if !defined (HAVE_POSIX_SIGNALS) +static int +rl_sigaction (int sig, sighandler_cxt *nh, sighandler_cxt *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 (int sig, SigHandler *handler, sighandler_cxt *ohandler) +{ + sighandler_cxt old_handler; +#if defined (HAVE_POSIX_SIGNALS) + struct sigaction act; + + act.sa_handler = handler; +# if defined (SIGWINCH) + act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0; +# else + act.sa_flags = 0; +# endif /* SIGWINCH */ + 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); +} + +/* Set disposition of SIG to HANDLER, returning old state in OHANDLER. Don't + change disposition if OHANDLER indicates the signal was ignored. */ +static void +rl_maybe_set_sighandler (int sig, SigHandler *handler, sighandler_cxt *ohandler) +{ + sighandler_cxt dummy; + SigHandler *oh; + + sigemptyset (&dummy.sa_mask); + dummy.sa_flags = 0; + oh = rl_set_sighandler (sig, handler, ohandler); + if (oh == (SigHandler *)SIG_IGN) + rl_sigaction (sig, ohandler, &dummy); +} + +/* Set the disposition of SIG to HANDLER, if HANDLER->sa_handler indicates the + signal was not being ignored. MUST only be called for signals whose + disposition was changed using rl_maybe_set_sighandler or for which the + SIG_IGN check was performed inline (e.g., SIGALRM below). */ +static void +rl_maybe_restore_sighandler (int sig, sighandler_cxt *handler) +{ + sighandler_cxt dummy; + + sigemptyset (&dummy.sa_mask); + dummy.sa_flags = 0; + if (handler->sa_handler != SIG_IGN) + rl_sigaction (sig, handler, &dummy); +} + +int +rl_set_signals (void) +{ + sighandler_cxt dummy; + SigHandler *oh; +#if defined (HAVE_POSIX_SIGNALS) + static int sigmask_set = 0; + static sigset_t bset, oset; +#endif + +#if defined (HAVE_POSIX_SIGNALS) + if (rl_catch_signals && sigmask_set == 0) + { + sigemptyset (&bset); + + sigaddset (&bset, SIGINT); + sigaddset (&bset, SIGTERM); +#if defined (SIGHUP) + sigaddset (&bset, SIGHUP); +#endif +#if defined (SIGQUIT) + sigaddset (&bset, SIGQUIT); +#endif +#if defined (SIGALRM) + sigaddset (&bset, SIGALRM); +#endif +#if defined (SIGTSTP) + sigaddset (&bset, SIGTSTP); +#endif +#if defined (SIGTTIN) + sigaddset (&bset, SIGTTIN); +#endif +#if defined (SIGTTOU) + sigaddset (&bset, SIGTTOU); +#endif + sigmask_set = 1; + } +#endif /* HAVE_POSIX_SIGNALS */ + + if (rl_catch_signals && signals_set_flag == 0) + { +#if defined (HAVE_POSIX_SIGNALS) + sigemptyset (&_rl_orig_sigset); + sigprocmask (SIG_BLOCK, &bset, &_rl_orig_sigset); +#endif + + rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int); + rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term); +#if defined (SIGHUP) + rl_maybe_set_sighandler (SIGHUP, rl_signal_handler, &old_hup); +#endif +#if defined (SIGQUIT) + rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit); +#endif + +#if defined (SIGALRM) + oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm); + if (oh == (SigHandler *)SIG_IGN) + rl_sigaction (SIGALRM, &old_alrm, &dummy); +#if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART) + /* If the application using readline has already installed a signal + handler with SA_RESTART, SIGALRM will cause reads to be restarted + automatically, so readline should just get out of the way. Since + we tested for SIG_IGN above, we can just test for SIG_DFL here. */ + if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART)) + rl_sigaction (SIGALRM, &old_alrm, &dummy); +#endif /* HAVE_POSIX_SIGNALS */ +#endif /* SIGALRM */ + +#if defined (SIGTSTP) + rl_maybe_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp); +#endif /* SIGTSTP */ + +#if defined (SIGTTOU) + rl_maybe_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou); +#endif /* SIGTTOU */ + +#if defined (SIGTTIN) + rl_maybe_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin); +#endif /* SIGTTIN */ + + signals_set_flag = 1; + +#if defined (HAVE_POSIX_SIGNALS) + sigprocmask (SIG_SETMASK, &_rl_orig_sigset, (sigset_t *)NULL); +#endif + } + else if (rl_catch_signals == 0) + { +#if defined (HAVE_POSIX_SIGNALS) + sigemptyset (&_rl_orig_sigset); + sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &_rl_orig_sigset); +#endif + } + +#if defined (SIGWINCH) + if (rl_catch_sigwinch && sigwinch_set_flag == 0) + { + rl_maybe_set_sighandler (SIGWINCH, rl_sigwinch_handler, &old_winch); + sigwinch_set_flag = 1; + } +#endif /* SIGWINCH */ + + return 0; +} + +int +rl_clear_signals (void) +{ + sighandler_cxt dummy; + + if (rl_catch_signals && signals_set_flag == 1) + { + /* Since rl_maybe_set_sighandler doesn't override a SIG_IGN handler, + we should in theory not have to restore a handler where + old_xxx.sa_handler == SIG_IGN. That's what rl_maybe_restore_sighandler + does. Fewer system calls should reduce readline's per-line + overhead */ + rl_maybe_restore_sighandler (SIGINT, &old_int); + rl_maybe_restore_sighandler (SIGTERM, &old_term); +#if defined (SIGHUP) + rl_maybe_restore_sighandler (SIGHUP, &old_hup); +#endif +#if defined (SIGQUIT) + rl_maybe_restore_sighandler (SIGQUIT, &old_quit); +#endif +#if defined (SIGALRM) + rl_maybe_restore_sighandler (SIGALRM, &old_alrm); +#endif + +#if defined (SIGTSTP) + rl_maybe_restore_sighandler (SIGTSTP, &old_tstp); +#endif /* SIGTSTP */ + +#if defined (SIGTTOU) + rl_maybe_restore_sighandler (SIGTTOU, &old_ttou); +#endif /* SIGTTOU */ + +#if defined (SIGTTIN) + rl_maybe_restore_sighandler (SIGTTIN, &old_ttin); +#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 (void) +{ + _rl_clean_up_for_exit (); + if (rl_deprep_term_function) + (*rl_deprep_term_function) (); + rl_clear_pending_input (); + rl_clear_signals (); +} + +/* Reset the terminal and readline state after a signal handler returns. */ +void +rl_reset_after_signal (void) +{ + if (rl_prep_term_function) + (*rl_prep_term_function) (_rl_meta_flag); + rl_set_signals (); +} + +/* Free up the readline variable line state for the current line (undo list, + any partial history entry, any keyboard macros in progress, and any + numeric arguments in process) after catching a signal, before calling + rl_cleanup_after_signal(). */ +void +rl_free_line_state (void) +{ + register HIST_ENTRY *entry; + + rl_free_undo_list (); + + entry = current_history (); + if (entry) + entry->data = (char *)NULL; + + _rl_kill_kbd_macro (); + rl_clear_message (); + _rl_reset_argument (); +} + +int +rl_pending_signal (void) +{ + return (_rl_caught_signal); +} + +void +rl_check_signals (void) +{ + RL_CHECK_SIGNALS (); +} +#endif /* HANDLE_SIGNALS */ + +/* **************************************************************** */ +/* */ +/* SIGINT Management */ +/* */ +/* **************************************************************** */ + +#if defined (HAVE_POSIX_SIGNALS) +static sigset_t sigint_set, sigint_oset; +static sigset_t sigwinch_set, sigwinch_oset; +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) +static int sigint_oldmask; +static int sigwinch_oldmask; +# endif /* HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + +static int sigint_blocked; +static int sigwinch_blocked; + +/* Cause SIGINT to not be delivered until the corresponding call to + release_sigint(). */ +void +_rl_block_sigint (void) +{ + if (sigint_blocked) + return; + + sigint_blocked = 1; +} + +/* Allow SIGINT to be delivered. */ +void +_rl_release_sigint (void) +{ + if (sigint_blocked == 0) + return; + + sigint_blocked = 0; + RL_CHECK_SIGNALS (); +} + +/* Cause SIGWINCH to not be delivered until the corresponding call to + release_sigwinch(). */ +void +_rl_block_sigwinch (void) +{ + if (sigwinch_blocked) + return; + +#if defined (SIGWINCH) + +#if defined (HAVE_POSIX_SIGNALS) + sigemptyset (&sigwinch_set); + sigemptyset (&sigwinch_oset); + sigaddset (&sigwinch_set, SIGWINCH); + sigprocmask (SIG_BLOCK, &sigwinch_set, &sigwinch_oset); +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) + sigwinch_oldmask = sigblock (sigmask (SIGWINCH)); +# else /* !HAVE_BSD_SIGNALS */ +# if defined (HAVE_USG_SIGHOLD) + sighold (SIGWINCH); +# endif /* HAVE_USG_SIGHOLD */ +# endif /* !HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + +#endif /* SIGWINCH */ + + sigwinch_blocked = 1; +} + +/* Allow SIGWINCH to be delivered. */ +void +_rl_release_sigwinch (void) +{ + if (sigwinch_blocked == 0) + return; + +#if defined (SIGWINCH) + +#if defined (HAVE_POSIX_SIGNALS) + sigprocmask (SIG_SETMASK, &sigwinch_oset, (sigset_t *)NULL); +#else +# if defined (HAVE_BSD_SIGNALS) + sigsetmask (sigwinch_oldmask); +# else /* !HAVE_BSD_SIGNALS */ +# if defined (HAVE_USG_SIGHOLD) + sigrelse (SIGWINCH); +# endif /* HAVE_USG_SIGHOLD */ +# endif /* !HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + +#endif /* SIGWINCH */ + + sigwinch_blocked = 0; +} + +/* **************************************************************** */ +/* */ +/* Echoing special control characters */ +/* */ +/* **************************************************************** */ +void +rl_echo_signal_char (int sig) +{ + char cstr[3]; + int cslen, c; + + if (_rl_echoctl == 0 || _rl_echo_control_chars == 0) + return; + + switch (sig) + { + case SIGINT: c = _rl_intr_char; break; +#if defined (SIGQUIT) + case SIGQUIT: c = _rl_quit_char; break; +#endif +#if defined (SIGTSTP) + case SIGTSTP: c = _rl_susp_char; break; +#endif + default: return; + } + + if (CTRL_CHAR (c) || c == RUBOUT) + { + cstr[0] = '^'; + cstr[1] = CTRL_CHAR (c) ? UNCTRL (c) : '?'; + cstr[cslen = 2] = '\0'; + } + else + { + cstr[0] = c; + cstr[cslen = 1] = '\0'; + } + + _rl_output_some_chars (cstr, cslen); +} diff --git a/support/config.guess b/support/config.guess new file mode 100644 index 0000000..7f76b62 --- /dev/null +++ b/support/config.guess @@ -0,0 +1,1754 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2022 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-01-09' + +# 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 3 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, see . +# +# 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2022 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# Just in case it came from the environment. +GUESS= + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case $UNAME_SYSTEM in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case $UNAME_VERSION in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; + *:ekkoBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; + *:SolidBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; + macppc:MirBSD:*:*) + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; + *:MirBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; + alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case $ALPHA_CPU_TYPE in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # 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. + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; + Amiga*:UNIX_System_V:4.0:*) + GUESS=m68k-unknown-sysv4 + ;; + *:[Aa]miga[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; + *:[Mm]orph[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-morphos + ;; + *:OS/390:*:*) + GUESS=i370-ibm-openedition + ;; + *:z/VM:*:*) + GUESS=s390-ibm-zvmoe + ;; + *:OS400:*:*) + GUESS=powerpc-ibm-os400 + ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + GUESS=hppa1.1-hitachi-hiuxmpp + ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; + NILE*:*:*:dcosx) + GUESS=pyramid-pyramid-svr4 + ;; + DRS?6000:unix:4.0:6*) + GUESS=sparc-icl-nx6 + ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; + s390x:SunOS:*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; + sun4H:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; + 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. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; + 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'. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; + sun3*:SunOS:*:*) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case `/bin/arch` in + sun3) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun4) + GUESS=sparc-sun-sunos$UNAME_RELEASE + ;; + esac + ;; + aushp:SunOS:*:*) + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; + # 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:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; + m68k:machten:*:*) + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; + powerpc:machten:*:*) + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; + RISC*:Mach:*:*) + GUESS=mips-dec-mach_bsd4.3 + ;; + RISC*:ULTRIX:*:*) + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; + VAX*:ULTRIX*:*:*) + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; + Motorola:PowerMAX_OS:*:*) + GUESS=powerpc-motorola-powermax + ;; + Motorola:*:4.3:PL8-*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:Power_UNIX:*:*) + GUESS=powerpc-harris-powerunix + ;; + m88k:CX/UX:7*:*) + GUESS=m88k-harris-cxux7 + ;; + m88k:*:4*:R4*) + GUESS=m88k-motorola-sysv4 + ;; + m88k:*:3*:R3*) + GUESS=m88k-motorola-sysv3 + ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + GUESS=m88k-dg-dgux$UNAME_RELEASE + else + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE + fi + else + GUESS=i586-dg-dgux$UNAME_RELEASE + fi + ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + GUESS=m88k-dolphin-sysv3 + ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + GUESS=m88k-motorola-sysv3 + ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + GUESS=m88k-tektronix-sysv3 + ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + GUESS=m68k-tektronix-bsd + ;; + *:IRIX*:*:*) + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + GUESS=i386-ibm-aix + ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + GUESS=$SYSTEM_NAME + else + GUESS=rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + GUESS=rs6000-ibm-aix3.2.4 + else + GUESS=rs6000-ibm-aix3.2 + fi + ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; + *:AIX:*:*) + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + GUESS=rs6000-bull-bosx + ;; + DPX/2?00:B.O.S.:*:*) + GUESS=m68k-bull-sysv3 + ;; + 9000/[34]??:4.3bsd:1.*:*) + GUESS=m68k-hp-bsd + ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + GUESS=m68k-hp-bsd4.4 + ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if test -x /usr/bin/getconf; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case $sc_cpu_version in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case $sc_kernel_bits in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; + 9000/8??:4.3bsd:*:*) + GUESS=hppa1.0-hp-bsd + ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; + hp8??:OSF1:*:*) + GUESS=hppa1.0-hp-osf + ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk + else + GUESS=$UNAME_MACHINE-unknown-osf1 + fi + ;; + parisc*:Lites*:*:*) + GUESS=hppa1.1-hp-lites + ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + GUESS=c1-convex-bsd + ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + GUESS=c34-convex-bsd + ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + GUESS=c38-convex-bsd + ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + GUESS=c4-convex-bsd + ;; + CRAY*Y-MP:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; + CRAY*T3E:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; + CRAY*SV1:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; + *:UNICOS/mp:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; + sparc*:BSD/OS:*:*) + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; + *:BSD/OS:*:*) + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case $UNAME_PROCESSOR in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; + i*:CYGWIN*:*) + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; + *:MINGW*:*) + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; + i*:PW*:*) + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; + *:Interix*:*) + case $UNAME_MACHINE in + x86) + GUESS=i586-pc-interix$UNAME_RELEASE + ;; + authenticamd | genuineintel | EM64T) + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; + IA64) + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; + esac ;; + i*:UWIN*:*) + GUESS=$UNAME_MACHINE-pc-uwin + ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + GUESS=x86_64-pc-cygwin + ;; + prep*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; + *:GNU:*:*) + # the GNU system + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi + fi + ;; + avr32*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + cris:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + crisv32:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + frv:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + hexagon:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:Linux:*:*) + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; + ia64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m32r*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m68*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + padre:Linux:*:*) + GUESS=sparc-unknown-linux-$LIBC + ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + GUESS=hppa64-unknown-linux-$LIBC + ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; + esac + ;; + ppc64:Linux:*:*) + GUESS=powerpc64-unknown-linux-$LIBC + ;; + ppc:Linux:*:*) + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + s390:Linux:*:* | s390x:Linux:*:*) + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; + sh64*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sh*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + tile*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + vax:Linux:*:*) + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI=${LIBC}x32 + fi + fi + GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + ;; + xtensa*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + GUESS=i386-sequent-sysv4 + ;; + 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. + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; + i*86:XTS-300:*:STOP) + GUESS=$UNAME_MACHINE-unknown-stop + ;; + i*86:atheos:*:*) + GUESS=$UNAME_MACHINE-unknown-atheos + ;; + i*86:syllable:*:*) + GUESS=$UNAME_MACHINE-pc-syllable + ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; + i*86:*DOS:*:*) + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL + fi + ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv32 + fi + ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + GUESS=i586-pc-msdosdjgpp + ;; + Intel:Mach:3*:*) + GUESS=i386-pc-mach3 + ;; + paragon:*:*:*) + GUESS=i860-intel-osf1 + ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 + fi + ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + GUESS=m68010-convergent-sysv + ;; + mc68k:UNIX:SYSTEM5:3.51m) + GUESS=m68k-convergent-sysv + ;; + M680?0:D-NIX:5.3:*) + GUESS=m68k-diab-dnix + ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*: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; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + 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; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; + mc68030:UNIX_System_V:4.*:*) + GUESS=m68k-atari-sysv4 + ;; + TSUNAMI:LynxOS:2.*:*) + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; + rs6000:LynxOS:2.*:*) + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; + SM[BE]S:UNIX_SV:*:*) + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; + RM*:ReliantUNIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + RM*:SINIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + GUESS=$UNAME_MACHINE-sni-sysv4 + else + GUESS=ns32k-sni-sysv + fi + ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + GUESS=i586-unisys-sysv4 + ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + GUESS=hppa1.1-stratus-sysv4 + ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + GUESS=i860-stratus-sysv4 + ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=$UNAME_MACHINE-stratus-vos + ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=hppa1.1-stratus-vos + ;; + mc68*:A/UX:*:*) + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; + news*:NEWS-OS:6*:*) + GUESS=mips-sony-newsos6 + ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE + else + GUESS=mips-unknown-sysv$UNAME_RELEASE + fi + ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + GUESS=powerpc-be-beos + ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + GUESS=powerpc-apple-beos + ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + GUESS=i586-pc-beos + ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + GUESS=i586-pc-haiku + ;; + x86_64:Haiku:*:*) + GUESS=x86_64-unknown-haiku + ;; + SX-4:SUPER-UX:*:*) + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; + SX-5:SUPER-UX:*:*) + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; + SX-6:SUPER-UX:*:*) + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; + SX-7:SUPER-UX:*:*) + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; + SX-8:SUPER-UX:*:*) + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; + SX-8R:SUPER-UX:*:*) + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; + Power*:Rhapsody:*:*) + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; + *:Rhapsody:*:*) + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; + *:QNX:*:4*) + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; + *:NonStop-UX:*:*) + GUESS=mips-compaq-nonstopux + ;; + BS2000:POSIX*:*:*) + GUESS=bs2000-siemens-sysv + ;; + DS/*:UNIX_System_V:*:*) + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "${cputype-}" = 386; then + UNAME_MACHINE=i386 + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype + fi + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; + *:TOPS-10:*:*) + GUESS=pdp10-unknown-tops10 + ;; + *:TENEX:*:*) + GUESS=pdp10-unknown-tenex + ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + GUESS=pdp10-dec-tops20 + ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + GUESS=pdp10-xkl-tops20 + ;; + *:TOPS-20:*:*) + GUESS=pdp10-unknown-tops20 + ;; + *:ITS:*:*) + GUESS=pdp10-unknown-its + ;; + SEI:*:*:SEIUX) + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; + *:DragonFly:*:*) + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; + esac ;; + *:XENIX:*:SysV) + GUESS=i386-pc-xenix + ;; + i*86:skyos:*:*) + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; + i*86:rdos:*:*) + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; +esac + +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#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 + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/support/config.rpath b/support/config.rpath new file mode 100644 index 0000000..fc5913d --- /dev/null +++ b/support/config.rpath @@ -0,0 +1,684 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2018 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's _LT_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + ecc*) + wl='-Wl,' + ;; + icc* | ifort*) + wl='-Wl,' + ;; + lf95*) + wl='-Wl,' + ;; + nagfor*) + wl='-Wl,-Wl,,' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + xl* | bgxl* | bgf* | mpixl*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + wl= + ;; + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + newsos6) + ;; + *nto* | *qnx*) + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + wl='-Qoption ld ' + ;; + *) + wl='-Wl,' + ;; + esac + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's _LT_LINKER_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + case "$host_cpu" in + powerpc) + ;; + m68k) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32* | cegcc*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + haiku*) + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + case "$host_cpu" in + powerpc) + ;; + m68k) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then + : + else + ld_shlibs=no + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd2.[01]*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + *nto* | *qnx*) + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix[4-9]*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + case "$host_cpu" in + powerpc*) + library_names_spec='$libname$shrext' ;; + m68k) + library_names_spec='$libname.a' ;; + esac + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32* | cegcc*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd[23].*) + library_names_spec='$libname$shrext$versuffix' + ;; + freebsd* | dragonfly*) + library_names_spec='$libname$shrext' + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + haiku*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + *nto* | *qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + tpf*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. +# +# 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# 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. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# 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. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2021 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # 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) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/support/install.sh b/support/install.sh new file mode 100644 index 0000000..0cac004 --- /dev/null +++ b/support/install.sh @@ -0,0 +1,247 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +tranformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/support/mkdirs b/support/mkdirs new file mode 100644 index 0000000..46f656e --- /dev/null +++ b/support/mkdirs @@ -0,0 +1,47 @@ +#! /bin/sh +# +# mkdirs - a work-alike for `mkdir -p' +# +# Chet Ramey +# chet@po.cwru.edu + +# Copyright (C) 1996-2002 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 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, see . + +for dir +do + + test -d "$dir" && continue + + tomake=$dir + while test -n "$dir" ; do + # dir=${dir%/*} + # dir=`expr "$dir" ':' '\(/.*\)/[^/]*'` + if dir=`expr "$dir" ':' '\(.*\)/[^/]*'`; then + tomake="$dir $tomake" + else + dir= + fi + done + + for d in $tomake + do + test -d "$d" && continue + echo mkdir "$d" + mkdir "$d" + done +done + +exit 0 diff --git a/support/mkdist b/support/mkdist new file mode 100644 index 0000000..463bdc1 --- /dev/null +++ b/support/mkdist @@ -0,0 +1,140 @@ +#! /bin/bash - +# +# mkdist - make a distribution directory from a master manifest file +# +# usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-t] [-v] version +# +# SRCDIR defaults to src +# MANIFEST defaults to $SRCDIR/MANIFEST +# +# Chet Ramey +# chet@po.cwru.edu + +# Copyright (C) 1996-2002 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 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, see . +# + +SRCDIR=src +ROOTNAME=bash + +usage() +{ + echo usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-t] [-v] version 1>&2 + exit 2 +} + +vmsg() +{ + if [ -n "$verbose" ]; then + echo mkdist: "$@" + fi +} + +while getopts m:s:r:tv name +do + case $name in + m) MANIFEST=$OPTARG ;; + s) SRCDIR=$OPTARG ;; + r) ROOTNAME=$OPTARG ;; + t) maketar=yes ;; + 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 + +tarfile=${newdir}.tar + +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 rest +do + [ -z "$fname" ] && continue + + case "$fname" in + \#*) continue ;; + esac + + case "$type" in + d) mkdir $newdir/$fname ;; + f) cp -p $SRCDIR/$fname $newdir/$fname ;; + F) cp $SRCDIR/$fname $newdir/$fname ;; + s) ln -s $mode $newdir/$fname ; mode= ;; # symlink + l) ln $mode $newdir/$fname ; mode= ;; # hard link + c) cp $SRCDIR/$mode $newdir/$fname ; mode=$filmode ;; # copy to new name + *) echo "unknown file type $type" 1>&2 ;; + esac + + # allow trailing comments + case "$mode" in + \#*) mode= ;; + esac + + if [ -n "$mode" ]; then + chmod $mode $newdir/$fname + elif [ "$type" = "f" ]; then + chmod $filmode $newdir/$fname + elif [ "$type" = "d" ]; then + chmod $dirmode $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 + +if [ -n "$maketar" ]; then + tar cf ${tarfile} $newdir + gzip $tarfile + vmsg ${tarfile}.gz created +fi + +exit 0 diff --git a/support/mkinstalldirs b/support/mkinstalldirs new file mode 100644 index 0000000..d2d5f21 --- /dev/null +++ b/support/mkinstalldirs @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff --git a/support/shlib-install b/support/shlib-install new file mode 100644 index 0000000..661355d --- /dev/null +++ b/support/shlib-install @@ -0,0 +1,174 @@ +#! /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 [-V host_vendor] -d installation-dir [-b bin-dir] -i install-prog [-U] library +# +# Chet Ramey +# chet@po.cwru.edu + +# +# defaults +# +INSTALLDIR=/usr/local/lib +LDCONFIG=ldconfig + +PROGNAME=`basename $0` +USAGE="$PROGNAME [-D] -O host_os [-V host_vendor] -d installation-dir [-b bin-dir] -i install-prog [-U] library" + +# process options - should use getopts + +while [ $# -gt 0 ]; do + case "$1" in + -O) shift; host_os="$1"; shift ;; + -V) shift; host_vendor="$1"; shift ;; + -d) shift; INSTALLDIR="$1"; shift ;; + -b) shift; BINDIR="$1" ; shift ;; + -i) shift; INSTALLPROG="$1" ; shift ;; + -D) echo=echo ; shift ;; + -U) uninstall=true ; shift ;; + -*) echo "$USAGE" >&2 ; exit 2;; + *) break ;; + esac +done + +# set install target name +LIBNAME="$1" + +if [ -z "$LIBNAME" ]; then + echo "$USAGE" >&2 + exit 2 +fi + +OLDSUFF=old +MV=mv +RM="rm -f" +LN="ln -s" + +# pre-install + +if [ -z "$uninstall" ]; then + ${echo} $RM ${INSTALLDIR}/${LIBNAME}.${OLDSUFF} + if [ -f "$INSTALLDIR/$LIBNAME" ]; then + ${echo} $MV $INSTALLDIR/$LIBNAME ${INSTALLDIR}/${LIBNAME}.${OLDSUFF} + fi +fi + +# install/uninstall + +if [ -z "$uninstall" ] ; then + ${echo} eval ${INSTALLPROG} $LIBNAME ${INSTALLDIR}/${LIBNAME} +else + ${echo} ${RM} ${INSTALLDIR}/${LIBNAME} +fi + +# post-install/uninstall + +# HP-UX and Darwin/MacOS X require that a shared library have execute permission +# Linux does, too, and ldd warns about it. Solaris doesn't seem to mind, +# but ldd still warns about it. +# Cygwin installs both a dll (which must go in $BINDIR) and an implicit +# link library (in $libdir) +case "$host_os" in +hpux*|darwin*|macosx*|linux*|solaris2*) + if [ -z "$uninstall" ]; then + chmod 755 ${INSTALLDIR}/${LIBNAME} + fi ;; +cygwin*|mingw*) + IMPLIBNAME=`echo ${LIBNAME} \ + | sed -e 's,^cyg,lib,' -e 's,[0-9]*.dll$,.dll.a,'` + if [ -z "$uninstall" ]; then + ${echo} $RM ${BINDIR}/${LIBNAME}.${OLDSUFF} + if [ -f "$BINDIR/$LIBNAME" ]; then + ${echo} $MV $BINDIR/$LIBNAME $BINDIR/$LIBNAME.$OLDSUFF + fi + ${echo} $MV ${INSTALLDIR}/${LIBNAME} ${BINDIR}/${LIBNAME} + ${echo} chmod a+x ${BINDIR}/${LIBNAME} + ${echo} eval ${INSTALLPROG} ${LIBNAME}.a \ + ${INSTALLDIR}/${IMPLIBNAME} + else + ${echo} ${RM} ${BINDIR}/${LIBNAME} + ${echo} ${RM} ${INSTALLDIR}/${IMPLIBNAME} + fi ;; + +*) ;; +esac + +case "$LIBNAME" in +*.*.[0-9].[0-9]) # libname.so.M.N + LINK2=`echo $LIBNAME | sed 's:\(.*\..*\.[0-9]\)\.[0-9]:\1:'` # libname.so.M + LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]\.[0-9]:\1:'` # libname.so + ;; +*.*.[0-9]) # libname.so.M + LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]:\1:'` # libname.so + ;; +*.[0-9]) # libname.M + LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]:\1:'` # libname + ;; +*.[0-9].[0-9].dylib) # libname.M.N.dylib + LINK2=`echo $LIBNAME | sed 's:\(.*\.[0-9]\)\.[0-9]:\1:'` # libname.M.dylib + LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]\.[0-9]:\1:'` # libname.dylib +esac + +INSTALL_LINK1='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK1' +INSTALL_LINK2='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK2' + +# +# Create symlinks to the installed library. This section is incomplete. +# +case "$host_os-$host_vendor" in +*linux*|freebsd*|dragonfly*) + # libname.so.M -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK2 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK2 + fi + + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + ${echo} cd $INSTALLDIR && ${echo} ${LN} $LINK2 $LINK1 + fi + ;; + +bsdi4*|*gnu*|darwin*|macosx*|netbsd*|mirbsd*) + # libname.so.M -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK2 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK2 + fi + + # libname.so -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + ;; + +solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*) + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + ;; + +hpux1*) + # libname.sl -> libname.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1.sl + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + ;; + +cygwin*|mingw*) + # Links to .dlls don't work. Hence shobj-conf used DLLVERSION.dll + # instead of so.SHLIB_MAJOR.SHLIB_MINOR. The postinstall above + # took care of everything else. + ;; + +*) ;; +esac + +exit 0 diff --git a/support/shobj-conf b/support/shobj-conf new file mode 100644 index 0000000..cd7634d --- /dev/null +++ b/support/shobj-conf @@ -0,0 +1,553 @@ +#! /bin/sh +# +# shobj-conf -- output a series of variable assignments to be substituted +# into a Makefile by configure which specify system-dependent +# information for creating shared objects that may be loaded +# into bash with `enable -f' +# +# usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor +# +# Chet Ramey +# chet@po.cwru.edu + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# +# This file is part of GNU Bash, the Bourne Again SHell. +# +# 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 3 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, see . +# + +# +# defaults +# +SHOBJ_STATUS=supported +SHLIB_STATUS=supported + +SHOBJ_CC=cc +SHOBJ_CFLAGS= +SHOBJ_LD= +SHOBJ_LDFLAGS= +SHOBJ_XLDFLAGS= +SHOBJ_LIBS= + +SHLIB_XLDFLAGS= +SHLIB_LIBS= + +SHLIB_DOT='.' +SHLIB_LIBPREF='lib' +SHLIB_LIBSUFF='so' + +SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)' +SHLIB_DLLVERSION='$(SHLIB_MAJOR)' + +PROGNAME=`basename $0` +USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor" + +while [ $# -gt 0 ]; do + case "$1" in + -C) shift; SHOBJ_CC="$1"; shift ;; + -c) shift; host_cpu="$1"; shift ;; + -o) shift; host_os="$1"; shift ;; + -v) shift; host_vendor="$1"; shift ;; + *) echo "$USAGE" >&2 ; exit 2;; + esac +done + +case "${host_os}-${SHOBJ_CC}-${host_vendor}" in +nsk-cc-tandem|nsk-c99-tandem) + SHOBJ_CFLAGS=-Wglobalized + case `uname -m` in + NSR*) + SHOBJ_CFLAGS="${SHOBJ_CFLAGS} -Wcall_shared" # default on TNS/E, needed on TNS/R + SHOBJ_LD=/usr/bin/ld # for TNS/R + ;; + NSE*|NEO*) + SHOBJ_LD=/usr/bin/eld + ;; + esac + SHOBJ_LDFLAGS='-shared -bglobalized -unres_symbols ignore' + ;; + +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_LD='${CC}' + ld_used=`gcc -print-prog-name=ld` + if ${ld_used} -V 2>&1 | grep GNU >/dev/null 2>&1; then + # This line works for the GNU ld + SHOBJ_LDFLAGS='-shared -Wl,-h,$@' + # http://sourceware.org/ml/binutils/2001-08/msg00361.html + SHOBJ_CFLAGS=-fPIC + else + # This line works for the Solaris linker in /usr/ccs/bin/ld + SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@' + SHOBJ_CFLAGS=-fpic + fi + +# SHLIB_XLDFLAGS='-R $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sunos5*|solaris2*) + SHOBJ_CFLAGS='-K pic' + SHOBJ_LD=/usr/ccs/bin/ld + SHOBJ_LDFLAGS='-G -dy -z text -i -h $@' + +# SHLIB_XLDFLAGS='-R $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +# All versions of Linux (including Gentoo/FreeBSD) or the semi-mythical GNU Hurd. +linux*-*|gnu*-*|k*bsd*-gnu-*|midnightbsd*|freebsd*|dragonfly*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +# Darwin/MacOS X +darwin*) + # Common definitions for all darwin/mac os x versions + SHOBJ_CFLAGS='-fno-common' + + SHOBJ_LD='${CC}' + + SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' + SHLIB_LIBSUFF='dylib' + + # unused at this time + SHLIB_SONAME='$(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF)' + + case "${host_os}" in + # Darwin versions 1, 5, 6, 7 correspond to Mac OS X 10.0, 10.1, 10.2, + # and 10.3, respectively. + darwin[1-7].*) + SHOBJ_STATUS=unsupported + SHOBJ_LDFLAGS='-dynamic' + SHLIB_XLDFLAGS='-install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -v' + ;; + # Darwin 8 == Mac OS X 10.4; Mac OS X 10.N == Darwin N+4 + *) + case "${host_os}" in + darwin[89]*|darwin1[012]*) + SHOBJ_ARCHFLAGS= + ;; + *) # Mac OS X 10.9 (Mavericks) and later + SHOBJ_ARCHFLAGS= + # for 32 and 64bit universal library + #SHOBJ_ARCHFLAGS='-arch i386 -arch x86_64' + #SHOBJ_CFLAGS=${SHOBJ_CFLAGS}' -arch i386 -arch x86_64' + ;; + esac + SHOBJ_LDFLAGS="-dynamiclib -dynamic -undefined dynamic_lookup ${SHOBJ_ARCHFLAGS}" + SHLIB_XLDFLAGS="-dynamiclib ${SHOBJ_ARCHFLAGS}"' -install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -v' + ;; + esac + + SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 + ;; + +openbsd*|netbsd*|mirbsd*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_XLDFLAGS='-R$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +bsdi2*) + SHOBJ_CC=shlicc2 + SHOBJ_CFLAGS= + SHOBJ_LD=ld + SHOBJ_LDFLAGS=-r + SHOBJ_LIBS=-lc_s.2.1.0 + + # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in + # the ass -- they require changing {/usr/lib,etc}/shlib.map on + # each system, and the library creation process is byzantine + SHLIB_STATUS=unsupported + ;; + +bsdi3*) + SHOBJ_CC=shlicc2 + SHOBJ_CFLAGS= + SHOBJ_LD=ld + SHOBJ_LDFLAGS=-r + SHOBJ_LIBS=-lc_s.3.0.0 + + # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in + # the ass -- they require changing {/usr/lib,etc}/shlib.map on + # each system, and the library creation process is byzantine + SHLIB_STATUS=unsupported + ;; + +bsdi4*) + # BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked + # shared libraries. gcc 2.x is the standard compiler, and the + # `normal' gcc options should work as they do in Linux. + + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +osf*-*gcc*) + # Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +osf*) + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*) # lightly tested by jik@cisco.com + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-Wl,-bdynamic -Wl,-bnoentry -Wl,-bexpall' + SHOBJ_XLDFLAGS='-G' + + SHLIB_XLDFLAGS='-bM:SRE' + SHLIB_LIBS='-lcurses -lc' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +aix4.[2-9]*|aix[5-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 . If you have problems, +# remove the `-no_unresolved' + SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux9*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' + + SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux9*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +hpux10*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + # if you have problems linking here, moving the `-Wl,+h,$@' from + # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work + SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s' + + SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux10*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s +h $@' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +hpux11*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' +# SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@' + SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s -Wl,+h,$@' + + SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux11*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code from michael.osipov@siemens.com (I have not tested it) +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='$(CC)' +# SHOBJ_LDFLAGS='-b -Wl,+s -Wl,+h,$@' +# +# SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' +# SHLIB_LIBSUFF='so' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' +# SHLIB_LIBS='$(TERMCAP_LIB)' + ;; + +sysv4*-*gcc*) + SHOBJ_CFLAGS=-shared + SHOBJ_LDFLAGS='-shared -h $@' + SHOBJ_LD='${CC}' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv4*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-dy -z text -G -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sco3.2v5*-*gcc*) + SHOBJ_CFLAGS='-fpic' # DEFAULTS TO ELF + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sco3.2v5*) + SHOBJ_CFLAGS='-K pic -b elf' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5uw7*-*gcc*) + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5uw7*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5UnixWare*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5UnixWare*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5OpenUNIX*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5OpenUNIX*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +dgux*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +dgux*) + SHOBJ_CFLAGS='-K pic' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +msdos*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + ;; + +cygwin*) + SHOBJ_LD='$(CC)' + SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' + SHLIB_LIBPREF='cyg' + SHLIB_LIBSUFF='dll' + SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' + SHLIB_LIBS='$(TERMCAP_LIB)' + + SHLIB_DOT= + # For official cygwin releases, DLLVERSION will be defined in the + # environment of configure, and will be incremented any time the API + # changes in a non-backwards compatible manner. Otherwise, it is just + # SHLIB_MAJOR. + if [ -n "$DLLVERSION" ] ; then + SHLIB_DLLVERSION="$DLLVERSION" + fi + ;; + +mingw*) + SHOBJ_LD='$(CC)' + SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' + SHLIB_LIBSUFF='dll' + SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' + SHLIB_LIBS='$(TERMCAP_LIB)' + + SHLIB_DOT= + # For official cygwin releases, DLLVERSION will be defined in the + # environment of configure, and will be incremented any time the API + # changes in a non-backwards compatible manner. Otherwise, it is just + # SHLIB_MAJOR. + if [ -n "$DLLVERSION" ] ; then + SHLIB_DLLVERSION="$DLLVERSION" + fi + ;; + +# +# Rely on correct gcc configuration for everything else +# +*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + ;; + +esac + +echo SHOBJ_CC=\'"$SHOBJ_CC"\' +echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\' +echo SHOBJ_LD=\'"$SHOBJ_LD"\' +echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\' +echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\' +echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\' + +echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\' +echo SHLIB_LIBS=\'"$SHLIB_LIBS"\' + +echo SHLIB_DOT=\'"$SHLIB_DOT"\' + +echo SHLIB_LIBPREF=\'"$SHLIB_LIBPREF"\' +echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\' + +echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\' +echo SHLIB_DLLVERSION=\'"$SHLIB_DLLVERSION"\' + +echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\' +echo SHLIB_STATUS=\'"$SHLIB_STATUS"\' + +exit 0 diff --git a/support/wcwidth.c b/support/wcwidth.c new file mode 100644 index 0000000..0f5ec99 --- /dev/null +++ b/support/wcwidth.c @@ -0,0 +1,313 @@ +/* + * This is an implementation of wcwidth() and wcswidth() (defined in + * IEEE Std 1002.1-2001) for Unicode. + * + * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html + * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html + * + * In fixed-width output devices, Latin characters all occupy a single + * "cell" position of equal width, whereas ideographic CJK characters + * occupy two such cells. Interoperability between terminal-line + * applications and (teletype-style) character terminals using the + * UTF-8 encoding requires agreement on which character should advance + * the cursor by how many cell positions. No established formal + * standards exist at present on which Unicode character shall occupy + * how many cell positions on character terminals. These routines are + * a first attempt of defining such behavior based on simple rules + * applied to data provided by the Unicode Consortium. + * + * For some graphical characters, the Unicode standard explicitly + * defines a character-cell width via the definition of the East Asian + * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. + * In all these cases, there is no ambiguity about which width a + * terminal shall use. For characters in the East Asian Ambiguous (A) + * class, the width choice depends purely on a preference of backward + * compatibility with either historic CJK or Western practice. + * Choosing single-width for these characters is easy to justify as + * the appropriate long-term solution, as the CJK practice of + * displaying these characters as double-width comes from historic + * implementation simplicity (8-bit encoded characters were displayed + * single-width and 16-bit ones double-width, even for Greek, + * Cyrillic, etc.) and not any typographic considerations. + * + * Much less clear is the choice of width for the Not East Asian + * (Neutral) class. Existing practice does not dictate a width for any + * of these characters. It would nevertheless make sense + * typographically to allocate two character cells to characters such + * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be + * represented adequately with a single-width glyph. The following + * routines at present merely assign a single-cell width to all + * neutral characters, in the interest of simplicity. This is not + * entirely satisfactory and should be reconsidered before + * establishing a formal standard in this area. At the moment, the + * decision which Not East Asian (Neutral) characters should be + * represented by double-width glyphs cannot yet be answered by + * applying a simple rule from the Unicode database content. Setting + * up a proper standard for the behavior of UTF-8 character terminals + * will require a careful analysis not only of each Unicode character, + * but also of each presentation form, something the author of these + * routines has avoided to do so far. + * + * http://www.unicode.org/unicode/reports/tr11/ + * + * Markus Kuhn -- 2007-05-26 (Unicode 5.0) + * + * Permission to use, copy, modify, and distribute this software + * for any purpose and without fee is hereby granted. The author + * disclaims all warranties with regard to this software. + * + * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c + */ + +#ifdef __GO32__ +# include +#endif + +#include + +struct interval { + int first; + int last; +}; + +/* auxiliary function for binary search in interval table */ +static int bisearch(wchar_t ucs, const struct interval *table, int max) { + int min = 0; + int mid; + + if (ucs < table[0].first || ucs > table[max].last) + return 0; + while (max >= min) { + mid = (min + max) / 2; + if (ucs > table[mid].last) + min = mid + 1; + else if (ucs < table[mid].first) + max = mid - 1; + else + return 1; + } + + return 0; +} + + +/* The following two functions define the column width of an ISO 10646 + * character as follows: + * + * - The null character (U+0000) has a column width of 0. + * + * - Other C0/C1 control characters and DEL will lead to a return + * value of -1. + * + * - Non-spacing and enclosing combining characters (general + * category code Mn or Me in the Unicode database) have a + * column width of 0. + * + * - SOFT HYPHEN (U+00AD) has a column width of 1. + * + * - Other format characters (general category code Cf in the Unicode + * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. + * + * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) + * have a column width of 0. + * + * - Spacing characters in the East Asian Wide (W) or East Asian + * Full-width (F) category as defined in Unicode Technical + * Report #11 have a column width of 2. + * + * - All remaining characters (including all printable + * ISO 8859-1 and WGL4 characters, Unicode control characters, + * etc.) have a column width of 1. + * + * This implementation assumes that wchar_t characters are encoded + * in ISO 10646. + */ + +int mk_wcwidth(wchar_t ucs) +{ + /* sorted list of non-overlapping intervals of non-spacing characters */ + /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ + static const struct interval combining[] = { + { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, + { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, + { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, + { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, + { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, + { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, + { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, + { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, + { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, + { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, + { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, + { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, + { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, + { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, + { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, + { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, + { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, + { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, + { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, + { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, + { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, + { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, + { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, + { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, + { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, + { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, + { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, + { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, + { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, + { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, + { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, + { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, + { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, + { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, + { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, + { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, + { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, + { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, + { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, + { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, + { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, + { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, + { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, + { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, + { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 }, + { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, + { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, + { 0xE0100, 0xE01EF } + }; + + /* test for 8-bit control characters */ + if (ucs == 0) + return 0; + if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) + return -1; + + /* binary search in table of non-spacing characters */ + if (bisearch(ucs, combining, + sizeof(combining) / sizeof(struct interval) - 1)) + return 0; + + /* if we arrive here, ucs is not a combining or C0/C1 control character */ + + return 1 + + (ucs >= 0x1100 && + (ucs <= 0x115f || /* Hangul Jamo init. consonants */ + ucs == 0x2329 || ucs == 0x232a || + (ucs >= 0x2e80 && ucs <= 0xa4cf && + ucs != 0x303f) || /* CJK ... Yi */ + (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ + (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ + (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ + (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ + (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ + (ucs >= 0xffe0 && ucs <= 0xffe6) || + (ucs >= 0x20000 && ucs <= 0x2fffd) || + (ucs >= 0x30000 && ucs <= 0x3fffd))); +} + + +int mk_wcswidth(const wchar_t *pwcs, size_t n) +{ + int w, width = 0; + + for (;*pwcs && n-- > 0; pwcs++) + if ((w = mk_wcwidth(*pwcs)) < 0) + return -1; + else + width += w; + + return width; +} + + +/* + * The following functions are the same as mk_wcwidth() and + * mk_wcswidth(), except that spacing characters in the East Asian + * Ambiguous (A) category as defined in Unicode Technical Report #11 + * have a column width of 2. This variant might be useful for users of + * CJK legacy encodings who want to migrate to UCS without changing + * the traditional terminal character-width behaviour. It is not + * otherwise recommended for general use. + */ +int mk_wcwidth_cjk(wchar_t ucs) +{ + /* sorted list of non-overlapping intervals of East Asian Ambiguous + * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ + static const struct interval ambiguous[] = { + { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, + { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, + { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, + { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, + { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, + { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, + { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, + { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, + { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, + { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, + { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, + { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, + { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, + { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, + { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, + { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, + { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, + { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, + { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, + { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, + { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, + { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, + { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, + { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, + { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, + { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, + { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, + { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, + { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, + { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, + { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, + { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, + { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, + { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, + { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E }, + { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 }, + { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, + { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F }, + { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, + { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, + { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B }, + { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 }, + { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, + { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, + { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, + { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, + { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 }, + { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, + { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, + { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, + { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF }, + { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD } + }; + + /* binary search in table of non-spacing characters */ + if (bisearch(ucs, ambiguous, + sizeof(ambiguous) / sizeof(struct interval) - 1)) + return 2; + + return mk_wcwidth(ucs); +} + + +int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) +{ + int w, width = 0; + + for (;*pwcs && n-- > 0; pwcs++) + if ((w = mk_wcwidth_cjk(*pwcs)) < 0) + return -1; + else + width += w; + + return width; +} diff --git a/tcap.h b/tcap.h new file mode 100644 index 0000000..859e6ee --- /dev/null +++ b/tcap.h @@ -0,0 +1,60 @@ +/* tcap.h -- termcap library functions and variables. */ + +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#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 +#elif defined (HAVE_NCURSES_TERMCAP_H) +# include +#else + +/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC. + Unfortunately, PC is a global variable used by the termcap library. */ +#ifdef PC +# undef PC +#endif + +extern char PC; +extern char *UP, *BC; + +extern short ospeed; + +extern int tgetent (); +extern int tgetflag (); +extern int tgetnum (); +extern char *tgetstr (); + +extern int tputs (); + +extern char *tgoto (); + +#endif /* HAVE_TERMCAP_H */ + +#endif /* !_RLTCAP_H_ */ diff --git a/terminal.c b/terminal.c new file mode 100644 index 0000000..9997161 --- /dev/null +++ b/terminal.c @@ -0,0 +1,939 @@ +/* terminal.c -- controlling the terminal with termcap. */ + +/* Copyright (C) 1996-2022 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include "posixstat.h" +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif /* HAVE_SYS_FILE_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +#ifdef __MSDOS__ +# include +#endif + +#include "rltty.h" +#if defined (HAVE_SYS_IOCTL_H) +# include /* include for declaration of ioctl */ +#endif +#include "tcap.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +#if defined (__MINGW32__) +# include +# include + +static void _win_get_screensize (int *, int *); +#endif + +#if defined (__EMX__) +static void _emx_get_screensize (int *, int *); +#endif + +/* If the calling application sets this to a non-zero value, readline will + use the $LINES and $COLUMNS environment variables to set its idea of the + window size before interrogating the kernel. */ +int rl_prefer_env_winsize = 0; + +/* If this is non-zero, readline will set LINES and COLUMNS in the + environment when it handles SIGWINCH. */ +int rl_change_environment = 1; + +/* **************************************************************** */ +/* */ +/* Terminal and Termcap */ +/* */ +/* **************************************************************** */ + +#ifndef __MSDOS__ +static char *term_buffer = (char *)NULL; +static char *term_string_buffer = (char *)NULL; +#endif + +static int tcap_initialized; + +#if !defined (__linux__) && !defined (NCURSES_VERSION) +# if defined (__EMX__) || defined (NEED_EXTERN_PC) +extern +# endif /* __EMX__ || NEED_EXTERN_PC */ +char PC, *BC, *UP; +#endif /* !__linux__ && !NCURSES_VERSION */ + +/* Some strings to control terminal actions. These are output by tputs (). */ +char *_rl_term_clreol; +char *_rl_term_clrpag; +char *_rl_term_clrscroll; +char *_rl_term_cr; +char *_rl_term_backspace; +char *_rl_term_goto; +char *_rl_term_pc; + +/* Non-zero if we determine that the terminal can do character insertion. */ +int _rl_terminal_can_insert = 0; + +/* How to insert characters. */ +char *_rl_term_im; +char *_rl_term_ei; +char *_rl_term_ic; +char *_rl_term_ip; +char *_rl_term_IC; + +/* How to delete characters. */ +char *_rl_term_dc; +char *_rl_term_DC; + +/* How to move forward a char, non-destructively */ +char *_rl_term_forward_char; + +/* How to go up a line. */ +char *_rl_term_up; + +/* A visible bell; char if the terminal can be made to flash the screen. */ +static char *_rl_visible_bell; + +/* Non-zero means the terminal can auto-wrap lines. */ +int _rl_term_autowrap = -1; + +/* Non-zero means that this terminal has a meta key. */ +static int term_has_meta; + +/* The sequences to write to turn on and off the meta key, if this + terminal has one. */ +static char *_rl_term_mm; +static char *_rl_term_mo; + +/* The sequences to enter and exit standout mode. */ +static char *_rl_term_so; +static char *_rl_term_se; + +/* The key sequences output by the arrow keys, if this terminal has any. */ +static char *_rl_term_ku; +static char *_rl_term_kd; +static char *_rl_term_kr; +static char *_rl_term_kl; + +/* How to initialize and reset the arrow keys, if this terminal has any. */ +static char *_rl_term_ks; +static char *_rl_term_ke; + +/* The key sequences sent by the Home and End keys, if any. */ +static char *_rl_term_kh; +static char *_rl_term_kH; +static char *_rl_term_at7; /* @7 */ + +/* Delete key */ +static char *_rl_term_kD; + +/* Insert key */ +static char *_rl_term_kI; + +/* Page up and page down keys */ +static char *_rl_term_kP; +static char *_rl_term_kN; + +/* Cursor control */ +static char *_rl_term_vs; /* very visible */ +static char *_rl_term_ve; /* normal */ + +/* User-settable color sequences to begin and end the active region. Defaults + are rl_term_so and rl_term_se on non-dumb terminals. */ +char *_rl_active_region_start_color = NULL; +char *_rl_active_region_end_color = NULL; + +/* It's not clear how HPUX is so broken here. */ +#ifdef TGETENT_BROKEN +# define TGETENT_SUCCESS 0 +#else +# define TGETENT_SUCCESS 1 +#endif +#ifdef TGETFLAG_BROKEN +# define TGETFLAG_SUCCESS 0 +#else +# define TGETFLAG_SUCCESS 1 +#endif +#define TGETFLAG(cap) (tgetflag (cap) == TGETFLAG_SUCCESS) + +static void bind_termcap_arrow_keys (Keymap); + +/* Variables that hold the screen dimensions, used by the display code. */ +int _rl_screenwidth, _rl_screenheight, _rl_screenchars; + +/* Non-zero means the user wants to enable the keypad. */ +int _rl_enable_keypad; + +/* Non-zero means the user wants to enable a meta key. */ +int _rl_enable_meta = 1; + +#if defined (__EMX__) +static void +_emx_get_screensize (int *swp, int *shp) +{ + int sz[2]; + + _scrsize (sz); + + if (swp) + *swp = sz[0]; + if (shp) + *shp = sz[1]; +} +#endif + +#if defined (__MINGW32__) +static void +_win_get_screensize (int *swp, int *shp) +{ + HANDLE hConOut; + CONSOLE_SCREEN_BUFFER_INFO scr; + + hConOut = GetStdHandle (STD_OUTPUT_HANDLE); + if (hConOut != INVALID_HANDLE_VALUE) + { + if (GetConsoleScreenBufferInfo (hConOut, &scr)) + { + *swp = scr.dwSize.X; + *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1; + } + } +} +#endif + +/* Get readline's idea of the screen size. TTY is a file descriptor open + to the terminal. If IGNORE_ENV is true, we do not pay attention to the + values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being + non-null serve to check whether or not we have initialized termcap. */ +void +_rl_get_screen_size (int tty, int ignore_env) +{ + char *ss; +#if defined (TIOCGWINSZ) + struct winsize window_size; +#endif /* TIOCGWINSZ */ + int wr, wc; + + wr = wc = -1; +#if defined (TIOCGWINSZ) + if (ioctl (tty, TIOCGWINSZ, &window_size) == 0) + { + wc = (int) window_size.ws_col; + wr = (int) window_size.ws_row; + } +#endif /* TIOCGWINSZ */ + +#if defined (__EMX__) + _emx_get_screensize (&wc, &wr); +#elif defined (__MINGW32__) + _win_get_screensize (&wc, &wr); +#endif + + if (ignore_env || rl_prefer_env_winsize == 0) + { + _rl_screenwidth = wc; + _rl_screenheight = wr; + } + else + _rl_screenwidth = _rl_screenheight = -1; + + /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV + is unset. If we prefer the environment, check it first before + assigning the value returned by the kernel. */ + if (_rl_screenwidth <= 0) + { + if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS"))) + _rl_screenwidth = atoi (ss); + + if (_rl_screenwidth <= 0) + _rl_screenwidth = wc; + +#if defined (__DJGPP__) + if (_rl_screenwidth <= 0) + _rl_screenwidth = ScreenCols (); +#else + if (_rl_screenwidth <= 0 && term_string_buffer) + _rl_screenwidth = tgetnum ("co"); +#endif + } + + /* Environment variable LINES overrides setting of "li" if IGNORE_ENV + is unset. */ + if (_rl_screenheight <= 0) + { + if (ignore_env == 0 && (ss = sh_get_env_value ("LINES"))) + _rl_screenheight = atoi (ss); + + if (_rl_screenheight <= 0) + _rl_screenheight = wr; + +#if defined (__DJGPP__) + if (_rl_screenheight <= 0) + _rl_screenheight = ScreenRows (); +#else + if (_rl_screenheight <= 0 && term_string_buffer) + _rl_screenheight = tgetnum ("li"); +#endif + } + + /* If all else fails, default to 80x24 terminal. */ + if (_rl_screenwidth <= 1) + _rl_screenwidth = 80; + + if (_rl_screenheight <= 0) + _rl_screenheight = 24; + + /* If we're being compiled as part of bash, set the environment + variables $LINES and $COLUMNS to new values. Otherwise, just + do a pair of putenv () or setenv () calls. */ + if (rl_change_environment) + sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth); + + if (_rl_term_autowrap == 0) + _rl_screenwidth--; + + _rl_screenchars = _rl_screenwidth * _rl_screenheight; +} + +void +_rl_set_screen_size (int rows, int cols) +{ + if (_rl_term_autowrap == -1) + _rl_init_terminal_io (rl_terminal_name); + + if (rows > 0) + _rl_screenheight = rows; + if (cols > 0) + { + _rl_screenwidth = cols; + if (_rl_term_autowrap == 0) + _rl_screenwidth--; + } + + if (rows > 0 || cols > 0) + _rl_screenchars = _rl_screenwidth * _rl_screenheight; +} + +void +rl_set_screen_size (int rows, int cols) +{ + _rl_set_screen_size (rows, cols); +} + +void +rl_get_screen_size (int *rows, int *cols) +{ + if (rows) + *rows = _rl_screenheight; + if (cols) + *cols = _rl_screenwidth; +} + +void +rl_reset_screen_size (void) +{ + _rl_get_screen_size (fileno (rl_instream), 0); +} + +void +_rl_sigwinch_resize_terminal (void) +{ + _rl_get_screen_size (fileno (rl_instream), 1); +} + +void +rl_resize_terminal (void) +{ + int width, height; + + width = _rl_screenwidth; + height = _rl_screenheight; + _rl_get_screen_size (fileno (rl_instream), 1); + if (_rl_echoing_p && (width != _rl_screenwidth || height != _rl_screenheight)) + { + if (CUSTOM_REDISPLAY_FUNC ()) + rl_forced_update_display (); + else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0) + _rl_redisplay_after_sigwinch (); + } +} + +struct _tc_string { + const char * const tc_var; + char **tc_value; +}; + +/* This should be kept sorted, just in case we decide to change the + search algorithm to something smarter. */ +static const struct _tc_string tc_strings[] = +{ + { "@7", &_rl_term_at7 }, + { "DC", &_rl_term_DC }, + { "E3", &_rl_term_clrscroll }, + { "IC", &_rl_term_IC }, + { "ce", &_rl_term_clreol }, + { "cl", &_rl_term_clrpag }, + { "cr", &_rl_term_cr }, + { "dc", &_rl_term_dc }, + { "ei", &_rl_term_ei }, + { "ic", &_rl_term_ic }, + { "im", &_rl_term_im }, + { "kD", &_rl_term_kD }, /* delete */ + { "kH", &_rl_term_kH }, /* home down ?? */ + { "kI", &_rl_term_kI }, /* insert */ + { "kN", &_rl_term_kN }, /* page down */ + { "kP", &_rl_term_kP }, /* page up */ + { "kd", &_rl_term_kd }, + { "ke", &_rl_term_ke }, /* end keypad mode */ + { "kh", &_rl_term_kh }, /* home */ + { "kl", &_rl_term_kl }, + { "kr", &_rl_term_kr }, + { "ks", &_rl_term_ks }, /* start keypad mode */ + { "ku", &_rl_term_ku }, + { "le", &_rl_term_backspace }, + { "mm", &_rl_term_mm }, + { "mo", &_rl_term_mo }, + { "nd", &_rl_term_forward_char }, + { "pc", &_rl_term_pc }, + { "se", &_rl_term_se }, + { "so", &_rl_term_so }, + { "up", &_rl_term_up }, + { "vb", &_rl_visible_bell }, + { "vs", &_rl_term_vs }, + { "ve", &_rl_term_ve }, +}; + +#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string)) + +/* Read the desired terminal capability strings into BP. The capabilities + are described in the TC_STRINGS table. */ +static void +get_term_capabilities (char **bp) +{ +#if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */ + register int i; + + for (i = 0; i < NUM_TC_STRINGS; i++) + *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp); +#endif + tcap_initialized = 1; +} + +int +_rl_init_terminal_io (const char *terminal_name) +{ + const char *term; + char *buffer; + int tty, tgetent_ret, dumbterm, reset_region_colors; + + term = terminal_name ? terminal_name : sh_get_env_value ("TERM"); + _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = _rl_term_clrscroll = (char *)NULL; + tty = rl_instream ? fileno (rl_instream) : 0; + + if (term == 0) + term = "dumb"; + + dumbterm = STREQ (term, "dumb"); + + reset_region_colors = 1; + +#ifdef __MSDOS__ + _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; + _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; + _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; + _rl_term_mm = _rl_term_mo = (char *)NULL; + _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0; + _rl_term_cr = "\r"; + _rl_term_backspace = (char *)NULL; + _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL; + _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL; + _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL; + _rl_term_kN = _rl_term_kP = (char *)NULL; + _rl_term_so = _rl_term_se = (char *)NULL; +#if defined(HACK_TERMCAP_MOTION) + _rl_term_forward_char = (char *)NULL; +#endif + + _rl_get_screen_size (tty, 0); +#else /* !__MSDOS__ */ + /* I've separated this out for later work on not calling tgetent at all + if the calling application has supplied a custom redisplay function, + (and possibly if the application has supplied a custom input function). */ + if (CUSTOM_REDISPLAY_FUNC()) + { + tgetent_ret = -1; + } + else + { + if (term_string_buffer == 0) + term_string_buffer = (char *)xmalloc(2032); + + if (term_buffer == 0) + term_buffer = (char *)xmalloc(4080); + + buffer = term_string_buffer; + + tgetent_ret = tgetent (term_buffer, term); + } + + if (tgetent_ret != TGETENT_SUCCESS) + { + FREE (term_string_buffer); + FREE (term_buffer); + buffer = term_buffer = term_string_buffer = (char *)NULL; + + _rl_term_autowrap = 0; /* used by _rl_get_screen_size */ + + /* Allow calling application to set default height and width, using + rl_set_screen_size */ + if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) + { +#if defined (__EMX__) + _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); + _rl_screenwidth--; +#else /* !__EMX__ */ + _rl_get_screen_size (tty, 0); +#endif /* !__EMX__ */ + } + + /* Defaults. */ + if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) + { + _rl_screenwidth = 79; + _rl_screenheight = 24; + } + + /* Everything below here is used by the redisplay code (tputs). */ + _rl_screenchars = _rl_screenwidth * _rl_screenheight; + _rl_term_cr = "\r"; + _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; + _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; + _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; + _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL; + _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL; + _rl_term_kN = _rl_term_kP = (char *)NULL; + _rl_term_mm = _rl_term_mo = (char *)NULL; + _rl_term_ve = _rl_term_vs = (char *)NULL; + _rl_term_forward_char = (char *)NULL; + _rl_term_so = _rl_term_se = (char *)NULL; + _rl_terminal_can_insert = term_has_meta = 0; + + /* Assume generic unknown terminal can't handle the enable/disable + escape sequences */ + _rl_enable_bracketed_paste = 0; + + /* No terminal so/se capabilities. */ + _rl_enable_active_region = 0; + _rl_reset_region_color (0, NULL); + _rl_reset_region_color (1, NULL); + + /* Reasonable defaults for tgoto(). Readline currently only uses + tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we + change that later... */ + PC = '\0'; + BC = _rl_term_backspace = "\b"; + UP = _rl_term_up; + + return 0; + } + + get_term_capabilities (&buffer); + + /* Set up the variables that the termcap library expects the application + to provide. */ + PC = _rl_term_pc ? *_rl_term_pc : 0; + BC = _rl_term_backspace; + UP = _rl_term_up; + + if (_rl_term_cr == 0) + _rl_term_cr = "\r"; + + _rl_term_autowrap = TGETFLAG ("am") && TGETFLAG ("xn"); + + /* Allow calling application to set default height and width, using + rl_set_screen_size */ + if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) + _rl_get_screen_size (tty, 0); + + /* "An application program can assume that the terminal can do + character insertion if *any one of* the capabilities `IC', + `im', `ic' or `ip' is provided." But we can't do anything if + only `ip' is provided, so... */ + _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic); + + /* Check to see if this terminal has a meta key and clear the capability + variables if there is none. */ + term_has_meta = TGETFLAG ("km"); + if (term_has_meta == 0) + _rl_term_mm = _rl_term_mo = (char *)NULL; +#endif /* !__MSDOS__ */ + + /* Attempt to find and bind the arrow keys. Do not override already + bound keys in an overzealous attempt, however. */ + + bind_termcap_arrow_keys (emacs_standard_keymap); + +#if defined (VI_MODE) + bind_termcap_arrow_keys (vi_movement_keymap); + bind_termcap_arrow_keys (vi_insertion_keymap); +#endif /* VI_MODE */ + + /* There's no way to determine whether or not a given terminal supports + bracketed paste mode, so we assume a terminal named "dumb" does not. */ + if (dumbterm) + _rl_enable_bracketed_paste = _rl_enable_active_region = 0; + + if (reset_region_colors) + { + _rl_reset_region_color (0, _rl_term_so); + _rl_reset_region_color (1, _rl_term_se); + } + + return 0; +} + +/* Bind the arrow key sequences from the termcap description in MAP. */ +static void +bind_termcap_arrow_keys (Keymap map) +{ + Keymap xkeymap; + + xkeymap = _rl_keymap; + _rl_keymap = map; + + rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history); + rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history); + rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char); + rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char); + + rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */ + rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */ + + rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete); + rl_bind_keyseq_if_unbound (_rl_term_kI, rl_overwrite_mode); /* Insert */ + + rl_bind_keyseq_if_unbound (_rl_term_kN, rl_history_search_forward); /* Page Down */ + rl_bind_keyseq_if_unbound (_rl_term_kP, rl_history_search_backward); /* Page Up */ + + _rl_keymap = xkeymap; +} + +char * +rl_get_termcap (const char *cap) +{ + register int i; + + if (tcap_initialized == 0) + return ((char *)NULL); + for (i = 0; i < NUM_TC_STRINGS; i++) + { + if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0) + return *(tc_strings[i].tc_value); + } + return ((char *)NULL); +} + +/* Re-initialize the terminal considering that the TERM/TERMCAP variable + has changed. */ +int +rl_reset_terminal (const char *terminal_name) +{ + _rl_screenwidth = _rl_screenheight = 0; + _rl_init_terminal_io (terminal_name); + return 0; +} + +/* A function for the use of tputs () */ +#ifdef _MINIX +void +_rl_output_character_function (int c) +{ + putc (c, _rl_out_stream); +} +#else /* !_MINIX */ +int +_rl_output_character_function (int c) +{ + return putc (c, _rl_out_stream); +} +#endif /* !_MINIX */ + +/* Write COUNT characters from STRING to the output stream. */ +void +_rl_output_some_chars (const char *string, int count) +{ + fwrite (string, 1, count, _rl_out_stream); +} + +/* Move the cursor back. */ +int +_rl_backspace (int count) +{ + register int i; + +#ifndef __MSDOS__ + if (_rl_term_backspace) + for (i = 0; i < count; i++) + tputs (_rl_term_backspace, 1, _rl_output_character_function); + else +#endif + for (i = 0; i < count; i++) + putc ('\b', _rl_out_stream); + return 0; +} + +/* Move to the start of the next line. */ +int +rl_crlf (void) +{ +#if defined (NEW_TTY_DRIVER) || defined (__MINT__) + if (_rl_term_cr) + tputs (_rl_term_cr, 1, _rl_output_character_function); +#endif /* NEW_TTY_DRIVER || __MINT__ */ + putc ('\n', _rl_out_stream); + return 0; +} + +void +_rl_cr (void) +{ +#if defined (__MSDOS__) + putc ('\r', rl_outstream); +#else + tputs (_rl_term_cr, 1, _rl_output_character_function); +#endif +} + +/* Ring the terminal bell. */ +int +rl_ding (void) +{ + if (_rl_echoing_p) + { + switch (_rl_bell_preference) + { + case NO_BELL: + default: + break; + case VISIBLE_BELL: + if (_rl_visible_bell) + { +#ifdef __DJGPP__ + ScreenVisualBell (); +#else + tputs (_rl_visible_bell, 1, _rl_output_character_function); +#endif + break; + } + /* FALLTHROUGH */ + case AUDIBLE_BELL: + fprintf (stderr, "\007"); + fflush (stderr); + break; + } + return (0); + } + return (-1); +} + +/* **************************************************************** */ +/* */ +/* Entering and leaving terminal standout mode */ +/* */ +/* **************************************************************** */ + +void +_rl_standout_on (void) +{ +#ifndef __MSDOS__ + if (_rl_term_so && _rl_term_se) + tputs (_rl_term_so, 1, _rl_output_character_function); +#endif +} + +void +_rl_standout_off (void) +{ +#ifndef __MSDOS__ + if (_rl_term_so && _rl_term_se) + tputs (_rl_term_se, 1, _rl_output_character_function); +#endif +} + +/* **************************************************************** */ +/* */ +/* Controlling color for a portion of the line */ +/* */ +/* **************************************************************** */ + +/* Reset the region color variables to VALUE depending on WHICH (0 == start, + 1 == end). This is where all the memory allocation for the color variable + strings is performed. We might want to pass a flag saying whether or not + to translate VALUE like a key sequence, but it doesn't really matter. */ +int +_rl_reset_region_color (int which, const char *value) +{ + int len; + + if (which == 0) + { + xfree (_rl_active_region_start_color); + if (value && *value) + { + _rl_active_region_start_color = (char *)xmalloc (2 * strlen (value) + 1); + rl_translate_keyseq (value, _rl_active_region_start_color, &len); + _rl_active_region_start_color[len] = '\0'; + } + else + _rl_active_region_start_color = NULL; + } + else + { + xfree (_rl_active_region_end_color); + if (value && *value) + { + _rl_active_region_end_color = (char *)xmalloc (2 * strlen (value) + 1); + rl_translate_keyseq (value, _rl_active_region_end_color, &len); + _rl_active_region_end_color[len] = '\0'; + } + else + _rl_active_region_end_color = NULL; + } + + return 0; +} + +void +_rl_region_color_on (void) +{ +#ifndef __MSDOS__ + if (_rl_active_region_start_color && _rl_active_region_end_color) + tputs (_rl_active_region_start_color, 1, _rl_output_character_function); +#endif +} + +void +_rl_region_color_off (void) +{ +#ifndef __MSDOS__ + if (_rl_active_region_start_color && _rl_active_region_end_color) + tputs (_rl_active_region_end_color, 1, _rl_output_character_function); +#endif +} + +/* **************************************************************** */ +/* */ +/* Controlling the Meta Key and Keypad */ +/* */ +/* **************************************************************** */ + +static int enabled_meta = 0; /* flag indicating we enabled meta mode */ + +void +_rl_enable_meta_key (void) +{ +#if !defined (__DJGPP__) + if (term_has_meta && _rl_term_mm) + { + tputs (_rl_term_mm, 1, _rl_output_character_function); + enabled_meta = 1; + } +#endif +} + +void +_rl_disable_meta_key (void) +{ +#if !defined (__DJGPP__) + if (term_has_meta && _rl_term_mo && enabled_meta) + { + tputs (_rl_term_mo, 1, _rl_output_character_function); + enabled_meta = 0; + } +#endif +} + +void +_rl_control_keypad (int on) +{ +#if !defined (__DJGPP__) + if (on && _rl_term_ks) + tputs (_rl_term_ks, 1, _rl_output_character_function); + else if (!on && _rl_term_ke) + tputs (_rl_term_ke, 1, _rl_output_character_function); +#endif +} + +/* **************************************************************** */ +/* */ +/* Controlling the Cursor */ +/* */ +/* **************************************************************** */ + +/* Set the cursor appropriately depending on IM, which is one of the + insert modes (insert or overwrite). Insert mode gets the normal + cursor. Overwrite mode gets a very visible cursor. Only does + anything if we have both capabilities. */ +void +_rl_set_cursor (int im, int force) +{ +#ifndef __MSDOS__ + if (_rl_term_ve && _rl_term_vs) + { + if (force || im != rl_insert_mode) + { + if (im == RL_IM_OVERWRITE) + tputs (_rl_term_vs, 1, _rl_output_character_function); + else + tputs (_rl_term_ve, 1, _rl_output_character_function); + } + } +#endif +} diff --git a/text.c b/text.c new file mode 100644 index 0000000..91c3f33 --- /dev/null +++ b/text.c @@ -0,0 +1,1888 @@ +/* text.c -- text handling commands for readline. */ + +/* Copyright (C) 1987-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#if defined (__EMX__) +# define INCL_DOSPROCESS +# include +#endif /* __EMX__ */ + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +/* Forward declarations. */ +static int rl_change_case (int, int); +static int _rl_char_search (int, int, int); + +#if defined (READLINE_CALLBACKS) +static int _rl_insert_next_callback (_rl_callback_generic_arg *); +static int _rl_char_search_callback (_rl_callback_generic_arg *); +#endif + +/* The largest chunk of text that can be inserted in one call to + rl_insert_text. Text blocks larger than this are divided. */ +#define TEXT_COUNT_MAX 1024 + +int _rl_optimize_typeahead = 1; /* rl_insert tries to read typeahead */ + +/* **************************************************************** */ +/* */ +/* Insert and Delete */ +/* */ +/* **************************************************************** */ + +/* Insert a string of text into the line at point. This is the only + way that you should do insertion. _rl_insert_char () calls this + function. Returns the number of characters inserted. */ +int +rl_insert_text (const char *string) +{ + register int i, l; + + l = (string && *string) ? strlen (string) : 0; + if (l == 0) + return 0; + + if (rl_end + l >= rl_line_buffer_len) + rl_extend_line_buffer (rl_end + l); + + for (i = rl_end; i >= rl_point; i--) + rl_line_buffer[i + l] = rl_line_buffer[i]; + + strncpy (rl_line_buffer + rl_point, string, l); + + /* Remember how to undo this if we aren't undoing something. */ + if (_rl_doing_an_undo == 0) + { + /* If possible and desirable, concatenate the undos. */ + if ((l == 1) && + rl_undo_list && + (rl_undo_list->what == UNDO_INSERT) && + (rl_undo_list->end == rl_point) && + (rl_undo_list->end - rl_undo_list->start < 20)) + rl_undo_list->end++; + else + rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL); + } + rl_point += l; + rl_end += l; + rl_line_buffer[rl_end] = '\0'; + return l; +} + +/* Delete the string between FROM and TO. FROM is inclusive, TO is not. + Returns the number of characters deleted. */ +int +rl_delete_text (int from, int to) +{ + register char *text; + register int diff, i; + + /* Fix it if the caller is confused. */ + if (from > to) + SWAP (from, to); + + /* fix boundaries */ + if (to > rl_end) + { + to = rl_end; + if (from > to) + from = to; + } + if (from < 0) + from = 0; + + text = rl_copy_text (from, to); + + /* Some versions of strncpy() can't handle overlapping arguments. */ + diff = to - from; + for (i = from; i < rl_end - diff; i++) + rl_line_buffer[i] = rl_line_buffer[i + diff]; + + /* Remember how to undo this delete. */ + if (_rl_doing_an_undo == 0) + rl_add_undo (UNDO_DELETE, from, to, text); + else + xfree (text); + + rl_end -= diff; + rl_line_buffer[rl_end] = '\0'; + _rl_fix_mark (); + 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 (int fix_mark_too) +{ + _RL_FIX_POINT (rl_point); + if (fix_mark_too) + _RL_FIX_POINT (rl_mark); +} + +void +_rl_fix_mark (void) +{ + _RL_FIX_POINT (rl_mark); +} +#undef _RL_FIX_POINT + +/* Replace the contents of the line buffer between START and END with + TEXT. The operation is undoable. To replace the entire line in an + undoable mode, use _rl_replace_text(text, 0, rl_end); */ +int +_rl_replace_text (const char *text, int start, int end) +{ + int n; + + n = 0; + rl_begin_undo_group (); + if (start <= end) + rl_delete_text (start, end + 1); + rl_point = start; + if (*text) + n = rl_insert_text (text); + rl_end_undo_group (); + + return n; +} + +/* Replace the current line buffer contents with TEXT. If CLEAR_UNDO is + non-zero, we free the current undo list. */ +void +rl_replace_line (const char *text, int clear_undo) +{ + int len; + + len = strlen (text); + if (len >= rl_line_buffer_len) + rl_extend_line_buffer (len); + strcpy (rl_line_buffer, text); + rl_end = len; + + if (clear_undo) + rl_free_undo_list (); + + _rl_fix_point (1); +} + +/* **************************************************************** */ +/* */ +/* Readline character functions */ +/* */ +/* **************************************************************** */ + +/* This is not a gap editor, just a stupid line input routine. No hair + is involved in writing any of the functions, and none should be. */ + +/* Note that: + + rl_end is the place in the string that we would place '\0'; + i.e., it is always safe to place '\0' there. + + rl_point is the place in the string where the cursor is. Sometimes + this is the same as rl_end. + + Any command that is called interactively receives two arguments. + The first is a count: the numeric arg passed to this command. + The second is the key which invoked this command. +*/ + +/* **************************************************************** */ +/* */ +/* Movement Commands */ +/* */ +/* **************************************************************** */ + +/* Note that if you `optimize' the display for these functions, you cannot + use said functions in other functions which do not do optimizing display. + I.e., you will have to update the data base for rl_redisplay, and you + might as well let rl_redisplay do that job. */ + +/* Move forward COUNT bytes. */ +int +rl_forward_byte (int count, int key) +{ + if (count < 0) + return (rl_backward_byte (-count, key)); + + if (count > 0) + { + int end, lend; + + end = rl_point + count; +#if defined (VI_MODE) + lend = rl_end > 0 ? rl_end - (VI_COMMAND_MODE()) : rl_end; +#else + lend = rl_end; +#endif + + if (end > lend) + { + rl_point = lend; + rl_ding (); + } + else + rl_point = end; + } + + if (rl_end < 0) + rl_end = 0; + + return 0; +} + +int +_rl_forward_char_internal (int count) +{ + int point; + +#if defined (HANDLE_MULTIBYTE) + point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); + +#if defined (VI_MODE) + if (point >= rl_end && VI_COMMAND_MODE()) + point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO); +#endif + + if (rl_end < 0) + rl_end = 0; +#else + point = rl_point + count; +#endif + + if (point > rl_end) + point = rl_end; + return (point); +} + +int +_rl_backward_char_internal (int count) +{ + int point; + + point = rl_point; +#if defined (HANDLE_MULTIBYTE) + if (count > 0) + { + while (count > 0 && point > 0) + { + point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO); + count--; + } + if (count > 0) + return 0; /* XXX - rl_ding() here? */ + } +#else + if (count > 0) + point -= count; +#endif + + if (point < 0) + point = 0; + return (point); +} + +#if defined (HANDLE_MULTIBYTE) +/* Move forward COUNT characters. */ +int +rl_forward_char (int count, int key) +{ + int point; + + if (MB_CUR_MAX == 1 || rl_byte_oriented) + return (rl_forward_byte (count, key)); + + if (count < 0) + return (rl_backward_char (-count, key)); + + if (count > 0) + { + if (rl_point == rl_end && EMACS_MODE()) + { + rl_ding (); + return 0; + } + + point = _rl_forward_char_internal (count); + + if (rl_point == point) + rl_ding (); + + rl_point = point; + } + + return 0; +} +#else /* !HANDLE_MULTIBYTE */ +int +rl_forward_char (int count, int key) +{ + return (rl_forward_byte (count, key)); +} +#endif /* !HANDLE_MULTIBYTE */ + +/* Backwards compatibility. */ +int +rl_forward (int count, int key) +{ + return (rl_forward_char (count, key)); +} + +/* Move backward COUNT bytes. */ +int +rl_backward_byte (int count, int key) +{ + if (count < 0) + return (rl_forward_byte (-count, key)); + + if (count > 0) + { + if (rl_point < count) + { + rl_point = 0; + rl_ding (); + } + else + rl_point -= count; + } + + if (rl_point < 0) + rl_point = 0; + + return 0; +} + +#if defined (HANDLE_MULTIBYTE) +/* Move backward COUNT characters. */ +int +rl_backward_char (int count, int key) +{ + int point; + + if (MB_CUR_MAX == 1 || rl_byte_oriented) + return (rl_backward_byte (count, key)); + + if (count < 0) + return (rl_forward_char (-count, key)); + + if (count > 0) + { + point = rl_point; + + while (count > 0 && point > 0) + { + point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO); + count--; + } + if (count > 0) + { + rl_point = 0; + rl_ding (); + } + else + rl_point = point; + } + + return 0; +} +#else +int +rl_backward_char (int count, int key) +{ + return (rl_backward_byte (count, key)); +} +#endif + +/* Backwards compatibility. */ +int +rl_backward (int count, int key) +{ + return (rl_backward_char (count, key)); +} + +/* Move to the beginning of the line. */ +int +rl_beg_of_line (int count, int key) +{ + rl_point = 0; + return 0; +} + +/* Move to the end of the line. */ +int +rl_end_of_line (int count, int key) +{ + rl_point = rl_end; + return 0; +} + +/* Move forward a word. We do what Emacs does. Handles multibyte chars. */ +int +rl_forward_word (int count, int key) +{ + int c; + + if (count < 0) + return (rl_backward_word (-count, key)); + + while (count) + { + if (rl_point > rl_end) + rl_point = rl_end; + if (rl_point == rl_end) + return 0; + + /* If we are not in a word, move forward until we are in one. + Then, move forward until we hit a non-alphabetic character. */ + c = _rl_char_value (rl_line_buffer, rl_point); + + if (_rl_walphabetic (c) == 0) + { + rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + while (rl_point < rl_end) + { + c = _rl_char_value (rl_line_buffer, rl_point); + if (_rl_walphabetic (c)) + break; + rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + } + } + + if (rl_point > rl_end) + rl_point = rl_end; + if (rl_point == rl_end) + return 0; + + rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + while (rl_point < rl_end) + { + c = _rl_char_value (rl_line_buffer, rl_point); + if (_rl_walphabetic (c) == 0) + break; + rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + } + + --count; + } + + return 0; +} + +/* Move backward a word. We do what Emacs does. Handles multibyte chars. */ +int +rl_backward_word (int count, int key) +{ + int c, p; + + if (count < 0) + return (rl_forward_word (-count, key)); + + while (count) + { + if (rl_point == 0) + return 0; + + /* Like rl_forward_word (), except that we look at the characters + just before point. */ + + p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); + c = _rl_char_value (rl_line_buffer, p); + + if (_rl_walphabetic (c) == 0) + { + rl_point = p; + while (rl_point > 0) + { + p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); + c = _rl_char_value (rl_line_buffer, p); + if (_rl_walphabetic (c)) + break; + rl_point = p; + } + } + + while (rl_point) + { + p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); + c = _rl_char_value (rl_line_buffer, p); + if (_rl_walphabetic (c) == 0) + break; + else + rl_point = p; + } + + --count; + } + + return 0; +} + +/* Clear the current line. Numeric argument to C-l does this. */ +int +rl_refresh_line (int ignore1, int ignore2) +{ + _rl_refresh_line (); + 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 (int count, int key) +{ + if (rl_explicit_arg) + { + rl_refresh_line (count, key); + return 0; + } + + _rl_clear_screen (0); /* calls termcap function to clear screen */ + rl_keep_mark_active (); + rl_forced_update_display (); + rl_display_fixed = 1; + + return 0; +} + +int +rl_clear_display (int count, int key) +{ + _rl_clear_screen (1); /* calls termcap function to clear screen and scrollback buffer */ + rl_forced_update_display (); + rl_display_fixed = 1; + + return 0; +} + +int +rl_previous_screen_line (int count, int key) +{ + int c; + + c = _rl_term_autowrap ? _rl_screenwidth : (_rl_screenwidth + 1); + return (rl_backward_char (c, key)); +} + +int +rl_next_screen_line (int count, int key) +{ + int c; + + c = _rl_term_autowrap ? _rl_screenwidth : (_rl_screenwidth + 1); + return (rl_forward_char (c, key)); +} + +int +rl_skip_csi_sequence (int count, int key) +{ + int ch; + + RL_SETSTATE (RL_STATE_MOREINPUT); + do + ch = rl_read_key (); + while (ch >= 0x20 && ch < 0x40); + RL_UNSETSTATE (RL_STATE_MOREINPUT); + + return (ch < 0); +} + +int +rl_arrow_keys (int count, int key) +{ + int ch; + + RL_SETSTATE(RL_STATE_MOREINPUT); + ch = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + if (ch < 0) + return (1); + + switch (_rl_to_upper (ch)) + { + case 'A': + rl_get_previous_history (count, ch); + break; + + case 'B': + rl_get_next_history (count, ch); + break; + + case 'C': + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_forward_char (count, ch); + else + rl_forward_byte (count, ch); + break; + + case 'D': + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_backward_char (count, ch); + else + rl_backward_byte (count, ch); + break; + + default: + rl_ding (); + } + + return 0; +} + +/* **************************************************************** */ +/* */ +/* Text commands */ +/* */ +/* **************************************************************** */ + +#ifdef HANDLE_MULTIBYTE +static char pending_bytes[MB_LEN_MAX]; +static int pending_bytes_length = 0; +static mbstate_t ps = {0}; +#endif + +/* Insert the character C at the current location, moving point forward. + If C introduces a multibyte sequence, we read the whole sequence and + then insert the multibyte char into the line buffer. */ +int +_rl_insert_char (int count, int c) +{ + register int i; + char *string; +#ifdef HANDLE_MULTIBYTE + int string_size; + char incoming[MB_LEN_MAX + 1]; + int incoming_length = 0; + mbstate_t ps_back; + static int stored_count = 0; +#endif + + if (count <= 0) + return 0; + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + incoming[0] = c; + incoming[1] = '\0'; + incoming_length = 1; + } + else if (_rl_utf8locale && (c & 0x80) == 0) + { + incoming[0] = c; + incoming[1] = '\0'; + incoming_length = 1; + } + else + { + WCHAR_T wc; + size_t ret; + + if (stored_count <= 0) + stored_count = count; + else + count = stored_count; + + ps_back = ps; + pending_bytes[pending_bytes_length++] = c; + ret = MBRTOWC (&wc, pending_bytes, pending_bytes_length, &ps); + + if (ret == (size_t)-2) + { + /* Bytes too short to compose character, try to wait for next byte. + Restore the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + ps = ps_back; + return 1; + } + else if (ret == (size_t)-1) + { + /* Invalid byte sequence for the current locale. Treat first byte + as a single character. */ + incoming[0] = pending_bytes[0]; + incoming[1] = '\0'; + incoming_length = 1; + pending_bytes_length--; + memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (ret == (size_t)0) + { + incoming[0] = '\0'; + incoming_length = 0; + pending_bytes_length--; + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (ret == 1) + { + incoming[0] = pending_bytes[0]; + incoming[incoming_length = 1] = '\0'; + pending_bytes_length = 0; + } + else + { + /* We successfully read a single multibyte character. */ + memcpy (incoming, pending_bytes, pending_bytes_length); + incoming[pending_bytes_length] = '\0'; + incoming_length = pending_bytes_length; + pending_bytes_length = 0; + } + } +#endif /* HANDLE_MULTIBYTE */ + + /* If we can optimize, then do it. But don't let people crash + readline because of extra large arguments. */ + if (count > 1 && count <= TEXT_COUNT_MAX) + { +#if defined (HANDLE_MULTIBYTE) + string_size = count * incoming_length; + string = (char *)xmalloc (1 + string_size); + + i = 0; + while (i < string_size) + { + if (incoming_length == 1) + string[i++] = *incoming; + else + { + strncpy (string + i, incoming, incoming_length); + i += incoming_length; + } + } + incoming_length = 0; + stored_count = 0; +#else /* !HANDLE_MULTIBYTE */ + string = (char *)xmalloc (1 + count); + + for (i = 0; i < count; i++) + string[i] = c; +#endif /* !HANDLE_MULTIBYTE */ + + string[i] = '\0'; + rl_insert_text (string); + xfree (string); + + return 0; + } + + if (count > TEXT_COUNT_MAX) + { + int decreaser; +#if defined (HANDLE_MULTIBYTE) + string_size = incoming_length * TEXT_COUNT_MAX; + string = (char *)xmalloc (1 + string_size); + + i = 0; + while (i < string_size) + { + if (incoming_length == 1) + string[i++] = *incoming; + else + { + strncpy (string + i, incoming, incoming_length); + i += incoming_length; + } + } + + while (count) + { + decreaser = (count > TEXT_COUNT_MAX) ? TEXT_COUNT_MAX : count; + string[decreaser*incoming_length] = '\0'; + rl_insert_text (string); + count -= decreaser; + } + + xfree (string); + incoming_length = 0; + stored_count = 0; +#else /* !HANDLE_MULTIBYTE */ + char str[TEXT_COUNT_MAX+1]; + + for (i = 0; i < TEXT_COUNT_MAX; i++) + str[i] = c; + + while (count) + { + decreaser = (count > TEXT_COUNT_MAX ? TEXT_COUNT_MAX : count); + str[decreaser] = '\0'; + rl_insert_text (str); + count -= decreaser; + } +#endif /* !HANDLE_MULTIBYTE */ + + return 0; + } + + if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + /* We are inserting a single character. + If there is pending input, then make a string of all of the + pending characters that are bound to rl_insert, and insert + them all. Don't do this if we're current reading input from + a macro. */ + if ((RL_ISSTATE (RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available ()) + _rl_insert_typein (c); + else + { + /* Inserting a single character. */ + char str[2]; + + str[1] = '\0'; + str[0] = c; + rl_insert_text (str); + } + } +#if defined (HANDLE_MULTIBYTE) + else + { + rl_insert_text (incoming); + stored_count = 0; + } +#endif + + return 0; +} + +/* Overwrite the character at point (or next COUNT characters) with C. + If C introduces a multibyte character sequence, read the entire sequence + before starting the overwrite loop. */ +int +_rl_overwrite_char (int count, int c) +{ + int i; +#if defined (HANDLE_MULTIBYTE) + char mbkey[MB_LEN_MAX]; + int k; + + /* Read an entire multibyte character sequence to insert COUNT times. */ + k = 1; + if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) + k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX); + if (k < 0) + return 1; +#endif + + rl_begin_undo_group (); + + for (i = 0; i < count; i++) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_insert_text (mbkey); + else +#endif + _rl_insert_char (1, c); + + if (rl_point < rl_end) + rl_delete (1, c); + } + + rl_end_undo_group (); + + return 0; +} + +int +rl_insert (int count, int c) +{ + int r, n, x; + + r = (rl_insert_mode == RL_IM_INSERT) ? _rl_insert_char (count, c) : _rl_overwrite_char (count, c); + + /* XXX -- attempt to batch-insert pending input that maps to self-insert */ + x = 0; + n = (unsigned short)-2; + while (_rl_optimize_typeahead && + rl_num_chars_to_read == 0 && + (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && + _rl_pushed_input_available () == 0 && + _rl_input_queued (0) && + (n = rl_read_key ()) > 0 && + _rl_keymap[(unsigned char)n].type == ISFUNC && + _rl_keymap[(unsigned char)n].function == rl_insert) + { + r = (rl_insert_mode == RL_IM_INSERT) ? _rl_insert_char (1, n) : _rl_overwrite_char (1, n); + /* _rl_insert_char keeps its own set of pending characters to compose a + complete multibyte character, and only returns 1 if it sees a character + that's part of a multibyte character but too short to complete one. We + can try to read another character in the hopes that we will get the + next one or just punt. Right now we try to read another character. + We don't want to call rl_insert_next if _rl_insert_char has already + stored the character in the pending_bytes array because that will + result in doubled input. */ + n = (unsigned short)-2; + x++; /* count of bytes of typeahead read, currently unused */ + if (r == 1) /* read partial multibyte character */ + continue; + if (rl_done || r != 0) + break; + } + + if (n != (unsigned short)-2) /* -2 = sentinel value for having inserted N */ + { + /* setting rl_pending_input inhibits setting rl_last_func so we do it + ourselves here */ + rl_last_func = rl_insert; + _rl_reset_argument (); + rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; + r = rl_execute_next (n); + } + + return r; +} + +/* Insert the next typed character verbatim. */ +static int +_rl_insert_next (int count) +{ + int c; + + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (c < 0) + return 1; + + if (RL_ISSTATE (RL_STATE_MACRODEF)) + _rl_add_macro_char (c); + +#if defined (HANDLE_SIGNALS) + if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) + _rl_restore_tty_signals (); +#endif + + return (_rl_insert_char (count, c)); +} + +#if defined (READLINE_CALLBACKS) +static int +_rl_insert_next_callback (_rl_callback_generic_arg *data) +{ + int count, r; + + count = data->count; + r = 0; + + if (count < 0) + { + data->count++; + r = _rl_insert_next (1); + _rl_want_redisplay = 1; + /* If we should keep going, leave the callback function installed */ + if (data->count < 0 && r == 0) + return r; + count = 0; /* data->count == 0 || r != 0; force break below */ + } + + /* Deregister function, let rl_callback_read_char deallocate data */ + _rl_callback_func = 0; + _rl_want_redisplay = 1; + + if (count == 0) + return r; + + return _rl_insert_next (count); +} +#endif + +int +rl_quoted_insert (int count, int key) +{ + /* Let's see...should the callback interface futz with signal handling? */ +#if defined (HANDLE_SIGNALS) + if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) + _rl_disable_tty_signals (); +#endif + +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_callback_data = _rl_callback_data_alloc (count); + _rl_callback_func = _rl_insert_next_callback; + return (0); + } +#endif + + /* A negative count means to quote the next -COUNT characters. */ + if (count < 0) + { + int r; + + do + r = _rl_insert_next (1); + while (r == 0 && ++count < 0); + return r; + } + + return _rl_insert_next (count); +} + +/* Insert a tab character. */ +int +rl_tab_insert (int count, int key) +{ + return (_rl_insert_char (count, '\t')); +} + +/* What to do when a NEWLINE is pressed. We accept the whole line. + KEY is the key that invoked this command. I guess it could have + meaning in the future. */ +int +rl_newline (int count, int key) +{ + if (rl_mark_active_p ()) + { + rl_deactivate_mark (); + (*rl_redisplay_function) (); + _rl_want_redisplay = 0; + } + + rl_done = 1; + + if (_rl_history_preserve_point) + _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; + + RL_SETSTATE(RL_STATE_DONE); + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + { + _rl_vi_done_inserting (); + if (_rl_vi_textmod_command (_rl_vi_last_command) == 0) /* XXX */ + _rl_vi_reset_last (); + } +#endif /* VI_MODE */ + + /* If we've been asked to erase empty lines, suppress the final update, + since _rl_update_final calls rl_crlf(). */ + if (rl_erase_empty_line && rl_point == 0 && rl_end == 0) + return 0; + + if (_rl_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 (int ignore1, int ignore2) +{ + return 99999; /* prevent from being combined with _rl_null_function */ +} + +/* This is different from what vi does, so the code's not shared. Emacs + rubout in overwrite mode has one oddity: it replaces a control + character that's displayed as two characters (^X) with two spaces. */ +int +_rl_overwrite_rubout (int count, int key) +{ + int opoint; + int i, l; + + if (rl_point == 0) + { + rl_ding (); + return 1; + } + + opoint = rl_point; + + /* L == number of spaces to insert */ + for (i = l = 0; i < count; i++) + { + rl_backward_char (1, key); + l += rl_character_len (rl_line_buffer[rl_point], rl_point); /* not exactly right */ + } + + rl_begin_undo_group (); + + if (count > 1 || rl_explicit_arg) + rl_kill_text (opoint, rl_point); + else + rl_delete_text (opoint, rl_point); + + /* Emacs puts point at the beginning of the sequence of spaces. */ + if (rl_point < rl_end) + { + opoint = rl_point; + _rl_insert_char (l, ' '); + rl_point = opoint; + } + + rl_end_undo_group (); + + return 0; +} + +/* Rubout the character behind point. */ +int +rl_rubout (int count, int key) +{ + if (count < 0) + return (rl_delete (-count, key)); + + if (!rl_point) + { + rl_ding (); + return 1; + } + + if (rl_insert_mode == RL_IM_OVERWRITE) + return (_rl_overwrite_rubout (count, key)); + + return (_rl_rubout_char (count, key)); +} + +int +_rl_rubout_char (int count, int key) +{ + int orig_point; + unsigned char c; + + /* Duplicated code because this is called from other parts of the library. */ + if (count < 0) + return (rl_delete (-count, key)); + + if (rl_point == 0) + { + rl_ding (); + return 1; + } + + orig_point = rl_point; + if (count > 1 || rl_explicit_arg) + { + rl_backward_char (count, key); + rl_kill_text (orig_point, rl_point); + } + else if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + c = rl_line_buffer[--rl_point]; + rl_delete_text (rl_point, orig_point); + /* The erase-at-end-of-line hack is of questionable merit now. */ + if (rl_point == rl_end && ISPRINT ((unsigned char)c) && _rl_last_c_pos) + { + int l; + l = rl_character_len (c, rl_point); + _rl_erase_at_end_of_line (l); + } + } + else + { + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + rl_delete_text (rl_point, orig_point); + } + + return 0; +} + +/* Delete the character under the cursor. Given a numeric argument, + kill that many characters instead. */ +int +rl_delete (int count, int key) +{ + int xpoint; + + if (count < 0) + return (_rl_rubout_char (-count, key)); + + if (rl_point == rl_end) + { + rl_ding (); + return 1; + } + + if (count > 1 || rl_explicit_arg) + { + xpoint = rl_point; + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_forward_char (count, key); + else + rl_forward_byte (count, key); + + rl_kill_text (xpoint, rl_point); + rl_point = xpoint; + } + else + { + xpoint = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + rl_delete_text (rl_point, xpoint); + } + return 0; +} + +/* Delete the character under the cursor, unless the insertion + point is at the end of the line, in which case the character + behind the cursor is deleted. COUNT is obeyed and may be used + to delete forward or backward that many characters. */ +int +rl_rubout_or_delete (int count, int key) +{ + if (rl_end != 0 && rl_point == rl_end) + return (_rl_rubout_char (count, key)); + else + return (rl_delete (count, key)); +} + +/* Delete all spaces and tabs around point. */ +int +rl_delete_horizontal_space (int count, int ignore) +{ + int start; + + while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) + rl_point--; + + start = rl_point; + + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + rl_point++; + + if (start != rl_point) + { + rl_delete_text (start, rl_point); + rl_point = start; + } + + if (rl_point < 0) + rl_point = 0; + + return 0; +} + +/* Like the tcsh editing function delete-char-or-list. The eof character + is caught before this is invoked, so this really does the same thing as + delete-char-or-list-or-eof, as long as it's bound to the eof character. */ +int +rl_delete_or_show_completions (int count, int 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 (int count, int key) +{ + char *rl_comment_text; + int rl_comment_len; + + rl_beg_of_line (1, key); + rl_comment_text = _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT; + + if (rl_explicit_arg == 0) + rl_insert_text (rl_comment_text); + else + { + rl_comment_len = strlen (rl_comment_text); + if (STREQN (rl_comment_text, rl_line_buffer, rl_comment_len)) + rl_delete_text (rl_point, rl_point + rl_comment_len); + else + rl_insert_text (rl_comment_text); + } + + (*rl_redisplay_function) (); + rl_newline (1, '\n'); + + return (0); +} + +/* **************************************************************** */ +/* */ +/* Changing Case */ +/* */ +/* **************************************************************** */ + +/* The three kinds of things that we know how to do. */ +#define UpCase 1 +#define DownCase 2 +#define CapCase 3 + +/* Uppercase the word at point. */ +int +rl_upcase_word (int count, int key) +{ + return (rl_change_case (count, UpCase)); +} + +/* Lowercase the word at point. */ +int +rl_downcase_word (int count, int key) +{ + return (rl_change_case (count, DownCase)); +} + +/* Upcase the first letter, downcase the rest. */ +int +rl_capitalize_word (int count, int 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 (int count, int op) +{ + int start, next, end; + int inword, nc, nop; + WCHAR_T c; +#if defined (HANDLE_MULTIBYTE) + WCHAR_T wc, nwc; + char mb[MB_LEN_MAX+1]; + int mlen; + size_t m; + mbstate_t mps; +#endif + + start = rl_point; + rl_forward_word (count, 0); + end = rl_point; + + if (op != UpCase && op != DownCase && op != CapCase) + { + rl_ding (); + return 1; + } + + if (count < 0) + SWAP (start, end); + +#if defined (HANDLE_MULTIBYTE) + memset (&mps, 0, sizeof (mbstate_t)); +#endif + + /* We are going to modify some text, so let's prepare to undo it. */ + rl_modifying (start, end); + + inword = 0; + while (start < end) + { + c = _rl_char_value (rl_line_buffer, start); + /* This assumes that the upper and lower case versions are the same width. */ + next = MB_NEXTCHAR (rl_line_buffer, start, 1, MB_FIND_NONZERO); + + if (_rl_walphabetic (c) == 0) + { + inword = 0; + start = next; + continue; + } + + if (op == CapCase) + { + nop = inword ? DownCase : UpCase; + inword = 1; + } + else + nop = op; + /* Can't check isascii here; some languages (e.g, Turkish) have + multibyte upper and lower case equivalents of single-byte ascii + characters */ + if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + nc = (nop == UpCase) ? _rl_to_upper (c) : _rl_to_lower (c); + rl_line_buffer[start] = nc; + } +#if defined (HANDLE_MULTIBYTE) + else + { + m = MBRTOWC (&wc, rl_line_buffer + start, end - start, &mps); + if (MB_INVALIDCH (m)) + wc = (WCHAR_T)rl_line_buffer[start]; + else if (MB_NULLWCH (m)) + wc = L'\0'; + nwc = (nop == UpCase) ? _rl_to_wupper (wc) : _rl_to_wlower (wc); + if (nwc != wc) /* just skip unchanged characters */ + { + char *s, *e; + mbstate_t ts; + + memset (&ts, 0, sizeof (mbstate_t)); + mlen = WCRTOMB (mb, nwc, &ts); + if (mlen < 0) + { + nwc = wc; + memset (&ts, 0, sizeof (mbstate_t)); + mlen = WCRTOMB (mb, nwc, &ts); + if (mlen < 0) /* should not happen */ + strncpy (mb, rl_line_buffer + start, mlen = m); + } + if (mlen > 0) + mb[mlen] = '\0'; + /* what to do if m != mlen? adjust below */ + /* m == length of old char, mlen == length of new char */ + s = rl_line_buffer + start; + e = rl_line_buffer + rl_end; + if (m == mlen) + memcpy (s, mb, mlen); + else if (m > mlen) + { + memcpy (s, mb, mlen); + memmove (s + mlen, s + m, (e - s) - m); + next -= m - mlen; /* next char changes */ + end -= m - mlen; /* end of word changes */ + rl_end -= m - mlen; /* end of line changes */ + rl_line_buffer[rl_end] = 0; + } + else if (m < mlen) + { + rl_extend_line_buffer (rl_end + mlen + (e - s) - m + 2); + s = rl_line_buffer + start; /* have to redo this */ + e = rl_line_buffer + rl_end; + memmove (s + mlen, s + m, (e - s) - m); + memcpy (s, mb, mlen); + next += mlen - m; /* next char changes */ + end += mlen - m; /* end of word changes */ + rl_end += mlen - m; /* end of line changes */ + rl_line_buffer[rl_end] = 0; + } + } + } +#endif + + start = next; + } + + rl_point = end; + return 0; +} + +/* **************************************************************** */ +/* */ +/* Transposition */ +/* */ +/* **************************************************************** */ + +/* Transpose the words at point. If point is at the end of the line, + transpose the two words before point. */ +int +rl_transpose_words (int count, int key) +{ + char *word1, *word2; + int w1_beg, w1_end, w2_beg, w2_end; + int orig_point, orig_end; + + orig_point = rl_point; + orig_end = rl_end; + + if (!count) + return 0; + + /* Find the two words. */ + rl_forward_word (count, key); + w2_end = rl_point; + rl_backward_word (1, key); + w2_beg = rl_point; + rl_backward_word (count, key); + w1_beg = rl_point; + rl_forward_word (1, key); + w1_end = rl_point; + + /* Do some check to make sure that there really are two words. */ + if ((w1_beg == w2_beg) || (w2_beg < w1_end)) + { + rl_ding (); + rl_point = orig_point; + return 1; + } + + /* Get the text of the words. */ + word1 = rl_copy_text (w1_beg, w1_end); + word2 = rl_copy_text (w2_beg, w2_end); + + /* We are about to do many insertions and deletions. Remember them + as one operation. */ + rl_begin_undo_group (); + + /* Do the stuff at word2 first, so that we don't have to worry + about word1 moving. */ + rl_point = w2_beg; + rl_delete_text (w2_beg, w2_end); + rl_insert_text (word1); + + rl_point = w1_beg; + rl_delete_text (w1_beg, w1_end); + rl_insert_text (word2); + + /* This is exactly correct since the text before this point has not + changed in length. */ + rl_point = w2_end; + rl_end = orig_end; /* just make sure */ + + /* I think that does it. */ + rl_end_undo_group (); + xfree (word1); + xfree (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 (int count, int key) +{ +#if defined (HANDLE_MULTIBYTE) + char *dummy; + int i; +#else + char dummy[2]; +#endif + int char_length, prev_point; + + if (count == 0) + return 0; + + if (!rl_point || rl_end < 2) + { + rl_ding (); + return 1; + } + + rl_begin_undo_group (); + + if (rl_point == rl_end) + { + rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); + count = 1; + } + + prev_point = rl_point; + rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); + +#if defined (HANDLE_MULTIBYTE) + char_length = prev_point - rl_point; + dummy = (char *)xmalloc (char_length + 1); + for (i = 0; i < char_length; i++) + dummy[i] = rl_line_buffer[rl_point + i]; + dummy[i] = '\0'; +#else + dummy[0] = rl_line_buffer[rl_point]; + dummy[char_length = 1] = '\0'; +#endif + + rl_delete_text (rl_point, rl_point + char_length); + + rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); + + _rl_fix_point (0); + rl_insert_text (dummy); + rl_end_undo_group (); + +#if defined (HANDLE_MULTIBYTE) + xfree (dummy); +#endif + + return 0; +} + +/* **************************************************************** */ +/* */ +/* Character Searching */ +/* */ +/* **************************************************************** */ + +int +#if defined (HANDLE_MULTIBYTE) +_rl_char_search_internal (int count, int dir, char *smbchar, int len) +#else +_rl_char_search_internal (int count, int dir, int schar) +#endif +{ + int pos, inc; +#if defined (HANDLE_MULTIBYTE) + int prepos; +#endif + + if (dir == 0) + return 1; + + pos = rl_point; + inc = (dir < 0) ? -1 : 1; + while (count) + { + if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end)) + { + rl_ding (); + return 1; + } + +#if defined (HANDLE_MULTIBYTE) + pos = (inc > 0) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) + : _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); +#else + pos += inc; +#endif + do + { +#if defined (HANDLE_MULTIBYTE) + if (_rl_is_mbchar_matched (rl_line_buffer, pos, rl_end, smbchar, len)) +#else + if (rl_line_buffer[pos] == schar) +#endif + { + count--; + if (dir < 0) + rl_point = (dir == BTO) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) + : pos; + else + rl_point = (dir == FTO) ? _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY) + : pos; + break; + } +#if defined (HANDLE_MULTIBYTE) + prepos = pos; +#endif + } +#if defined (HANDLE_MULTIBYTE) + while ((dir < 0) ? (pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)) != prepos + : (pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)) != prepos); +#else + while ((dir < 0) ? pos-- : ++pos < rl_end); +#endif + } + return (0); +} + +/* Search COUNT times for a character read from the current input stream. + FDIR is the direction to search if COUNT is non-negative; otherwise + the search goes in BDIR. So much is dependent on HANDLE_MULTIBYTE + that there are two separate versions of this function. */ +#if defined (HANDLE_MULTIBYTE) +static int +_rl_char_search (int count, int fdir, int bdir) +{ + char mbchar[MB_LEN_MAX]; + int mb_len; + + mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX); + + if (mb_len <= 0) + return 1; + + if (count < 0) + return (_rl_char_search_internal (-count, bdir, mbchar, mb_len)); + else + return (_rl_char_search_internal (count, fdir, mbchar, mb_len)); +} +#else /* !HANDLE_MULTIBYTE */ +static int +_rl_char_search (int count, int fdir, int bdir) +{ + int c; + + c = _rl_bracketed_read_key (); + if (c < 0) + return 1; + + if (count < 0) + return (_rl_char_search_internal (-count, bdir, c)); + else + return (_rl_char_search_internal (count, fdir, c)); +} +#endif /* !HANDLE_MULTIBYTE */ + +#if defined (READLINE_CALLBACKS) +static int +_rl_char_search_callback (data) + _rl_callback_generic_arg *data; +{ + _rl_callback_func = 0; + _rl_want_redisplay = 1; + + return (_rl_char_search (data->count, data->i1, data->i2)); +} +#endif + +int +rl_char_search (int count, int key) +{ +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_callback_data = _rl_callback_data_alloc (count); + _rl_callback_data->i1 = FFIND; + _rl_callback_data->i2 = BFIND; + _rl_callback_func = _rl_char_search_callback; + return (0); + } +#endif + + return (_rl_char_search (count, FFIND, BFIND)); +} + +int +rl_backward_char_search (int count, int key) +{ +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_callback_data = _rl_callback_data_alloc (count); + _rl_callback_data->i1 = BFIND; + _rl_callback_data->i2 = FFIND; + _rl_callback_func = _rl_char_search_callback; + return (0); + } +#endif + + return (_rl_char_search (count, BFIND, FFIND)); +} + +/* **************************************************************** */ +/* */ +/* The Mark and the Region. */ +/* */ +/* **************************************************************** */ + +/* Set the mark at POSITION. */ +int +_rl_set_mark_at_pos (int position) +{ + if (position < 0 || position > rl_end) + return 1; + + rl_mark = position; + return 0; +} + +/* A bindable command to set the mark. */ +int +rl_set_mark (int count, int 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 (int count, int key) +{ + if (rl_mark > rl_end) + rl_mark = -1; + + if (rl_mark < 0) + { + rl_ding (); + rl_mark = 0; /* like _RL_FIX_POINT */ + return 1; + } + else + { + SWAP (rl_point, rl_mark); + rl_activate_mark (); + } + + return 0; +} + +/* Active mark support */ + +/* Is the region active? */ +static int mark_active = 0; + +/* Does the current command want the mark to remain active when it completes? */ +int _rl_keep_mark_active; + +void +rl_keep_mark_active (void) +{ + _rl_keep_mark_active++; +} + +void +rl_activate_mark (void) +{ + mark_active = 1; + rl_keep_mark_active (); +} + +void +rl_deactivate_mark (void) +{ + mark_active = 0; +} + +int +rl_mark_active_p (void) +{ + return (mark_active); +} diff --git a/tilde.c b/tilde.c new file mode 100644 index 0000000..d678a31 --- /dev/null +++ b/tilde.c @@ -0,0 +1,493 @@ +/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ + +/* Copyright (C) 1988-2020 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#if defined (HAVE_STRING_H) +# include +#else /* !HAVE_STRING_H */ +# include +#endif /* !HAVE_STRING_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include +#if defined (HAVE_PWD_H) +#include +#endif + +#include "tilde.h" + +#if defined (TEST) || defined (STATIC_MALLOC) +static void *xmalloc (), *xrealloc (); +#else +# include "xmalloc.h" +#endif /* TEST || STATIC_MALLOC */ + +#if !defined (HAVE_GETPW_DECLS) +# if defined (HAVE_GETPWUID) +extern struct passwd *getpwuid (uid_t); +# endif +# if defined (HAVE_GETPWNAM) +extern struct passwd *getpwnam (const char *); +# endif +#endif /* !HAVE_GETPW_DECLS */ + +#if !defined (savestring) +#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) +#endif /* !savestring */ + +#if !defined (NULL) +# if defined (__STDC__) +# define NULL ((void *) 0) +# else +# define NULL 0x0 +# endif /* !__STDC__ */ +#endif /* !NULL */ + +/* If being compiled as part of bash, these will be satisfied from + variables.o. If being compiled as part of readline, they will + be satisfied from shell.o. */ +extern char *sh_get_home_dir (void); +extern char *sh_get_env_value (const char *); + +/* The default value of tilde_additional_prefixes. This is set to + whitespace preceding a tilde so that simple programs which do not + perform any word separation get desired behaviour. */ +static const char *default_prefixes[] = + { " ~", "\t~", (const char *)NULL }; + +/* The default value of tilde_additional_suffixes. This is set to + whitespace or newline so that simple programs which do not + perform any word separation get desired behaviour. */ +static const char *default_suffixes[] = + { " ", "\n", (const char *)NULL }; + +/* If non-null, this contains the address of a function that the application + wants called before trying the standard tilde expansions. The function + is called with the text sans tilde, and returns a malloc()'ed string + which is the expansion, or a NULL pointer if the expansion fails. */ +tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL; + +/* If non-null, this contains the address of a function to call if the + standard meaning for expanding a tilde fails. The function is called + with the text (sans tilde, as in "foo"), and returns a malloc()'ed string + which is the expansion, or a NULL pointer if there is no expansion. */ +tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL; + +/* When non-null, this is a NULL terminated array of strings which + are duplicates for a tilde prefix. Bash uses this to expand + `=~' and `:~'. */ +char **tilde_additional_prefixes = (char **)default_prefixes; + +/* When non-null, this is a NULL terminated array of strings which match + the end of a username, instead of just "/". Bash sets this to + `:' and `=~'. */ +char **tilde_additional_suffixes = (char **)default_suffixes; + +static int tilde_find_prefix (const char *, int *); +static int tilde_find_suffix (const char *); +static char *isolate_tilde_prefix (const char *, int *); +static char *glue_prefix_and_suffix (char *, const char *, int); + +/* Find the start of a tilde expansion in STRING, and return the index of + the tilde which starts the expansion. Place the length of the text + which identified this tilde starter in LEN, excluding the tilde itself. */ +static int +tilde_find_prefix (const char *string, int *len) +{ + register int i, j, string_len; + register char **prefixes; + + prefixes = tilde_additional_prefixes; + + string_len = strlen (string); + *len = 0; + + if (*string == '\0' || *string == '~') + return (0); + + if (prefixes) + { + for (i = 0; i < string_len; i++) + { + for (j = 0; prefixes[j]; j++) + { + if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0) + { + *len = strlen (prefixes[j]) - 1; + return (i + *len); + } + } + } + } + return (string_len); +} + +/* Find the end of a tilde expansion in STRING, and return the index of + the character which ends the tilde definition. */ +static int +tilde_find_suffix (const char *string) +{ + register int i, j, string_len; + register char **suffixes; + + suffixes = tilde_additional_suffixes; + string_len = strlen (string); + + for (i = 0; i < string_len; i++) + { +#if defined (__MSDOS__) + if (string[i] == '/' || string[i] == '\\' /* || !string[i] */) +#else + if (string[i] == '/' /* || !string[i] */) +#endif + break; + + for (j = 0; suffixes && suffixes[j]; j++) + { + if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0) + return (i); + } + } + return (i); +} + +/* Return a new string which is the result of tilde expanding STRING. */ +char * +tilde_expand (const char *string) +{ + char *result; + int result_size, result_index; + + result_index = result_size = 0; + if (result = strchr (string, '~')) + result = (char *)xmalloc (result_size = (strlen (string) + 16)); + else + result = (char *)xmalloc (result_size = (strlen (string) + 1)); + + /* Scan through STRING expanding tildes as we come to them. */ + while (1) + { + register int start, end; + char *tilde_word, *expansion; + int len; + + /* Make START point to the tilde which starts the expansion. */ + start = tilde_find_prefix (string, &len); + + /* Copy the skipped text into the result. */ + if ((result_index + start + 1) > result_size) + result = (char *)xrealloc (result, 1 + (result_size += (start + 20))); + + strncpy (result + result_index, string, start); + result_index += start; + + /* Advance STRING to the starting tilde. */ + string += start; + + /* Make END be the index of one after the last character of the + username. */ + end = tilde_find_suffix (string); + + /* If both START and END are zero, we are all done. */ + if (!start && !end) + break; + + /* Expand the entire tilde word, and copy it into RESULT. */ + tilde_word = (char *)xmalloc (1 + end); + strncpy (tilde_word, string, end); + tilde_word[end] = '\0'; + string += end; + + expansion = tilde_expand_word (tilde_word); + + if (expansion == 0) + expansion = tilde_word; + else + xfree (tilde_word); + + len = strlen (expansion); +#ifdef __CYGWIN__ + /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when + $HOME for `user' is /. On cygwin, // denotes a network drive. */ + if (len > 1 || *expansion != '/' || *string != '/') +#endif + { + if ((result_index + len + 1) > result_size) + result = (char *)xrealloc (result, 1 + (result_size += (len + 20))); + + strcpy (result + result_index, expansion); + result_index += len; + } + xfree (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 (const char *fname, int *lenp) +{ + char *ret; + int i; + + ret = (char *)xmalloc (strlen (fname)); +#if defined (__MSDOS__) + for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++) +#else + for (i = 1; fname[i] && fname[i] != '/'; i++) +#endif + ret[i - 1] = fname[i]; + ret[i - 1] = '\0'; + if (lenp) + *lenp = i; + return ret; +} + +#if 0 +/* Public function to scan a string (FNAME) beginning with a tilde and find + the portion of the string that should be passed to the tilde expansion + function. Right now, it just calls tilde_find_suffix and allocates new + memory, but it can be expanded to do different things later. */ +char * +tilde_find_word (const char *fname, int flags, int *lenp) +{ + int x; + char *r; + + x = tilde_find_suffix (fname); + if (x == 0) + { + r = savestring (fname); + if (lenp) + *lenp = 0; + } + else + { + r = (char *)xmalloc (1 + x); + strncpy (r, fname, x); + r[x] = '\0'; + if (lenp) + *lenp = x; + } + + return r; +} +#endif + +/* Return a string that is PREFIX concatenated with SUFFIX starting at + SUFFIND. */ +static char * +glue_prefix_and_suffix (char *prefix, const char *suffix, int suffind) +{ + char *ret; + int plen, slen; + + plen = (prefix && *prefix) ? strlen (prefix) : 0; + slen = strlen (suffix + suffind); + ret = (char *)xmalloc (plen + slen + 1); + if (plen) + strcpy (ret, prefix); + strcpy (ret + plen, suffix + suffind); + return ret; +} + +/* Do the work of tilde expansion on FILENAME. FILENAME starts with a + tilde. If there is no expansion, call tilde_expansion_failure_hook. + This always returns a newly-allocated string, never static storage. */ +char * +tilde_expand_word (const char *filename) +{ + char *dirname, *expansion, *username; + int user_len; + struct passwd *user_entry; + + if (filename == 0) + return ((char *)NULL); + + if (*filename != '~') + return (savestring (filename)); + + /* A leading `~/' or a bare `~' is *always* translated to the value of + $HOME or the home directory of the current user, regardless of any + preexpansion hook. */ + if (filename[1] == '\0' || filename[1] == '/') + { + /* Prefix $HOME to the rest of the string. */ + expansion = sh_get_env_value ("HOME"); +#if defined (_WIN32) + if (expansion == 0) + expansion = sh_get_env_value ("APPDATA"); +#endif + + /* If there is no HOME variable, look up the directory in + the password database. */ + if (expansion == 0) + expansion = sh_get_home_dir (); + + return (glue_prefix_and_suffix (expansion, filename, 1)); + } + + username = isolate_tilde_prefix (filename, &user_len); + + if (tilde_expansion_preexpansion_hook) + { + expansion = (*tilde_expansion_preexpansion_hook) (username); + if (expansion) + { + dirname = glue_prefix_and_suffix (expansion, filename, user_len); + xfree (username); + xfree (expansion); + return (dirname); + } + } + + /* No preexpansion hook, or the preexpansion hook failed. Look in the + password database. */ + dirname = (char *)NULL; +#if defined (HAVE_GETPWNAM) + user_entry = getpwnam (username); +#else + user_entry = 0; +#endif + if (user_entry == 0) + { + /* If the calling program has a special syntax for expanding tildes, + and we couldn't find a standard expansion, then let them try. */ + if (tilde_expansion_failure_hook) + { + expansion = (*tilde_expansion_failure_hook) (username); + if (expansion) + { + dirname = glue_prefix_and_suffix (expansion, filename, user_len); + xfree (expansion); + } + } + /* If we don't have a failure hook, or if the failure hook did not + expand the tilde, return a copy of what we were passed. */ + if (dirname == 0) + dirname = savestring (filename); + } +#if defined (HAVE_GETPWENT) + else + dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len); +#endif + + xfree (username); +#if defined (HAVE_GETPWENT) + endpwent (); +#endif + return (dirname); +} + + +#if defined (TEST) +#undef NULL +#include + +main (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 (void); + +static void * +xmalloc (size_t bytes) +{ + void *temp = (char *)malloc (bytes); + + if (!temp) + memory_error_and_abort (); + return (temp); +} + +static void * +xrealloc (void *pointer, int bytes) +{ + void *temp; + + if (!pointer) + temp = malloc (bytes); + else + temp = realloc (pointer, bytes); + + if (!temp) + memory_error_and_abort (); + + return (temp); +} + +static void +memory_error_and_abort (void) +{ + fprintf (stderr, "readline: out of virtual memory\n"); + abort (); +} + +/* + * Local variables: + * compile-command: "gcc -g -DTEST -o tilde tilde.c" + * end: + */ +#endif /* TEST */ diff --git a/tilde.h b/tilde.h new file mode 100644 index 0000000..bc8022a --- /dev/null +++ b/tilde.h @@ -0,0 +1,68 @@ +/* tilde.h: Externally available variables and function in libtilde.a. */ + +/* Copyright (C) 1992-2009,2021 Free Software Foundation, Inc. + + This file contains the Readline Library (Readline), a set of + routines for providing Emacs style line input to programs that ask + for it. + + 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 3 of the License, 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. If not, see . +*/ + +#if !defined (_TILDE_H_) +# define _TILDE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef char *tilde_hook_func_t (char *); + +/* If non-null, this contains the address of a function that the application + wants called before trying the standard tilde expansions. The function + is called with the text sans tilde, and returns a malloc()'ed string + which is the expansion, or a NULL pointer if the expansion fails. */ +extern tilde_hook_func_t *tilde_expansion_preexpansion_hook; + +/* If non-null, this contains the address of a function to call if the + standard meaning for expanding a tilde fails. The function is called + with the text (sans tilde, as in "foo"), and returns a malloc()'ed string + which is the expansion, or a NULL pointer if there is no expansion. */ +extern tilde_hook_func_t *tilde_expansion_failure_hook; + +/* When non-null, this is a NULL terminated array of strings which + are duplicates for a tilde prefix. Bash uses this to expand + `=~' and `:~'. */ +extern char **tilde_additional_prefixes; + +/* When non-null, this is a NULL terminated array of strings which match + the end of a username, instead of just "/". Bash sets this to + `:' and `=~'. */ +extern char **tilde_additional_suffixes; + +/* Return a new string which is the result of tilde expanding STRING. */ +extern char *tilde_expand (const char *); + +/* Do the work of tilde expansion on FILENAME. FILENAME starts with a + tilde. If there is no expansion, call tilde_expansion_failure_hook. */ +extern char *tilde_expand_word (const char *); + +/* Find the portion of the string beginning with ~ that should be expanded. */ +extern char *tilde_find_word (const char *, int, int *); + +#ifdef __cplusplus +} +#endif + +#endif /* _TILDE_H_ */ diff --git a/undo.c b/undo.c new file mode 100644 index 0000000..e4c457d --- /dev/null +++ b/undo.c @@ -0,0 +1,365 @@ +/* undo.c - manage list of changes to lines, offering opportunity to undo them */ + +/* Copyright (C) 1987-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +/* 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" + +#include "histlib.h" + +/* Non-zero tells rl_delete_text and rl_insert_text to not add to + the undo list. */ +int _rl_doing_an_undo = 0; + +/* How many unclosed undo groups we currently have. */ +int _rl_undo_group_level = 0; + +/* The current undo list for THE_LINE. */ +UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL; + +/* **************************************************************** */ +/* */ +/* Undo, and Undoing */ +/* */ +/* **************************************************************** */ + +static UNDO_LIST * +alloc_undo_entry (enum undo_code what, int start, int end, char *text) +{ + UNDO_LIST *temp; + + temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST)); + temp->what = what; + temp->start = start; + temp->end = end; + temp->text = text; + + temp->next = (UNDO_LIST *)NULL; + return temp; +} + +/* Remember how to undo something. Concatenate some undos if that + seems right. */ +void +rl_add_undo (enum undo_code what, int start, int end, char *text) +{ + UNDO_LIST *temp; + + temp = alloc_undo_entry (what, start, end, text); + temp->next = rl_undo_list; + rl_undo_list = temp; +} + +/* Free an UNDO_LIST */ +void +_rl_free_undo_list (UNDO_LIST *ul) +{ + UNDO_LIST *release; + + while (ul) + { + release = ul; + ul = ul->next; + + if (release->what == UNDO_DELETE) + xfree (release->text); + + xfree (release); + } +} + +/* Free the existing undo list. */ +void +rl_free_undo_list (void) +{ + UNDO_LIST *release, *orig_list; + + orig_list = rl_undo_list; + _rl_free_undo_list (rl_undo_list); + rl_undo_list = (UNDO_LIST *)NULL; + _hs_replace_history_data (-1, (histdata_t *)orig_list, (histdata_t *)NULL); +} + +UNDO_LIST * +_rl_copy_undo_entry (UNDO_LIST *entry) +{ + UNDO_LIST *new; + + new = alloc_undo_entry (entry->what, entry->start, entry->end, (char *)NULL); + new->text = entry->text ? savestring (entry->text) : 0; + return new; +} + +UNDO_LIST * +_rl_copy_undo_list (UNDO_LIST *head) +{ + UNDO_LIST *list, *new, *roving, *c; + + if (head == 0) + return head; + + list = head; + new = 0; + while (list) + { + c = _rl_copy_undo_entry (list); + if (new == 0) + roving = new = c; + else + { + roving->next = c; + roving = roving->next; + } + list = list->next; + } + + roving->next = 0; + return new; +} + +/* Undo the next thing in the list. Return 0 if there + is nothing to undo, or non-zero if there was. */ +int +rl_do_undo (void) +{ + UNDO_LIST *release, *search; + int waiting_for_begin, start, end; + HIST_ENTRY *cur, *temp; + +#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i))) + + start = end = waiting_for_begin = 0; + do + { + if (rl_undo_list == 0) + return (0); + + _rl_doing_an_undo = 1; + RL_SETSTATE(RL_STATE_UNDOING); + + /* To better support vi-mode, a start or end value of -1 means + rl_point, and a value of -2 means rl_end. */ + if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT) + { + start = TRANS (rl_undo_list->start); + end = TRANS (rl_undo_list->end); + } + + switch (rl_undo_list->what) + { + /* Undoing deletes means inserting some text. */ + case UNDO_DELETE: + rl_point = start; + _rl_fix_point (1); + rl_insert_text (rl_undo_list->text); + xfree (rl_undo_list->text); + break; + + /* Undoing inserts means deleting some text. */ + case UNDO_INSERT: + rl_delete_text (start, end); + rl_point = start; + _rl_fix_point (1); + break; + + /* Undoing an END means undoing everything 'til we get to a BEGIN. */ + case UNDO_END: + waiting_for_begin++; + break; + + /* Undoing a BEGIN means that we are done with this group. */ + case UNDO_BEGIN: + if (waiting_for_begin) + waiting_for_begin--; + else + rl_ding (); + break; + } + + _rl_doing_an_undo = 0; + RL_UNSETSTATE(RL_STATE_UNDOING); + + release = rl_undo_list; + rl_undo_list = rl_undo_list->next; + release->next = 0; /* XXX */ + + /* If we are editing a history entry, make sure the change is replicated + in the history entry's line */ + cur = current_history (); + if (cur && cur->data && (UNDO_LIST *)cur->data == release) + { + temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); + xfree (temp->line); + FREE (temp->timestamp); + xfree (temp); + } + + /* Make sure there aren't any history entries with that undo list */ + _hs_replace_history_data (-1, (histdata_t *)release, (histdata_t *)rl_undo_list); + + /* And make sure this list isn't anywhere in the saved line for history */ + if (_rl_saved_line_for_history && _rl_saved_line_for_history->data) + { + /* Brute force; no finesse here */ + search = (UNDO_LIST *)_rl_saved_line_for_history->data; + if (search == release) + _rl_saved_line_for_history->data = rl_undo_list; + else + { + while (search->next) + { + if (search->next == release) + { + search->next = rl_undo_list; + break; + } + search = search->next; + } + } + } + + xfree (release); + } + while (waiting_for_begin); + + return (1); +} +#undef TRANS + +int +_rl_fix_last_undo_of_type (int type, int start, int 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 (void) +{ + 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 (void) +{ + 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 (int start, int 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 (int count, int key) +{ + if (rl_undo_list == 0) + rl_ding (); + else + { + while (rl_undo_list) + rl_do_undo (); +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + rl_point = rl_mark = 0; /* rl_end should be set correctly */ +#endif + } + + return 0; +} + +/* Do some undoing of things that were done. */ +int +rl_undo_command (int count, int key) +{ + if (count < 0) + return 0; /* Nothing to do. */ + + while (count) + { + if (rl_do_undo ()) + count--; + else + { + rl_ding (); + break; + } + } + return 0; +} diff --git a/util.c b/util.c new file mode 100644 index 0000000..2e986db --- /dev/null +++ b/util.c @@ -0,0 +1,577 @@ +/* util.c -- readline utility functions */ + +/* Copyright (C) 1987-2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include "posixjmp.h" + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#if defined (TIOCSTAT_IN_SYS_IOCTL) +# include +#endif /* TIOCSTAT_IN_SYS_IOCTL */ + +/* Some standard library routines. */ +#include "readline.h" + +#include "rlprivate.h" +#include "xmalloc.h" +#include "rlshell.h" + +/* **************************************************************** */ +/* */ +/* Utility Functions */ +/* */ +/* **************************************************************** */ + +/* Return 0 if C is not a member of the class of characters that belong + in words, or 1 if it is. */ + +int _rl_allow_pathname_alphabetic_chars = 0; +static const char * const pathname_alphabetic_chars = "/-_=~.#$"; + +int +rl_alphabetic (int c) +{ + if (_rl_alphabetic_p (c)) + return (1); + + return (_rl_allow_pathname_alphabetic_chars && + strchr (pathname_alphabetic_chars, c) != NULL); +} + +#if defined (HANDLE_MULTIBYTE) +int +_rl_walphabetic (WCHAR_T wc) +{ + int c; + + if (iswalnum (wc)) + return (1); + + c = wc & 0177; + return (_rl_allow_pathname_alphabetic_chars && + strchr (pathname_alphabetic_chars, c) != NULL); +} +#endif + +/* How to abort things. */ +int +_rl_abort_internal (void) +{ + if (RL_ISSTATE (RL_STATE_TIMEOUT) == 0) + rl_ding (); /* Don't ring the bell on a timeout */ + rl_clear_message (); + _rl_reset_argument (); + rl_clear_pending_input (); + rl_deactivate_mark (); + + while (rl_executing_macro) + _rl_pop_executing_macro (); + _rl_kill_kbd_macro (); + + RL_UNSETSTATE (RL_STATE_MULTIKEY); /* XXX */ + + rl_last_func = (rl_command_func_t *)NULL; + + _rl_longjmp (_rl_top_level, 1); + return (0); +} + +int +rl_abort (int count, int key) +{ + return (_rl_abort_internal ()); +} + +int +_rl_null_function (int count, int key) +{ + return 0; +} + +int +rl_tty_status (int count, int key) +{ +#if defined (TIOCSTAT) + ioctl (1, TIOCSTAT, (char *)0); + rl_refresh_line (count, key); +#else + rl_ding (); +#endif + return 0; +} + +/* Return a copy of the string between FROM and TO. + FROM is inclusive, TO is not. */ +char * +rl_copy_text (int from, int to) +{ + register int length; + char *copy; + + /* Fix it if the caller is confused. */ + if (from > to) + SWAP (from, to); + + length = to - from; + copy = (char *)xmalloc (1 + length); + strncpy (copy, rl_line_buffer + from, length); + copy[length] = '\0'; + return (copy); +} + +/* Increase the size of RL_LINE_BUFFER until it has enough space to hold + LEN characters. */ +void +rl_extend_line_buffer (int len) +{ + while (len >= rl_line_buffer_len) + { + rl_line_buffer_len += DEFAULT_BUFFER_SIZE; + rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len); + } + + _rl_set_the_line (); +} + + +/* A function for simple tilde expansion. */ +int +rl_tilde_expand (int ignore, int 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); + xfree (homedir); + return (0); + } + else if (start >= 0 && rl_line_buffer[start] != '~') + { + for (; start >= 0 && !whitespace (rl_line_buffer[start]); start--) + ; + start++; + } + else if (start < 0) + start = 0; + + end = start; + do + end++; + while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end); + + if (whitespace (rl_line_buffer[end]) || end >= rl_end) + end--; + + /* If the first character of the current word is a tilde, perform + tilde expansion and insert the result. If not a tilde, do + nothing. */ + if (rl_line_buffer[start] == '~') + { + len = end - start + 1; + temp = (char *)xmalloc (len + 1); + strncpy (temp, rl_line_buffer + start, len); + temp[len] = '\0'; + homedir = tilde_expand (temp); + xfree (temp); + + _rl_replace_text (homedir, start, end); + xfree (homedir); + } + + return (0); +} + +#if defined (USE_VARARGS) +void +#if defined (PREFER_STDARG) +_rl_ttymsg (const char *format, ...) +#else +_rl_ttymsg (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 + + fprintf (stderr, "readline: "); + vfprintf (stderr, format, args); + fprintf (stderr, "\n"); + fflush (stderr); + + va_end (args); + + rl_forced_update_display (); +} + +void +#if defined (PREFER_STDARG) +_rl_errmsg (const char *format, ...) +#else +_rl_errmsg (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 + + fprintf (stderr, "readline: "); + vfprintf (stderr, format, args); + fprintf (stderr, "\n"); + fflush (stderr); + + va_end (args); +} + +#else /* !USE_VARARGS */ +void +_rl_ttymsg (format, arg1, arg2) + char *format; +{ + fprintf (stderr, "readline: "); + fprintf (stderr, format, arg1, arg2); + fprintf (stderr, "\n"); + + rl_forced_update_display (); +} + +void +_rl_errmsg (format, arg1, arg2) + char *format; +{ + fprintf (stderr, "readline: "); + fprintf (stderr, format, arg1, arg2); + fprintf (stderr, "\n"); +} +#endif /* !USE_VARARGS */ + +/* **************************************************************** */ +/* */ +/* 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 (const char *s1, const char *s2) +{ + register int i, l, len; + + for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++) + if (_rl_strnicmp (s1 + i, s2, l) == 0) + return ((char *) (s1 + i)); + return ((char *)NULL); +} + +#ifndef HAVE_STRPBRK +/* Find the first occurrence in STRING1 of any character from STRING2. + Return a pointer to the character in STRING1. */ +char * +_rl_strpbrk (const char *string1, const char *string2) +{ + register const char *scan; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; + register int i, v; + + memset (&ps, 0, sizeof (mbstate_t)); +#endif + + for (; *string1; string1++) + { + for (scan = string2; *scan; scan++) + { + if (*string1 == *scan) + return ((char *)string1); + } +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + v = _rl_get_char_len (string1, &ps); + if (v > 1) + string1 += v - 1; /* -1 to account for auto-increment in loop */ + } +#endif + } + return ((char *)NULL); +} +#endif + +#if !defined (HAVE_STRCASECMP) +/* Compare at most COUNT characters from string1 to string2. Case + doesn't matter (strncasecmp). */ +int +_rl_strnicmp (const char *string1, const char *string2, int count) +{ + register const char *s1; + register const char *s2; + register int d; + + if (count <= 0 || (string1 == string2)) + return 0; + + s1 = string1; + s2 = string2; + do + { + d = _rl_to_lower (*s1) - _rl_to_lower (*s2); /* XXX - cast to unsigned char? */ + if (d != 0) + return d; + if (*s1++ == '\0') + break; + s2++; + } + while (--count != 0); + + return (0); +} + +/* strcmp (), but caseless (strcasecmp). */ +int +_rl_stricmp (const char *string1, const char *string2) +{ + register const char *s1; + register const char *s2; + register int d; + + s1 = string1; + s2 = string2; + + if (s1 == s2) + return 0; + + while ((d = _rl_to_lower (*s1) - _rl_to_lower (*s2)) == 0) + { + if (*s1++ == '\0') + return 0; + s2++; + } + + return (d); +} +#endif /* !HAVE_STRCASECMP */ + +/* Stupid comparison routine for qsort () ing strings. */ +int +_rl_qsort_string_compare (char **s1, char **s2) +{ +#if defined (HAVE_STRCOLL) + return (strcoll (*s1, *s2)); +#else + int result; + + result = **s1 - **s2; + if (result == 0) + result = strcmp (*s1, *s2); + + return result; +#endif +} + +/* Function equivalents for the macros defined in chardefs.h. */ +#define FUNCTION_FOR_MACRO(f) int (f) (int c) { return f (c); } + +FUNCTION_FOR_MACRO (_rl_digit_p) +FUNCTION_FOR_MACRO (_rl_digit_value) +FUNCTION_FOR_MACRO (_rl_lowercase_p) +FUNCTION_FOR_MACRO (_rl_pure_alphabetic) +FUNCTION_FOR_MACRO (_rl_to_lower) +FUNCTION_FOR_MACRO (_rl_to_upper) +FUNCTION_FOR_MACRO (_rl_uppercase_p) + +/* A convenience function, to force memory deallocation to be performed + by readline. DLLs on Windows apparently require this. */ +void +rl_free (void *mem) +{ + if (mem) + free (mem); +} + +/* Backwards compatibility, now that savestring has been removed from + all `public' readline header files. */ +#undef _rl_savestring +char * +_rl_savestring (const char *s) +{ + return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s))); +} + +#if defined (DEBUG) +#if defined (USE_VARARGS) +static FILE *_rl_tracefp; + +void +#if defined (PREFER_STDARG) +_rl_trace (const char *format, ...) +#else +_rl_trace (va_alist) + va_dcl +#endif +{ + va_list args; +#if defined (PREFER_VARARGS) + char *format; +#endif + +#if defined (PREFER_STDARG) + va_start (args, format); +#else + va_start (args); + format = va_arg (args, char *); +#endif + + if (_rl_tracefp == 0) + _rl_tropen (); + vfprintf (_rl_tracefp, format, args); + fprintf (_rl_tracefp, "\n"); + fflush (_rl_tracefp); + + va_end (args); +} + +int +_rl_tropen (void) +{ + char fnbuf[128], *x; + + if (_rl_tracefp) + fclose (_rl_tracefp); +#if defined (_WIN32) && !defined (__CYGWIN__) + x = sh_get_env_value ("TEMP"); + if (x == 0) + x = "."; +#else + x = "/var/tmp"; +#endif + snprintf (fnbuf, sizeof (fnbuf), "%s/rltrace.%ld", x, (long)getpid()); + unlink(fnbuf); + _rl_tracefp = fopen (fnbuf, "w+"); + return _rl_tracefp != 0; +} + +int +_rl_trclose (void) +{ + int r; + + r = fclose (_rl_tracefp); + _rl_tracefp = 0; + return r; +} + +void +_rl_settracefp (FILE *fp) +{ + _rl_tracefp = fp; +} +#endif +#endif /* DEBUG */ + + +#if HAVE_DECL_AUDIT_USER_TTY && defined (HAVE_LIBAUDIT_H) && defined (ENABLE_TTY_AUDIT_SUPPORT) +#include +#include +#include +#include + +/* Report STRING to the audit system. */ +void +_rl_audit_tty (char *string) +{ + struct audit_message req; + struct sockaddr_nl addr; + size_t size; + int fd; + + fd = socket (PF_NETLINK, SOCK_RAW, NETLINK_AUDIT); + if (fd < 0) + return; + size = strlen (string) + 1; + + if (NLMSG_SPACE (size) > MAX_AUDIT_MESSAGE_LENGTH) + return; + + memset (&req, 0, sizeof(req)); + req.nlh.nlmsg_len = NLMSG_SPACE (size); + req.nlh.nlmsg_type = AUDIT_USER_TTY; + req.nlh.nlmsg_flags = NLM_F_REQUEST; + req.nlh.nlmsg_seq = 0; + if (size && string) + memcpy (NLMSG_DATA(&req.nlh), string, size); + memset (&addr, 0, sizeof(addr)); + + addr.nl_family = AF_NETLINK; + addr.nl_pid = 0; + addr.nl_groups = 0; + + sendto (fd, &req, req.nlh.nlmsg_len, 0, (struct sockaddr*)&addr, sizeof(addr)); + close (fd); +} +#endif diff --git a/vi_keymap.c b/vi_keymap.c new file mode 100644 index 0000000..045258b --- /dev/null +++ b/vi_keymap.c @@ -0,0 +1,875 @@ +/* vi_keymap.c -- the keymap for vi_mode in readline (). */ + +/* Copyright (C) 1987-2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (BUFSIZ) +#include +#endif /* !BUFSIZ */ + +#include "readline.h" + +#if 0 +extern KEYMAP_ENTRY_ARRAY vi_escape_keymap; +#endif + +/* The keymap arrays for handling vi mode. */ +KEYMAP_ENTRY_ARRAY vi_movement_keymap = { + /* The regular control keys come first. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ + { ISFUNC, rl_emacs_editing_mode }, /* Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ + { ISFUNC, rl_abort }, /* Control-g */ + { ISFUNC, rl_backward_char }, /* Control-h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ + { ISFUNC, rl_newline }, /* Control-j */ + { ISFUNC, rl_kill_line }, /* Control-k */ + { ISFUNC, rl_clear_screen }, /* Control-l */ + { ISFUNC, rl_newline }, /* Control-m */ + { ISFUNC, rl_get_next_history }, /* Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ + { ISFUNC, rl_get_previous_history }, /* Control-p */ + { ISFUNC, rl_quoted_insert }, /* Control-q */ + { ISFUNC, rl_reverse_search_history }, /* Control-r */ + { ISFUNC, rl_forward_search_history }, /* Control-s */ + { ISFUNC, rl_transpose_chars }, /* Control-t */ + { ISFUNC, rl_unix_line_discard }, /* Control-u */ + { ISFUNC, rl_quoted_insert }, /* Control-v */ + { ISFUNC, rl_vi_unix_word_rubout }, /* Control-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ + { ISFUNC, rl_yank }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ /* vi_escape_keymap */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, rl_vi_undo }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_forward_char }, /* SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ + { ISFUNC, rl_insert_comment }, /* # */ + { ISFUNC, rl_end_of_line }, /* $ */ + { ISFUNC, rl_vi_match }, /* % */ + { ISFUNC, rl_vi_tilde_expand }, /* & */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ + { ISFUNC, rl_vi_complete }, /* * */ + { ISFUNC, rl_get_next_history}, /* + */ + { ISFUNC, rl_vi_char_search }, /* , */ + { ISFUNC, rl_get_previous_history }, /* - */ + { ISFUNC, rl_vi_redo }, /* . */ + { ISFUNC, rl_vi_search }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_beg_of_line }, /* 0 */ + { ISFUNC, rl_vi_arg_digit }, /* 1 */ + { ISFUNC, rl_vi_arg_digit }, /* 2 */ + { ISFUNC, rl_vi_arg_digit }, /* 3 */ + { ISFUNC, rl_vi_arg_digit }, /* 4 */ + { ISFUNC, rl_vi_arg_digit }, /* 5 */ + { ISFUNC, rl_vi_arg_digit }, /* 6 */ + { ISFUNC, rl_vi_arg_digit }, /* 7 */ + { ISFUNC, rl_vi_arg_digit }, /* 8 */ + { ISFUNC, rl_vi_arg_digit }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ + { ISFUNC, rl_vi_char_search }, /* ; */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ + { ISFUNC, rl_vi_complete }, /* = */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ + { ISFUNC, rl_vi_search }, /* ? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_vi_append_eol }, /* A */ + { ISFUNC, rl_vi_prev_word}, /* B */ + { ISFUNC, rl_vi_change_to }, /* C */ + { ISFUNC, rl_vi_delete_to }, /* D */ + { ISFUNC, rl_vi_end_word }, /* E */ + { ISFUNC, rl_vi_char_search }, /* F */ + { ISFUNC, rl_vi_fetch_history }, /* G */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* H */ + { ISFUNC, rl_vi_insert_beg }, /* I */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* J */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* K */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* L */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* M */ + { ISFUNC, rl_vi_search_again }, /* N */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* O */ + { ISFUNC, rl_vi_put }, /* P */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Q */ + { ISFUNC, rl_vi_replace }, /* R */ + { ISFUNC, rl_vi_subst }, /* S */ + { ISFUNC, rl_vi_char_search }, /* T */ + { ISFUNC, rl_revert_line }, /* U */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* V */ + { ISFUNC, rl_vi_next_word }, /* W */ + { ISFUNC, rl_vi_rubout }, /* X */ + { ISFUNC, rl_vi_yank_to }, /* Y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ + { ISFUNC, rl_vi_complete }, /* \ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ + { ISFUNC, rl_vi_first_print }, /* ^ */ + { ISFUNC, rl_vi_yank_arg }, /* _ */ + { ISFUNC, rl_vi_goto_mark }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, rl_vi_append_mode }, /* a */ + { ISFUNC, rl_vi_prev_word }, /* b */ + { ISFUNC, rl_vi_change_to }, /* c */ + { ISFUNC, rl_vi_delete_to }, /* d */ + { ISFUNC, rl_vi_end_word }, /* e */ + { ISFUNC, rl_vi_char_search }, /* f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ + { ISFUNC, rl_backward_char }, /* h */ + { ISFUNC, rl_vi_insert_mode }, /* i */ + { ISFUNC, rl_get_next_history }, /* j */ + { ISFUNC, rl_get_previous_history }, /* k */ + { ISFUNC, rl_forward_char }, /* l */ + { ISFUNC, rl_vi_set_mark }, /* m */ + { ISFUNC, rl_vi_search_again }, /* n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ + { ISFUNC, rl_vi_put }, /* p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ + { ISFUNC, rl_vi_change_char }, /* r */ + { ISFUNC, rl_vi_subst }, /* s */ + { ISFUNC, rl_vi_char_search }, /* t */ + { ISFUNC, rl_vi_undo }, /* u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ + { ISFUNC, rl_vi_next_word }, /* w */ + { ISFUNC, rl_vi_delete }, /* x */ + { ISFUNC, rl_vi_yank_to }, /* y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ + { ISFUNC, rl_vi_column }, /* | */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ + { ISFUNC, rl_vi_change_case }, /* ~ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; + +KEYMAP_ENTRY_ARRAY vi_insertion_keymap = { + /* The regular control keys come first. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, rl_insert }, /* Control-a */ + { ISFUNC, rl_insert }, /* Control-b */ + { ISFUNC, rl_insert }, /* Control-c */ + { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ + { ISFUNC, rl_insert }, /* Control-e */ + { ISFUNC, rl_insert }, /* Control-f */ + { ISFUNC, rl_insert }, /* Control-g */ + { ISFUNC, rl_rubout }, /* Control-h */ + { ISFUNC, rl_complete }, /* Control-i */ + { ISFUNC, rl_newline }, /* Control-j */ + { ISFUNC, rl_insert }, /* Control-k */ + { ISFUNC, rl_insert }, /* Control-l */ + { ISFUNC, rl_newline }, /* Control-m */ + { ISFUNC, rl_menu_complete}, /* Control-n */ + { ISFUNC, rl_insert }, /* Control-o */ + { ISFUNC, rl_backward_menu_complete }, /* 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_vi_unix_word_rubout }, /* Control-w */ + { ISFUNC, rl_insert }, /* Control-x */ + { ISFUNC, rl_yank }, /* Control-y */ + { ISFUNC, rl_insert }, /* Control-z */ + + { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ + { ISFUNC, rl_insert }, /* Control-\ */ + { ISFUNC, rl_insert }, /* Control-] */ + { ISFUNC, rl_insert }, /* Control-^ */ + { ISFUNC, rl_vi_undo }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_insert }, /* SPACE */ + { ISFUNC, rl_insert }, /* ! */ + { ISFUNC, rl_insert }, /* " */ + { ISFUNC, rl_insert }, /* # */ + { ISFUNC, rl_insert }, /* $ */ + { ISFUNC, rl_insert }, /* % */ + { ISFUNC, rl_insert }, /* & */ + { ISFUNC, rl_insert }, /* ' */ + { ISFUNC, rl_insert }, /* ( */ + { ISFUNC, rl_insert }, /* ) */ + { ISFUNC, rl_insert }, /* * */ + { ISFUNC, rl_insert }, /* + */ + { ISFUNC, rl_insert }, /* , */ + { ISFUNC, rl_insert }, /* - */ + { ISFUNC, rl_insert }, /* . */ + { ISFUNC, rl_insert }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_insert }, /* 0 */ + { ISFUNC, rl_insert }, /* 1 */ + { ISFUNC, rl_insert }, /* 2 */ + { ISFUNC, rl_insert }, /* 3 */ + { ISFUNC, rl_insert }, /* 4 */ + { ISFUNC, rl_insert }, /* 5 */ + { ISFUNC, rl_insert }, /* 6 */ + { ISFUNC, rl_insert }, /* 7 */ + { ISFUNC, rl_insert }, /* 8 */ + { ISFUNC, rl_insert }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, rl_insert }, /* : */ + { ISFUNC, rl_insert }, /* ; */ + { ISFUNC, rl_insert }, /* < */ + { ISFUNC, rl_insert }, /* = */ + { ISFUNC, rl_insert }, /* > */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_insert }, /* A */ + { ISFUNC, rl_insert }, /* B */ + { ISFUNC, rl_insert }, /* C */ + { ISFUNC, rl_insert }, /* D */ + { ISFUNC, rl_insert }, /* E */ + { ISFUNC, rl_insert }, /* F */ + { ISFUNC, rl_insert }, /* G */ + { ISFUNC, rl_insert }, /* H */ + { ISFUNC, rl_insert }, /* I */ + { ISFUNC, rl_insert }, /* J */ + { ISFUNC, rl_insert }, /* K */ + { ISFUNC, rl_insert }, /* L */ + { ISFUNC, rl_insert }, /* M */ + { ISFUNC, rl_insert }, /* N */ + { ISFUNC, rl_insert }, /* O */ + { ISFUNC, rl_insert }, /* P */ + { ISFUNC, rl_insert }, /* Q */ + { ISFUNC, rl_insert }, /* R */ + { ISFUNC, rl_insert }, /* S */ + { ISFUNC, rl_insert }, /* T */ + { ISFUNC, rl_insert }, /* U */ + { ISFUNC, rl_insert }, /* V */ + { ISFUNC, rl_insert }, /* W */ + { ISFUNC, rl_insert }, /* X */ + { ISFUNC, rl_insert }, /* Y */ + { ISFUNC, rl_insert }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, rl_insert }, /* [ */ + { ISFUNC, rl_insert }, /* \ */ + { ISFUNC, rl_insert }, /* ] */ + { ISFUNC, rl_insert }, /* ^ */ + { ISFUNC, rl_insert }, /* _ */ + { ISFUNC, rl_insert }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, rl_insert }, /* a */ + { ISFUNC, rl_insert }, /* b */ + { ISFUNC, rl_insert }, /* c */ + { ISFUNC, rl_insert }, /* d */ + { ISFUNC, rl_insert }, /* e */ + { ISFUNC, rl_insert }, /* f */ + { ISFUNC, rl_insert }, /* g */ + { ISFUNC, rl_insert }, /* h */ + { ISFUNC, rl_insert }, /* i */ + { ISFUNC, rl_insert }, /* j */ + { ISFUNC, rl_insert }, /* k */ + { ISFUNC, rl_insert }, /* l */ + { ISFUNC, rl_insert }, /* m */ + { ISFUNC, rl_insert }, /* n */ + { ISFUNC, rl_insert }, /* o */ + { ISFUNC, rl_insert }, /* p */ + { ISFUNC, rl_insert }, /* q */ + { ISFUNC, rl_insert }, /* r */ + { ISFUNC, rl_insert }, /* s */ + { ISFUNC, rl_insert }, /* t */ + { ISFUNC, rl_insert }, /* u */ + { ISFUNC, rl_insert }, /* v */ + { ISFUNC, rl_insert }, /* w */ + { ISFUNC, rl_insert }, /* x */ + { ISFUNC, rl_insert }, /* y */ + { ISFUNC, rl_insert }, /* z */ + + /* Final punctuation. */ + { ISFUNC, rl_insert }, /* { */ + { ISFUNC, rl_insert }, /* | */ + { ISFUNC, rl_insert }, /* } */ + { ISFUNC, rl_insert }, /* ~ */ + { ISFUNC, rl_rubout }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Pure 8-bit characters (128 - 159). + These might be used in some + character sets. */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + + /* ISO Latin-1 characters (160 - 255) */ + { ISFUNC, rl_insert }, /* No-break space */ + { ISFUNC, rl_insert }, /* Inverted exclamation mark */ + { ISFUNC, rl_insert }, /* Cent sign */ + { ISFUNC, rl_insert }, /* Pound sign */ + { ISFUNC, rl_insert }, /* Currency sign */ + { ISFUNC, rl_insert }, /* Yen sign */ + { ISFUNC, rl_insert }, /* Broken bar */ + { ISFUNC, rl_insert }, /* Section sign */ + { ISFUNC, rl_insert }, /* Diaeresis */ + { ISFUNC, rl_insert }, /* Copyright sign */ + { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ + { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Not sign */ + { ISFUNC, rl_insert }, /* Soft hyphen */ + { ISFUNC, rl_insert }, /* Registered sign */ + { ISFUNC, rl_insert }, /* Macron */ + { ISFUNC, rl_insert }, /* Degree sign */ + { ISFUNC, rl_insert }, /* Plus-minus sign */ + { ISFUNC, rl_insert }, /* Superscript two */ + { ISFUNC, rl_insert }, /* Superscript three */ + { ISFUNC, rl_insert }, /* Acute accent */ + { ISFUNC, rl_insert }, /* Micro sign */ + { ISFUNC, rl_insert }, /* Pilcrow sign */ + { ISFUNC, rl_insert }, /* Middle dot */ + { ISFUNC, rl_insert }, /* Cedilla */ + { ISFUNC, rl_insert }, /* Superscript one */ + { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ + { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ + { ISFUNC, rl_insert }, /* Vulgar fraction one half */ + { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ + { ISFUNC, rl_insert }, /* Inverted questionk mark */ + { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin capital letter ae */ + { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Multiplication sign */ + { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ + { ISFUNC, rl_insert }, /* Latin small letter a with grave */ + { ISFUNC, rl_insert }, /* Latin small letter a with acute */ + { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin small letter ae */ + { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin small letter e with grave */ + { ISFUNC, rl_insert }, /* Latin small letter e with acute */ + { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter i with grave */ + { ISFUNC, rl_insert }, /* Latin small letter i with acute */ + { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with grave */ + { ISFUNC, rl_insert }, /* Latin small letter o with acute */ + { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Division sign */ + { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin small letter u with grave */ + { ISFUNC, rl_insert }, /* Latin small letter u with acute */ + { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter y with acute */ + { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ + { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ +#endif /* KEYMAP_SIZE > 128 */ +}; + +/* Unused for the time being. */ +#if 0 +KEYMAP_ENTRY_ARRAY vi_escape_keymap = { + /* The regular control keys come first. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ + { ISFUNC, rl_tab_insert}, /* Control-i */ + { ISFUNC, rl_emacs_editing_mode}, /* Control-j */ + { ISFUNC, rl_kill_line }, /* Control-k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ + { ISFUNC, rl_emacs_editing_mode}, /* Control-m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + + { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, rl_vi_undo }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_vi_arg_digit }, /* 0 */ + { ISFUNC, rl_vi_arg_digit }, /* 1 */ + { ISFUNC, rl_vi_arg_digit }, /* 2 */ + { ISFUNC, rl_vi_arg_digit }, /* 3 */ + { ISFUNC, rl_vi_arg_digit }, /* 4 */ + { ISFUNC, rl_vi_arg_digit }, /* 5 */ + { ISFUNC, rl_vi_arg_digit }, /* 6 */ + { ISFUNC, rl_vi_arg_digit }, /* 7 */ + { ISFUNC, rl_vi_arg_digit }, /* 8 */ + { ISFUNC, rl_vi_arg_digit }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_do_lowercase_version }, /* A */ + { ISFUNC, rl_do_lowercase_version }, /* B */ + { ISFUNC, rl_do_lowercase_version }, /* C */ + { ISFUNC, rl_do_lowercase_version }, /* D */ + { ISFUNC, rl_do_lowercase_version }, /* E */ + { ISFUNC, rl_do_lowercase_version }, /* F */ + { ISFUNC, rl_do_lowercase_version }, /* G */ + { ISFUNC, rl_do_lowercase_version }, /* H */ + { ISFUNC, rl_do_lowercase_version }, /* I */ + { ISFUNC, rl_do_lowercase_version }, /* J */ + { ISFUNC, rl_do_lowercase_version }, /* K */ + { ISFUNC, rl_do_lowercase_version }, /* L */ + { ISFUNC, rl_do_lowercase_version }, /* M */ + { ISFUNC, rl_do_lowercase_version }, /* N */ + { ISFUNC, rl_do_lowercase_version }, /* O */ + { ISFUNC, rl_do_lowercase_version }, /* P */ + { ISFUNC, rl_do_lowercase_version }, /* Q */ + { ISFUNC, rl_do_lowercase_version }, /* R */ + { ISFUNC, rl_do_lowercase_version }, /* S */ + { ISFUNC, rl_do_lowercase_version }, /* T */ + { ISFUNC, rl_do_lowercase_version }, /* U */ + { ISFUNC, rl_do_lowercase_version }, /* V */ + { ISFUNC, rl_do_lowercase_version }, /* W */ + { ISFUNC, rl_do_lowercase_version }, /* X */ + { ISFUNC, rl_do_lowercase_version }, /* Y */ + { ISFUNC, rl_do_lowercase_version }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, rl_arrow_keys }, /* [ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ + { ISFUNC, rl_arrow_keys }, /* o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ + { ISFUNC, rl_backward_kill_word }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; +#endif diff --git a/vi_mode.c b/vi_mode.c new file mode 100644 index 0000000..3a033ba --- /dev/null +++ b/vi_mode.c @@ -0,0 +1,2415 @@ +/* vi_mode.c -- A vi emulation mode for Bash. + Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */ + +/* Copyright (C) 1987-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +/* **************************************************************** */ +/* */ +/* VI Emulation Mode */ +/* */ +/* **************************************************************** */ +#include "rlconf.h" + +#if defined (VI_MODE) + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include + +/* Some standard library routines. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +#ifndef member +#define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0) +#endif + +/* Increment START to the next character in RL_LINE_BUFFER, handling multibyte chars */ +#if defined (HANDLE_MULTIBYTE) +#define INCREMENT_POS(start) \ + do { \ + if (MB_CUR_MAX == 1 || rl_byte_oriented) \ + start++; \ + else \ + start = _rl_find_next_mbchar (rl_line_buffer, start, 1, MB_FIND_ANY); \ + } while (0) +#else /* !HANDLE_MULTIBYTE */ +#define INCREMENT_POS(start) (start)++ +#endif /* !HANDLE_MULTIBYTE */ + +/* This is global so other parts of the code can check whether the last + command was a text modification command. */ +int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */ + +_rl_vimotion_cxt *_rl_vimvcxt = 0; + +/* Non-zero indicates we are redoing a vi-mode command with `.' */ +int _rl_vi_redoing; + +/* Non-zero means enter insertion mode. */ +static int _rl_vi_doing_insert; + +/* Command keys which do movement for xxx_to commands. */ +static const char * const vi_motion = " hl^$0ftFT;,%wbeWBE|`"; + +/* Keymap used for vi replace characters. Created dynamically since + rarely used. */ +static Keymap vi_replace_map; + +/* The number of characters inserted in the last replace operation. */ +static int vi_replace_count; + +/* If non-zero, we have text inserted after a c[motion] command that put + us implicitly into insert mode. Some people want this text to be + attached to the command so that it is `redoable' with `.'. */ +static int vi_continued_command; +static char *vi_insert_buffer; +static int vi_insert_buffer_size; + +static int _rl_vi_last_repeat = 1; +static int _rl_vi_last_arg_sign = 1; +static int _rl_vi_last_motion; +#if defined (HANDLE_MULTIBYTE) +static char _rl_vi_last_search_mbchar[MB_LEN_MAX]; +static int _rl_vi_last_search_mblen; +#else +static int _rl_vi_last_search_char; +#endif +static char _rl_vi_last_replacement[MB_LEN_MAX+1]; /* reserve for trailing NULL */ + +static int _rl_vi_last_key_before_insert; + +/* Text modification commands. These are the `redoable' commands. */ +static const char * const vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; + +/* Arrays for the saved marks. */ +static int vi_mark_chars['z' - 'a' + 1]; + +static void _rl_vi_replace_insert (int); +static void _rl_vi_save_replace (void); +static void _rl_vi_stuff_insert (int); +static void _rl_vi_save_insert (UNDO_LIST *); + +static void vi_save_insert_buffer (int, int); + +static inline void _rl_vi_backup (void); + +static int _rl_vi_arg_dispatch (int); +static int rl_digit_loop1 (void); + +static int _rl_vi_set_mark (void); +static int _rl_vi_goto_mark (void); + +static inline int _rl_vi_advance_point (void); +static inline int _rl_vi_backup_point (void); + +static void _rl_vi_append_forward (int); + +static int _rl_vi_callback_getchar (char *, int); + +#if defined (READLINE_CALLBACKS) +static int _rl_vi_callback_set_mark (_rl_callback_generic_arg *); +static int _rl_vi_callback_goto_mark (_rl_callback_generic_arg *); +static int _rl_vi_callback_change_char (_rl_callback_generic_arg *); +static int _rl_vi_callback_char_search (_rl_callback_generic_arg *); +#endif + +static int rl_domove_read_callback (_rl_vimotion_cxt *); +static int rl_domove_motion_callback (_rl_vimotion_cxt *); +static int rl_vi_domove_getchar (_rl_vimotion_cxt *); + +static int vi_change_dispatch (_rl_vimotion_cxt *); +static int vi_delete_dispatch (_rl_vimotion_cxt *); +static int vi_yank_dispatch (_rl_vimotion_cxt *); + +static int vidomove_dispatch (_rl_vimotion_cxt *); + +void +_rl_vi_initialize_line (void) +{ + register int i, n; + + n = sizeof (vi_mark_chars) / sizeof (vi_mark_chars[0]); + for (i = 0; i < n; i++) + vi_mark_chars[i] = -1; + + RL_UNSETSTATE(RL_STATE_VICMDONCE); +} + +void +_rl_vi_reset_last (void) +{ + _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 (int key, int repeat, int sign) +{ + _rl_vi_last_command = key; + _rl_vi_last_repeat = repeat; + _rl_vi_last_arg_sign = sign; +} + +/* A convenience function that calls _rl_vi_set_last to save the last command + information and enters insertion mode. */ +void +rl_vi_start_inserting (int key, int repeat, int sign) +{ + _rl_vi_set_last (key, repeat, sign); + rl_begin_undo_group (); /* ensure inserts aren't concatenated */ + rl_vi_insertion_mode (1, key); +} + +/* Is the command C a VI mode text modification command? */ +int +_rl_vi_textmod_command (int c) +{ + return (member (c, vi_textmod)); +} + +int +_rl_vi_motion_command (int c) +{ + return (member (c, vi_motion)); +} + +static void +_rl_vi_replace_insert (int count) +{ + int nchars; + + nchars = strlen (vi_insert_buffer); + + rl_begin_undo_group (); + while (count--) + /* nchars-1 to compensate for _rl_replace_text using `end+1' in call + to rl_delete_text */ + _rl_replace_text (vi_insert_buffer, rl_point, rl_point+nchars-1); + rl_end_undo_group (); +} + +static void +_rl_vi_stuff_insert (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 (int count, int c) +{ + int r; + + if (rl_explicit_arg == 0) + { + rl_numeric_arg = _rl_vi_last_repeat; + rl_arg_sign = _rl_vi_last_arg_sign; + } + + r = 0; + _rl_vi_redoing = 1; + /* If we're redoing an insert with `i', stuff in the inserted text + and do not go into insertion mode. */ + if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer) + { + _rl_vi_stuff_insert (count); + /* And back up point over the last character inserted. */ + if (rl_point > 0) + _rl_vi_backup (); + } + else if (_rl_vi_last_command == 'R' && vi_insert_buffer && *vi_insert_buffer) + { + _rl_vi_replace_insert (count); + /* And back up point over the last character inserted. */ + if (rl_point > 0) + _rl_vi_backup (); + } + /* Ditto for redoing an insert with `I', but move to the beginning of the + line like the `I' command does. */ + else if (_rl_vi_last_command == 'I' && vi_insert_buffer && *vi_insert_buffer) + { + rl_beg_of_line (1, 'I'); + _rl_vi_stuff_insert (count); + if (rl_point > 0) + _rl_vi_backup (); + } + /* Ditto for redoing an insert with `a', but move forward a character first + like the `a' command does. */ + else if (_rl_vi_last_command == 'a' && vi_insert_buffer && *vi_insert_buffer) + { + _rl_vi_append_forward ('a'); + _rl_vi_stuff_insert (count); + if (rl_point > 0) + _rl_vi_backup (); + } + /* Ditto for redoing an insert with `A', but move to the end of the line + like the `A' command does. */ + else if (_rl_vi_last_command == 'A' && vi_insert_buffer && *vi_insert_buffer) + { + rl_end_of_line (1, 'A'); + _rl_vi_stuff_insert (count); + if (rl_point > 0) + _rl_vi_backup (); + } + else if (_rl_vi_last_command == '.' && _rl_keymap == vi_movement_keymap) + { + rl_ding (); + r = 0; + } + else + r = _rl_dispatch (_rl_vi_last_command, _rl_keymap); + + _rl_vi_redoing = 0; + + return (r); +} + +/* A placeholder for further expansion. */ +int +rl_vi_undo (int count, int 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 (int count, int 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, key); + else + rl_yank_nth_arg ('$', key); + + return (0); +} + +/* With an argument, move back that many history lines, else move to the + beginning of history. */ +int +rl_vi_fetch_history (int count, int c) +{ + return (rl_fetch_history (count, c)); +} + +/* Search again for the last thing searched for. */ +int +rl_vi_search_again (int count, int 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 (int count, int key) +{ + switch (key) + { + case '?': + _rl_free_saved_history_line (); + rl_noninc_forward_search (count, key); + break; + + case '/': + _rl_free_saved_history_line (); + rl_noninc_reverse_search (count, key); + break; + + default: + rl_ding (); + break; + } + return (0); +} + +/* Completion, from vi's point of view. */ +int +rl_vi_complete (int ignore, int 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_vi_advance_point (); + } + + if (key == '*') + rl_complete_internal ('*'); /* Expansion and replacement. */ + else if (key == '=') + rl_complete_internal ('?'); /* List possible completions. */ + else if (key == '\\') + rl_complete_internal (TAB); /* Standard Readline completion. */ + else + rl_complete (0, key); + + if (key == '*' || key == '\\') + rl_vi_start_inserting (key, 1, rl_arg_sign); + + return (0); +} + +/* Tilde expansion for vi mode. */ +int +rl_vi_tilde_expand (int ignore, int key) +{ + rl_tilde_expand (0, key); + rl_vi_start_inserting (key, 1, rl_arg_sign); + return (0); +} + +/* Previous word in vi mode. */ +int +rl_vi_prev_word (int count, int key) +{ + if (count < 0) + return (rl_vi_next_word (-count, key)); + + if (rl_point == 0) + { + rl_ding (); + return (0); + } + + if (_rl_uppercase_p (key)) + rl_vi_bWord (count, key); + else + rl_vi_bword (count, key); + + return (0); +} + +/* Next word in vi mode. */ +int +rl_vi_next_word (int count, int key) +{ + if (count < 0) + return (rl_vi_prev_word (-count, key)); + + if (rl_point >= (rl_end - 1)) + { + rl_ding (); + return (0); + } + + if (_rl_uppercase_p (key)) + rl_vi_fWord (count, key); + else + rl_vi_fword (count, key); + return (0); +} + +static inline int +_rl_vi_advance_point (void) +{ + int point; + + point = rl_point; + if (rl_point < rl_end) +#if defined (HANDLE_MULTIBYTE) + { + if (MB_CUR_MAX == 1 || rl_byte_oriented) + rl_point++; + else + { + point = rl_point; + rl_point = _rl_forward_char_internal (1); + if (point == rl_point || rl_point > rl_end) + rl_point = rl_end; + } + } +#else + rl_point++; +#endif + + return point; +} + +/* Move the cursor back one character. */ +static inline void +_rl_vi_backup (void) +{ + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + else + rl_point--; +} + +/* Move the point back one character, returning the starting value and not + doing anything at the beginning of the line */ +static inline int +_rl_vi_backup_point (void) +{ + int point; + + point = rl_point; + if (rl_point > 0) +#if defined (HANDLE_MULTIBYTE) + { + if (MB_CUR_MAX == 1 || rl_byte_oriented) + rl_point--; + else + { + point = rl_point; + rl_point = _rl_backward_char_internal (1); + if (rl_point < 0) + rl_point = 0; /* XXX - not really necessary */ + } + } +#else + rl_point--; +#endif + return point; +} + +/* Move to the end of the ?next? word. */ +int +rl_vi_end_word (int count, int key) +{ + if (count < 0) + { + rl_ding (); + return 1; + } + + if (_rl_uppercase_p (key)) + rl_vi_eWord (count, key); + else + rl_vi_eword (count, key); + return (0); +} + +/* Move forward a word the way that 'W' does. */ +int +rl_vi_fWord (int count, int ignore) +{ + while (count-- && rl_point < (rl_end - 1)) + { + /* Skip until whitespace. */ + while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + _rl_vi_advance_point (); + + /* Now skip whitespace. */ + while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + _rl_vi_advance_point (); + } + return (0); +} + +int +rl_vi_bWord (int count, int 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_vi_backup_point (); + + if (rl_point > 0) + { + do + _rl_vi_backup_point (); + while (rl_point > 0 && !whitespace (rl_line_buffer[rl_point])); + if (rl_point > 0) /* hit whitespace */ + rl_point++; + + if (rl_point < 0) + rl_point = 0; + } + } + return (0); +} + +int +rl_vi_eWord (int count, int ignore) +{ + int opoint; + + while (count-- && rl_point < (rl_end - 1)) + { + if (whitespace (rl_line_buffer[rl_point]) == 0) + _rl_vi_advance_point (); + + /* Move to the next non-whitespace character (to the start of the + next word). */ + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + _rl_vi_advance_point (); + + if (rl_point && rl_point < rl_end) + { + opoint = rl_point; + + /* Skip whitespace. */ + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + opoint = _rl_vi_advance_point (); /* XXX - why? */ + + /* Skip until whitespace. */ + while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point])) + opoint = _rl_vi_advance_point (); + + /* Move back to the last character of the word. */ + rl_point = opoint; + } + } + return (0); +} + +int +rl_vi_fword (int count, int ignore) +{ + int opoint; + + while (count-- && rl_point < (rl_end - 1)) + { + /* Move to white space (really non-identifer). */ + if (_rl_isident (rl_line_buffer[rl_point])) + { + while (_rl_isident (rl_line_buffer[rl_point]) && rl_point < rl_end) + _rl_vi_advance_point (); + } + else /* if (!whitespace (rl_line_buffer[rl_point])) */ + { + while (!_rl_isident (rl_line_buffer[rl_point]) && + !whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + _rl_vi_advance_point (); + } + + opoint = rl_point; + + /* Move past whitespace. */ + while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + opoint = _rl_vi_advance_point (); + } + return (0); +} + +int +rl_vi_bword (int count, int ignore) +{ + int opoint; + + while (count-- && rl_point > 0) + { + int prev_is_ident, cur_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])) + if (--rl_point == 0) + break; + + /* 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. */ + cur_is_ident = _rl_isident (rl_line_buffer[rl_point]); + opoint = _rl_vi_backup_point (); + prev_is_ident = _rl_isident (rl_line_buffer[rl_point]); + if ((cur_is_ident && !prev_is_ident) || (!cur_is_ident && prev_is_ident)) + ; /* leave point alone, we backed it up one character */ + else + rl_point = opoint; + + while (rl_point > 0 && whitespace (rl_line_buffer[rl_point])) + _rl_vi_backup_point (); + + if (rl_point > 0) + { + opoint = rl_point; + if (_rl_isident (rl_line_buffer[rl_point])) + do + opoint = _rl_vi_backup_point (); + while (rl_point > 0 && _rl_isident (rl_line_buffer[rl_point])); + else + do + opoint = _rl_vi_backup_point (); + while (rl_point > 0 && !_rl_isident (rl_line_buffer[rl_point]) && + !whitespace (rl_line_buffer[rl_point])); + + if (rl_point > 0) + rl_point = opoint; + + if (rl_point < 0) + rl_point = 0; + } + } + return (0); +} + +int +rl_vi_eword (int count, int ignore) +{ + int opoint; + + while (count-- && rl_point < (rl_end - 1)) + { + if (whitespace (rl_line_buffer[rl_point]) == 0) + _rl_vi_advance_point (); + + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + _rl_vi_advance_point (); + + opoint = rl_point; + if (rl_point < rl_end) + { + if (_rl_isident (rl_line_buffer[rl_point])) + do + { + opoint = _rl_vi_advance_point (); + } + while (rl_point < rl_end && _rl_isident (rl_line_buffer[rl_point])); + else + do + { + opoint = _rl_vi_advance_point (); + } + while (rl_point < rl_end && !_rl_isident (rl_line_buffer[rl_point]) + && !whitespace (rl_line_buffer[rl_point])); + } + rl_point = opoint; + } + return (0); +} + +int +rl_vi_insert_beg (int count, int key) +{ + rl_beg_of_line (1, key); + rl_vi_insert_mode (1, key); + return (0); +} + +static void +_rl_vi_append_forward (int key) +{ + _rl_vi_advance_point (); +} + +int +rl_vi_append_mode (int count, int key) +{ + _rl_vi_append_forward (key); + rl_vi_start_inserting (key, 1, rl_arg_sign); + return (0); +} + +int +rl_vi_append_eol (int count, int 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 (int count, int 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 (int count, int key) +{ + _rl_keymap = vi_insertion_keymap; + _rl_vi_last_key_before_insert = key; + if (_rl_show_mode_in_prompt) + _rl_reset_prompt (); + return (0); +} + +int +rl_vi_insert_mode (int count, int key) +{ + rl_vi_start_inserting (key, 1, rl_arg_sign); + return (0); +} + +static void +vi_save_insert_buffer (int start, int len) +{ + /* Same code as _rl_vi_save_insert below */ + if (len >= vi_insert_buffer_size) + { + vi_insert_buffer_size += (len + 32) - (len % 32); + vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size); + } + strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1); + vi_insert_buffer[len-1] = '\0'; +} + +static void +_rl_vi_save_replace (void) +{ + int len, start, end; + UNDO_LIST *up; + + up = rl_undo_list; + if (up == 0 || up->what != UNDO_END || vi_replace_count <= 0) + { + if (vi_insert_buffer_size >= 1) + vi_insert_buffer[0] = '\0'; + return; + } + /* Let's try it the quick and easy way for now. This should essentially + accommodate every UNDO_INSERT and save the inserted text to + vi_insert_buffer */ + end = rl_point; + start = end - vi_replace_count + 1; + len = vi_replace_count + 1; + + if (start < 0) + { + len = end + 1; + start = 0; + } + + vi_save_insert_buffer (start, len); +} + +static void +_rl_vi_save_insert (UNDO_LIST *up) +{ + int len, start, end; + + if (up == 0 || up->what != UNDO_INSERT) + { + if (vi_insert_buffer_size >= 1) + vi_insert_buffer[0] = '\0'; + return; + } + + start = up->start; + end = up->end; + len = end - start + 1; + + vi_save_insert_buffer (start, len); +} + +void +_rl_vi_done_inserting (void) +{ + if (_rl_vi_doing_insert) + { + /* The `c', `s', `S', and `R' commands set this. */ + rl_end_undo_group (); /* for the group in rl_vi_start_inserting */ + /* 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; + if (_rl_vi_last_key_before_insert == 'R') + _rl_vi_save_replace (); /* Half the battle */ + else + _rl_vi_save_insert (rl_undo_list->next); + /* sanity check, should always be >= 1 here */ + if (_rl_undo_group_level > 0) + rl_end_undo_group (); /* for the group in the command (change or replace) */ + } + else + { + if (rl_undo_list && (_rl_vi_last_key_before_insert == 'i' || + _rl_vi_last_key_before_insert == 'a' || + _rl_vi_last_key_before_insert == 'I' || + _rl_vi_last_key_before_insert == 'A')) + _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 (); + } + + /* Sanity check, make sure all the undo groups are closed before we leave + insert mode */ + while (_rl_undo_group_level > 0) + rl_end_undo_group (); +} + +int +rl_vi_movement_mode (int count, int key) +{ + if (rl_point > 0) + rl_backward_char (1, key); + + _rl_keymap = vi_movement_keymap; + _rl_vi_done_inserting (); + + /* This is how POSIX.2 says `U' should behave -- everything up until the + first time you go into command mode should not be undone. */ + if (RL_ISSTATE (RL_STATE_VICMDONCE) == 0) + rl_free_undo_list (); + + if (_rl_show_mode_in_prompt) + _rl_reset_prompt (); + + RL_SETSTATE (RL_STATE_VICMDONCE); + return (0); +} + +int +rl_vi_arg_digit (int count, int c) +{ + if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg) + return (rl_beg_of_line (1, c)); + else + return (rl_digit_argument (count, c)); +} + +/* Change the case of the next COUNT characters. */ +#if defined (HANDLE_MULTIBYTE) +static int +_rl_vi_change_mbchar_case (int count) +{ + WCHAR_T wc; + char mb[MB_LEN_MAX+1]; + int mlen, p; + size_t m; + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); + if (_rl_adjust_point (rl_line_buffer, rl_point, &ps) > 0) + count--; + while (count-- && rl_point < rl_end) + { + m = MBRTOWC (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps); + if (MB_INVALIDCH (m)) + wc = (WCHAR_T)rl_line_buffer[rl_point]; + else if (MB_NULLWCH (m)) + wc = L'\0'; + if (iswupper (wc)) + wc = towlower (wc); + else if (iswlower (wc)) + wc = towupper (wc); + else + { + /* Just skip over chars neither upper nor lower case */ + rl_forward_char (1, 0); + continue; + } + + /* Vi is kind of strange here. */ + if (wc) + { + p = rl_point; + mlen = WCRTOMB (mb, wc, &ps); + if (mlen >= 0) + mb[mlen] = '\0'; + rl_begin_undo_group (); + rl_vi_delete (1, 0); + if (rl_point < p) /* Did we retreat at EOL? */ + _rl_vi_advance_point (); + rl_insert_text (mb); + rl_end_undo_group (); + rl_vi_check (); + } + else + rl_forward_char (1, 0); + } + + return 0; +} +#endif + +int +rl_vi_change_case (int count, int ignore) +{ + int c, p; + + /* Don't try this on an empty line. */ + if (rl_point >= rl_end) + return (0); + + c = 0; +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + return (_rl_vi_change_mbchar_case (count)); +#endif + + while (count-- && rl_point < rl_end) + { + if (_rl_uppercase_p (rl_line_buffer[rl_point])) + c = _rl_to_lower (rl_line_buffer[rl_point]); + else if (_rl_lowercase_p (rl_line_buffer[rl_point])) + c = _rl_to_upper (rl_line_buffer[rl_point]); + else + { + /* Just skip over characters neither upper nor lower case. */ + rl_forward_char (1, c); + continue; + } + + /* Vi is kind of strange here. */ + if (c) + { + p = rl_point; + rl_begin_undo_group (); + rl_vi_delete (1, c); + if (rl_point < p) /* Did we retreat at EOL? */ + rl_point++; + _rl_insert_char (1, c); + rl_end_undo_group (); + rl_vi_check (); + } + else + rl_forward_char (1, c); + } + return (0); +} + +int +rl_vi_put (int count, int key) +{ + if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end)) + rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + + while (count--) + rl_yank (1, key); + + rl_backward_char (1, key); + return (0); +} + +/* Move the cursor back one character if you're at the end of the line */ +int +rl_vi_check (void) +{ + if (rl_point && rl_point == rl_end) + _rl_vi_backup (); + return (0); +} + +/* Move to the character position specified by COUNT */ +int +rl_vi_column (int count, int key) +{ + if (count > rl_end) + rl_end_of_line (1, key); + else + { + rl_point = 0; + rl_point = _rl_forward_char_internal (count - 1); + } + return (0); +} + +/* Process C as part of the current numeric argument. Return -1 if the + argument should be aborted, 0 if we should not read any more chars, and + 1 if we should continue to read chars. */ +static int +_rl_vi_arg_dispatch (int c) +{ + int key; + + key = c; + if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument) + { + rl_numeric_arg *= 4; + return 1; + } + + c = UNMETA (c); + + if (_rl_digit_p (c)) + { + if (rl_explicit_arg) + rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c); + else + rl_numeric_arg = _rl_digit_value (c); + rl_explicit_arg = 1; + return 1; /* keep going */ + } + else + { + rl_clear_message (); + rl_stuff_char (key); + return 0; /* done */ + } +} + +/* A simplified loop for vi. Don't dispatch key at end. + Don't recognize minus sign? + Should this do rl_save_prompt/rl_restore_prompt? */ +static int +rl_digit_loop1 (void) +{ + int c, r; + + while (1) + { + if (_rl_arg_overflow ()) + return 1; + + c = _rl_arg_getchar (); + + r = _rl_vi_arg_dispatch (c); + if (r <= 0) + break; + } + + RL_UNSETSTATE(RL_STATE_NUMERICARG); + return (0); +} + +/* This set of functions is basically to handle the commands that take a + motion argument while in callback mode: read the command, read the motion + command modifier, find the extent of the text to affect, and dispatch the + command for execution. */ +static void +_rl_mvcxt_init (_rl_vimotion_cxt *m, int op, int key) +{ + m->op = op; + m->state = m->flags = 0; + m->ncxt = 0; + m->numeric_arg = -1; + m->start = rl_point; + m->end = rl_end; + m->key = key; + m->motion = -1; +} + +static _rl_vimotion_cxt * +_rl_mvcxt_alloc (int op, int key) +{ + _rl_vimotion_cxt *m; + + m = xmalloc (sizeof (_rl_vimotion_cxt)); + _rl_mvcxt_init (m, op, key); + return m; +} + +static void +_rl_mvcxt_dispose (_rl_vimotion_cxt *m) +{ + xfree (m); +} + +static int +rl_domove_motion_callback (_rl_vimotion_cxt *m) +{ + int c; + + _rl_vi_last_motion = c = m->motion; + + /* Append a blank character temporarily so that the motion routines + work right at the end of the line. Original value of rl_end is saved + as m->end. */ + rl_extend_line_buffer (rl_end + 1); + rl_line_buffer[rl_end++] = ' '; + rl_line_buffer[rl_end] = '\0'; + + _rl_dispatch (c, _rl_keymap); + +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + /* Messy case where char search can be vi motion command; see rest of + details in callback.c. vi_char_search and callback_char_search just + set and unset the CHARSEARCH state. This is where any vi motion + command that needs to set its own state should be handled, with any + corresponding code to manage that state in callback.c */ + if (RL_ISSTATE (RL_STATE_CHARSEARCH)) + return 0; + else + return (_rl_vi_domove_motion_cleanup (c, m)); + } +#endif + + return (_rl_vi_domove_motion_cleanup (c, m)); +} + +int +_rl_vi_domove_motion_cleanup (int c, _rl_vimotion_cxt *m) +{ + int r; + + /* Remove the blank that we added in rl_domove_motion_callback. */ + rl_end = m->end; + rl_line_buffer[rl_end] = '\0'; + _rl_fix_point (0); + + /* No change in position means the command failed. */ + if (rl_mark == rl_point) + { + /* 'c' and 'C' enter insert mode after the delete even if the motion + didn't delete anything, as long as the motion command is valid. */ + if (_rl_to_upper (m->key) == 'C' && _rl_vi_motion_command (c)) + return (vidomove_dispatch (m)); + RL_UNSETSTATE (RL_STATE_VIMOTION); + 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--; /* XXX */ + + /* 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 (m->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_vi_advance_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_vi_advance_point (); + } + } + + if (rl_mark < rl_point) + SWAP (rl_point, rl_mark); + +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + (*rl_redisplay_function)(); /* make sure motion is displayed */ +#endif + + r = vidomove_dispatch (m); + + return (r); +} + +#define RL_VIMOVENUMARG() (RL_ISSTATE (RL_STATE_VIMOTION) && RL_ISSTATE (RL_STATE_NUMERICARG)) + +static int +rl_domove_read_callback (_rl_vimotion_cxt *m) +{ + int c, save; + + c = m->motion; + + if (member (c, vi_motion)) + { +#if defined (READLINE_CALLBACKS) + /* If we just read a vi-mode motion command numeric argument, turn off + the `reading numeric arg' state */ + if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG()) + RL_UNSETSTATE (RL_STATE_NUMERICARG); +#endif + /* Should do everything, including turning off RL_STATE_VIMOTION */ + return (rl_domove_motion_callback (m)); + } + else if (m->key == c && (m->key == 'd' || m->key == 'y' || m->key == 'c')) + { + rl_mark = rl_end; + rl_beg_of_line (1, c); + _rl_vi_last_motion = c; + RL_UNSETSTATE (RL_STATE_VIMOTION); + return (vidomove_dispatch (m)); + } +#if defined (READLINE_CALLBACKS) + /* XXX - these need to handle rl_universal_argument bindings */ + /* Reading vi motion char continuing numeric argument */ + else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG()) + { + return (_rl_vi_arg_dispatch (c)); + } + /* Readine vi motion char starting numeric argument */ + else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_VIMOTION) && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)) + { + RL_SETSTATE (RL_STATE_NUMERICARG); + return (_rl_vi_arg_dispatch (c)); + } +#endif + else if (_rl_digit_p (c)) + { + /* This code path taken when not in callback mode */ + save = rl_numeric_arg; + rl_numeric_arg = _rl_digit_value (c); + rl_explicit_arg = 1; + RL_SETSTATE (RL_STATE_NUMERICARG); + rl_digit_loop1 (); + rl_numeric_arg *= save; + c = rl_vi_domove_getchar (m); + if (c < 0) + { + m->motion = 0; + return -1; + } + m->motion = c; + return (rl_domove_motion_callback (m)); + } + else + { + RL_UNSETSTATE (RL_STATE_VIMOTION); + RL_UNSETSTATE (RL_STATE_NUMERICARG); + return (1); + } +} + +static int +rl_vi_domove_getchar (_rl_vimotion_cxt *m) +{ + return (_rl_bracketed_read_key ()); +} + +#if defined (READLINE_CALLBACKS) +int +_rl_vi_domove_callback (_rl_vimotion_cxt *m) +{ + int c, r; + + m->motion = c = rl_vi_domove_getchar (m); + if (c < 0) + return 1; /* EOF */ + r = rl_domove_read_callback (m); + + return ((r == 0) ? r : 1); /* normalize return values */ +} +#endif + +/* This code path is taken when not in callback mode. */ +int +rl_vi_domove (int x, int *ignore) +{ + int r; + _rl_vimotion_cxt *m; + + m = _rl_vimvcxt; + *ignore = m->motion = rl_vi_domove_getchar (m); + + if (m->motion < 0) + { + m->motion = 0; + return -1; + } + + return (rl_domove_read_callback (m)); +} + +static int +vi_delete_dispatch (_rl_vimotion_cxt *m) +{ + /* These are the motion commands that do not require adjusting the + mark. */ + if (((strchr (" l|h^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) && + (rl_mark < rl_end)) + INCREMENT_POS (rl_mark); + + rl_kill_text (rl_point, rl_mark); + return (0); +} + +int +rl_vi_delete_to (int count, int key) +{ + int c, r; + _rl_vimotion_cxt *savecxt; + + savecxt = 0; + if (_rl_vi_redoing) + { + savecxt = _rl_vimvcxt; + _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key); + } + else if (_rl_vimvcxt) + _rl_mvcxt_init (_rl_vimvcxt, VIM_DELETE, key); + else + _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key); + + _rl_vimvcxt->start = rl_point; + + rl_mark = rl_point; + if (_rl_uppercase_p (key)) + { + _rl_vimvcxt->motion = '$'; + r = rl_domove_motion_callback (_rl_vimvcxt); + } + else if (_rl_vi_redoing && _rl_vi_last_motion != 'd') /* `dd' is special */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + r = rl_domove_motion_callback (_rl_vimvcxt); + } + else if (_rl_vi_redoing) /* handle redoing `dd' here */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + rl_mark = rl_end; + rl_beg_of_line (1, key); + RL_UNSETSTATE (RL_STATE_VIMOTION); + r = vidomove_dispatch (_rl_vimvcxt); + } +#if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + RL_SETSTATE (RL_STATE_VIMOTION); + return (0); + } +#endif + else + r = rl_vi_domove (key, &c); + + if (r < 0) + { + rl_ding (); + r = -1; + } + + _rl_mvcxt_dispose (_rl_vimvcxt); + _rl_vimvcxt = savecxt; + + return r; +} + +static int +vi_change_dispatch (_rl_vimotion_cxt *m) +{ + /* 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^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) && + (rl_mark < rl_end)) + INCREMENT_POS (rl_mark); + + /* The cursor never moves with c[wW]. */ + if ((_rl_to_upper (m->motion) == 'W') && rl_point < m->start) + rl_point = m->start; + + if (_rl_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 (m->key) == 0) + _rl_vi_doing_insert = 1; + /* XXX -- TODO -- use m->numericarg? */ + rl_vi_start_inserting (m->key, rl_numeric_arg, rl_arg_sign); + } + + return (0); +} + +int +rl_vi_change_to (int count, int key) +{ + int c, r; + _rl_vimotion_cxt *savecxt; + + savecxt = 0; + if (_rl_vi_redoing) + { + savecxt = _rl_vimvcxt; + _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key); + } + else if (_rl_vimvcxt) + _rl_mvcxt_init (_rl_vimvcxt, VIM_CHANGE, key); + else + _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key); + _rl_vimvcxt->start = rl_point; + + rl_mark = rl_point; + if (_rl_uppercase_p (key)) + { + _rl_vimvcxt->motion = '$'; + r = rl_domove_motion_callback (_rl_vimvcxt); + } + else if (_rl_vi_redoing && _rl_vi_last_motion != 'c') /* `cc' is special */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + r = rl_domove_motion_callback (_rl_vimvcxt); + } + else if (_rl_vi_redoing) /* handle redoing `cc' here */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + rl_mark = rl_end; + rl_beg_of_line (1, key); + RL_UNSETSTATE (RL_STATE_VIMOTION); + r = vidomove_dispatch (_rl_vimvcxt); + } +#if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + RL_SETSTATE (RL_STATE_VIMOTION); + return (0); + } +#endif + else + r = rl_vi_domove (key, &c); + + if (r < 0) + { + rl_ding (); + r = -1; /* normalize return value */ + } + + _rl_mvcxt_dispose (_rl_vimvcxt); + _rl_vimvcxt = savecxt; + + return r; +} + +static int +vi_yank_dispatch (_rl_vimotion_cxt *m) +{ + /* These are the motion commands that do not require adjusting the + mark. */ + if (((strchr (" l|h^0%bBFT`", m->motion) == 0) && (rl_point >= m->start)) && + (rl_mark < rl_end)) + INCREMENT_POS (rl_mark); + + rl_begin_undo_group (); + rl_kill_text (rl_point, rl_mark); + rl_end_undo_group (); + rl_do_undo (); + rl_point = m->start; + + _rl_fix_point (1); + + return (0); +} + +int +rl_vi_yank_to (int count, int key) +{ + int c, r; + _rl_vimotion_cxt *savecxt; + + savecxt = 0; + if (_rl_vi_redoing) + { + savecxt = _rl_vimvcxt; + _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key); + } + else if (_rl_vimvcxt) + _rl_mvcxt_init (_rl_vimvcxt, VIM_YANK, key); + else + _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key); + _rl_vimvcxt->start = rl_point; + + rl_mark = rl_point; + if (_rl_uppercase_p (key)) + { + _rl_vimvcxt->motion = '$'; + r = rl_domove_motion_callback (_rl_vimvcxt); + } + else if (_rl_vi_redoing && _rl_vi_last_motion != 'y') /* `yy' is special */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + r = rl_domove_motion_callback (_rl_vimvcxt); + } + else if (_rl_vi_redoing) /* handle redoing `yy' here */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + rl_mark = rl_end; + rl_beg_of_line (1, key); + RL_UNSETSTATE (RL_STATE_VIMOTION); + r = vidomove_dispatch (_rl_vimvcxt); + } +#if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + RL_SETSTATE (RL_STATE_VIMOTION); + return (0); + } +#endif + else + r = rl_vi_domove (key, &c); + + if (r < 0) + { + rl_ding (); + r = -1; + } + + _rl_mvcxt_dispose (_rl_vimvcxt); + _rl_vimvcxt = savecxt; + + return r; +} + +static int +vidomove_dispatch (_rl_vimotion_cxt *m) +{ + int r; + + switch (m->op) + { + case VIM_DELETE: + r = vi_delete_dispatch (m); + break; + case VIM_CHANGE: + r = vi_change_dispatch (m); + break; + case VIM_YANK: + r = vi_yank_dispatch (m); + break; + default: + _rl_errmsg ("vidomove_dispatch: unknown operator %d", m->op); + r = 1; + break; + } + + RL_UNSETSTATE (RL_STATE_VIMOTION); + return r; +} + +int +rl_vi_rubout (int count, int key) +{ + int opoint; + + if (count < 0) + return (rl_vi_delete (-count, key)); + + if (rl_point == 0) + { + rl_ding (); + return 1; + } + + opoint = rl_point; + if (count > 1 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_backward_char (count, key); + else if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + else + rl_point -= count; + + if (rl_point < 0) + rl_point = 0; + + rl_kill_text (rl_point, opoint); + + return (0); +} + +int +rl_vi_delete (int count, int key) +{ + int end; + + if (count < 0) + return (rl_vi_rubout (-count, key)); + + if (rl_end == 0) + { + rl_ding (); + return 1; + } + + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); + else + end = rl_point + count; + + if (end >= rl_end) + end = rl_end; + + rl_kill_text (rl_point, end); + + if (rl_point > 0 && rl_point == rl_end) + rl_backward_char (1, key); + + return (0); +} + +/* This does what Posix specifies vi-mode C-w to do: using whitespace and + punctuation characters as the word boundaries. */ + +#define vi_unix_word_boundary(c) (whitespace(c) || ispunct(c)) + +int +rl_vi_unix_word_rubout (int count, int key) +{ + int orig_point; + + if (rl_point == 0) + rl_ding (); + else + { + orig_point = rl_point; + if (count <= 0) + count = 1; + + while (count--) + { + /* This isn't quite what ksh93 does but it seems to match what the + Posix description of sh specifies, with a few accommodations + for sequences of whitespace characters between words and at + the end of the line. */ + + /* Skip over whitespace at the end of the line as a special case */ + if (rl_point > 0 && (rl_line_buffer[rl_point] == 0) && + whitespace (rl_line_buffer[rl_point - 1])) + while (--rl_point > 0 && whitespace (rl_line_buffer[rl_point])) + ; + + /* If we're at the start of a word, move back to word boundary so we + move back to the `preceding' word */ + if (rl_point > 0 && (vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0) && + vi_unix_word_boundary (rl_line_buffer[rl_point - 1])) + rl_point--; + + /* If we are at a word boundary (whitespace/punct), move backward + past a sequence of word boundary characters. If we are at the + end of a word (non-word boundary), move back to a word boundary */ + if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point])) + while (rl_point && vi_unix_word_boundary (rl_line_buffer[rl_point - 1])) + rl_point--; + else if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0) + while (rl_point > 0 && (vi_unix_word_boundary (rl_line_buffer[rl_point - 1]) == 0)) + _rl_vi_backup_point (); + } + + rl_kill_text (orig_point, rl_point); + } + + return 0; +} + + +int +rl_vi_back_to_indent (int count, int 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 (int count, int key) +{ + return (rl_vi_back_to_indent (1, key)); +} + +static int _rl_cs_dir, _rl_cs_orig_dir; + +#if defined (READLINE_CALLBACKS) +static int +_rl_vi_callback_char_search (_rl_callback_generic_arg *data) +{ + int c; +#if defined (HANDLE_MULTIBYTE) + c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); +#else + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); +#endif + + if (c <= 0) + { + RL_UNSETSTATE (RL_STATE_CHARSEARCH); + return -1; + } + +#if !defined (HANDLE_MULTIBYTE) + _rl_vi_last_search_char = c; +#endif + + _rl_callback_func = 0; + _rl_want_redisplay = 1; + RL_UNSETSTATE (RL_STATE_CHARSEARCH); + +#if defined (HANDLE_MULTIBYTE) + return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_mbchar, _rl_vi_last_search_mblen)); +#else + return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_char)); +#endif +} +#endif + +int +rl_vi_char_search (int count, int key) +{ + int c; +#if defined (HANDLE_MULTIBYTE) + static char *target; + static int tlen; +#else + static char target; +#endif + + if (key == ';' || key == ',') + { + if (_rl_cs_orig_dir == 0) + return 1; +#if defined (HANDLE_MULTIBYTE) + if (_rl_vi_last_search_mblen == 0) + return 1; +#else + if (_rl_vi_last_search_char == 0) + return 1; +#endif + _rl_cs_dir = (key == ';') ? _rl_cs_orig_dir : -_rl_cs_orig_dir; + } + else + { + switch (key) + { + case 't': + _rl_cs_orig_dir = _rl_cs_dir = FTO; + break; + + case 'T': + _rl_cs_orig_dir = _rl_cs_dir = BTO; + break; + + case 'f': + _rl_cs_orig_dir = _rl_cs_dir = FFIND; + break; + + case 'F': + _rl_cs_orig_dir = _rl_cs_dir = BFIND; + break; + } + + if (_rl_vi_redoing) + { + /* set target and tlen below */ + } +#if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_callback_data = _rl_callback_data_alloc (count); + _rl_callback_data->i1 = _rl_cs_dir; + _rl_callback_data->i2 = key; + _rl_callback_func = _rl_vi_callback_char_search; + RL_SETSTATE (RL_STATE_CHARSEARCH); + return (0); + } +#endif + else + { +#if defined (HANDLE_MULTIBYTE) + c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); + if (c <= 0) + return -1; + _rl_vi_last_search_mblen = c; +#else + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + if (c < 0) + return -1; + _rl_vi_last_search_char = c; +#endif + } + } + +#if defined (HANDLE_MULTIBYTE) + target = _rl_vi_last_search_mbchar; + tlen = _rl_vi_last_search_mblen; +#else + target = _rl_vi_last_search_char; +#endif + +#if defined (HANDLE_MULTIBYTE) + return (_rl_char_search_internal (count, _rl_cs_dir, target, tlen)); +#else + return (_rl_char_search_internal (count, _rl_cs_dir, target)); +#endif +} + +/* Match brackets */ +int +rl_vi_match (int ignore, int key) +{ + int count = 1, brack, pos, tmp, pre; + + pos = rl_point; + if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) + { + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) + { + pre = rl_point; + rl_forward_char (1, key); + if (pre == rl_point) + break; + } + } + else + while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 && + rl_point < rl_end - 1) + rl_forward_char (1, key); + + if (brack <= 0) + { + rl_point = pos; + rl_ding (); + return 1; + } + } + + pos = rl_point; + + if (brack < 0) + { + while (count) + { + tmp = pos; + if (MB_CUR_MAX == 1 || rl_byte_oriented) + pos--; + else + { + pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); + if (tmp == pos) + pos--; + } + if (pos >= 0) + { + int b = rl_vi_bracktype (rl_line_buffer[pos]); + if (b == -brack) + count--; + else if (b == brack) + count++; + } + else + { + rl_ding (); + return 1; + } + } + } + else + { /* brack > 0 */ + while (count) + { + if (MB_CUR_MAX == 1 || rl_byte_oriented) + pos++; + else + pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY); + + if (pos < rl_end) + { + int b = rl_vi_bracktype (rl_line_buffer[pos]); + if (b == -brack) + count--; + else if (b == brack) + count++; + } + else + { + rl_ding (); + return 1; + } + } + } + rl_point = pos; + return (0); +} + +int +rl_vi_bracktype (int c) +{ + switch (c) + { + case '(': return 1; + case ')': return -1; + case '[': return 2; + case ']': return -2; + case '{': return 3; + case '}': return -3; + default: return 0; + } +} + +static int +_rl_vi_change_char (int count, int c, char *mb) +{ + int p; + + if (c == '\033' || c == CTRL ('C')) + return -1; + + rl_begin_undo_group (); + while (count-- && rl_point < rl_end) + { + p = rl_point; + rl_vi_delete (1, c); + if (rl_point < p) /* Did we retreat at EOL? */ + _rl_vi_append_forward (c); +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_insert_text (mb); + else +#endif + _rl_insert_char (1, c); + } + + /* The cursor shall be left on the last character changed. */ + rl_backward_char (1, c); + + rl_end_undo_group (); + + return (0); +} + +static int +_rl_vi_callback_getchar (char *mb, int mlen) +{ + return (_rl_bracketed_read_mbstring (mb, mlen)); +} + +#if defined (READLINE_CALLBACKS) +static int +_rl_vi_callback_change_char (_rl_callback_generic_arg *data) +{ + int c; + char mb[MB_LEN_MAX+1]; + + c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); + if (c < 0) + return -1; + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + strncpy (_rl_vi_last_replacement, mb, MB_LEN_MAX); + else +#endif + _rl_vi_last_replacement[0] = c; + _rl_vi_last_replacement[MB_LEN_MAX] = '\0'; /* XXX */ + + _rl_callback_func = 0; + _rl_want_redisplay = 1; + + return (_rl_vi_change_char (data->count, c, mb)); +} +#endif + +int +rl_vi_change_char (int count, int key) +{ + int c; + char mb[MB_LEN_MAX+1]; + + if (_rl_vi_redoing) + { + strncpy (mb, _rl_vi_last_replacement, MB_LEN_MAX); + c = (unsigned char)_rl_vi_last_replacement[0]; /* XXX */ + mb[MB_LEN_MAX] = '\0'; + } +#if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_callback_data = _rl_callback_data_alloc (count); + _rl_callback_func = _rl_vi_callback_change_char; + return (0); + } +#endif + else + { + c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); + if (c < 0) + return -1; +#ifdef HANDLE_MULTIBYTE + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + strncpy (_rl_vi_last_replacement, mb, MB_LEN_MAX); + else +#endif + _rl_vi_last_replacement[0] = c; + _rl_vi_last_replacement[MB_LEN_MAX] = '\0'; /* just in case */ + } + + if (c < 0) + return -1; + + return (_rl_vi_change_char (count, c, mb)); +} + +int +rl_vi_subst (int count, int key) +{ + /* If we are redoing, rl_vi_change_to will stuff the last motion char */ + if (_rl_vi_redoing == 0) + rl_stuff_char ((key == 'S') ? 'c' : 'l'); /* `S' == `cc', `s' == `cl' */ + + return (rl_vi_change_to (count, 'c')); +} + +int +rl_vi_overstrike (int count, int key) +{ + if (_rl_vi_doing_insert == 0) + { + _rl_vi_doing_insert = 1; + rl_begin_undo_group (); + } + + if (count > 0) + { + if (_rl_overwrite_char (count, key) != 0) + return (1); + vi_replace_count += count; + } + + return (0); +} + +int +rl_vi_overstrike_delete (int count, int key) +{ + int i, s; + + for (i = 0; i < count; i++) + { + if (vi_replace_count == 0) + { + rl_ding (); + break; + } + s = rl_point; + + if (rl_do_undo ()) + vi_replace_count--; /* XXX */ + + if (rl_point == s) + rl_backward_char (1, key); + } + + if (vi_replace_count == 0 && _rl_vi_doing_insert) + { + rl_end_undo_group (); + rl_do_undo (); + _rl_vi_doing_insert = 0; + } + return (0); +} + +static int +rl_vi_overstrike_kill_line (int count, int key) +{ + int r, end; + + end = rl_end; + r = rl_unix_line_discard (count, key); + vi_replace_count -= end - rl_end; + return r; +} + +static int +rl_vi_overstrike_kill_word (int count, int key) +{ + int r, end; + + end = rl_end; + r = rl_vi_unix_word_rubout (count, key); + vi_replace_count -= end - rl_end; + return r; +} + +static int +rl_vi_overstrike_yank (int count, int key) +{ + int r, end; + + end = rl_end; + r = rl_yank (count, key); + vi_replace_count += rl_end - end; + return r; +} + +/* Read bracketed paste mode pasted text and insert it in overwrite mode */ +static int +rl_vi_overstrike_bracketed_paste (int count, int key) +{ + int r; + char *pbuf; + size_t pblen; + + pbuf = _rl_bracketed_text (&pblen); + if (pblen == 0) + { + xfree (pbuf); + return 0; + } + r = pblen; + while (--r >= 0) + _rl_unget_char ((unsigned char)pbuf[r]); + xfree (pbuf); + + while (_rl_pushed_input_available ()) + { + key = rl_read_key (); + r = rl_vi_overstrike (1, key); + } + + return r; +} + +int +rl_vi_replace (int count, int key) +{ + int i; + + vi_replace_count = 0; + + if (vi_replace_map == 0) + { + vi_replace_map = rl_make_bare_keymap (); + + for (i = 0; i < ' '; i++) + if (vi_insertion_keymap[i].type == ISFUNC) + vi_replace_map[i].function = vi_insertion_keymap[i].function; + + for (i = ' '; i < KEYMAP_SIZE; i++) + vi_replace_map[i].function = rl_vi_overstrike; + + vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete; + + /* Make sure these are what we want. */ + 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; + + /* Same for ^U and unix-line-discard. */ + if (vi_insertion_keymap[CTRL ('U')].type == ISFUNC && + vi_insertion_keymap[CTRL ('U')].function == rl_unix_line_discard) + vi_replace_map[CTRL ('U')].function = rl_vi_overstrike_kill_line; + + /* And for ^W and unix-word-rubout. */ + if (vi_insertion_keymap[CTRL ('W')].type == ISFUNC && + vi_insertion_keymap[CTRL ('W')].function == rl_vi_unix_word_rubout) + vi_replace_map[CTRL ('W')].function = rl_vi_overstrike_kill_word; + + /* And finally for ^Y and yank. */ + if (vi_insertion_keymap[CTRL ('Y')].type == ISFUNC && + vi_insertion_keymap[CTRL ('Y')].function == rl_yank) + vi_replace_map[CTRL ('Y')].function = rl_vi_overstrike_yank; + + /* Make sure this is the value we need. */ + vi_replace_map[ANYOTHERKEY].type = ISFUNC; + vi_replace_map[ANYOTHERKEY].function = (rl_command_func_t *)NULL; + } + + rl_vi_start_inserting (key, 1, rl_arg_sign); + + _rl_vi_last_key_before_insert = 'R'; /* in case someone rebinds it */ + _rl_keymap = vi_replace_map; + + if (_rl_enable_bracketed_paste) + rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_vi_overstrike_bracketed_paste); + + 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 (void) +{ + 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_vi_advance_point (); + } + else if (rl_line_buffer[rl_point - 1] == ';') + { + rl_ding (); + return (0); + } + + rl_possible_completions (); + rl_point = save_pos; + + return (0); +} +#endif + +/* Functions to save and restore marks. */ +static int +_rl_vi_set_mark (void) +{ + int ch; + + RL_SETSTATE(RL_STATE_MOREINPUT); + ch = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); + return 1; + } + ch -= 'a'; + vi_mark_chars[ch] = rl_point; + return 0; +} + +#if defined (READLINE_CALLBACKS) +static int +_rl_vi_callback_set_mark (_rl_callback_generic_arg *data) +{ + _rl_callback_func = 0; + _rl_want_redisplay = 1; + + return (_rl_vi_set_mark ()); +} +#endif + +int +rl_vi_set_mark (int count, int key) +{ +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_callback_data = 0; + _rl_callback_func = _rl_vi_callback_set_mark; + return (0); + } +#endif + + return (_rl_vi_set_mark ()); +} + +static int +_rl_vi_goto_mark (void) +{ + int ch; + + RL_SETSTATE(RL_STATE_MOREINPUT); + ch = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (ch == '`') + { + rl_point = rl_mark; + _rl_fix_point (1); + return 0; + } + else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); + return 1; + } + + ch -= 'a'; + if (vi_mark_chars[ch] == -1) + { + rl_ding (); + return 1; + } + rl_point = vi_mark_chars[ch]; + _rl_fix_point (1); + return 0; +} + +#if defined (READLINE_CALLBACKS) +static int +_rl_vi_callback_goto_mark (_rl_callback_generic_arg *data) +{ + _rl_callback_func = 0; + _rl_want_redisplay = 1; + + return (_rl_vi_goto_mark ()); +} +#endif + +int +rl_vi_goto_mark (int count, int key) +{ +#if defined (READLINE_CALLBACKS) + if (RL_ISSTATE (RL_STATE_CALLBACK)) + { + _rl_callback_data = 0; + _rl_callback_func = _rl_vi_callback_goto_mark; + return (0); + } +#endif + + return (_rl_vi_goto_mark ()); +} +#endif /* VI_MODE */ diff --git a/xfree.c b/xfree.c new file mode 100644 index 0000000..c199b29 --- /dev/null +++ b/xfree.c @@ -0,0 +1,49 @@ +/* xfree.c -- safe version of free that ignores attempts to free NUL */ + +/* Copyright (C) 1991-2010,2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Memory Deallocation. */ +/* */ +/* **************************************************************** */ + +/* Use this as the function to call when adding unwind protects so we + don't need to know what free() returns. */ +void +xfree (PTR_T string) +{ + if (string) + free (string); +} diff --git a/xmalloc.c b/xmalloc.c new file mode 100644 index 0000000..5d01d75 --- /dev/null +++ b/xmalloc.c @@ -0,0 +1,75 @@ +/* xmalloc.c -- safe versions of malloc and realloc */ + +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Memory Allocation and Deallocation. */ +/* */ +/* **************************************************************** */ + +static void +memory_error_and_abort (char *fname) +{ + fprintf (stderr, "%s: out of virtual memory\n", fname); + exit (2); +} + +/* Return a pointer to free()able block of memory large enough + to hold BYTES number of bytes. If the memory cannot be allocated, + print an error message and abort. */ +PTR_T +xmalloc (size_t bytes) +{ + PTR_T temp; + + temp = malloc (bytes); + if (temp == 0) + memory_error_and_abort ("xmalloc"); + return (temp); +} + +PTR_T +xrealloc (PTR_T pointer, size_t bytes) +{ + PTR_T temp; + + temp = pointer ? realloc (pointer, bytes) : malloc (bytes); + + if (temp == 0) + memory_error_and_abort ("xrealloc"); + return (temp); +} diff --git a/xmalloc.h b/xmalloc.h new file mode 100644 index 0000000..0fb9df9 --- /dev/null +++ b/xmalloc.h @@ -0,0 +1,45 @@ +/* xmalloc.h -- memory allocation that aborts on errors. */ + +/* Copyright (C) 1999-2009,2010-2021 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library (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 3 of the License, 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. If not, see . +*/ + +#if !defined (_XMALLOC_H_) +#define _XMALLOC_H_ + +#if defined (READLINE_LIBRARY) +# include "rlstdc.h" +#else +# include +#endif + +#ifndef PTR_T + +#ifdef __STDC__ +# define PTR_T void * +#else +# define PTR_T char * +#endif + +#endif /* !PTR_T */ + +extern PTR_T xmalloc (size_t); +extern PTR_T xrealloc (void *, size_t); +extern void xfree (void *); + +#endif /* _XMALLOC_H_ */ -- cgit v1.2.3
    ' . + &t2h_anchor('', $href, $entry) . + '  ' . + $descr . + "
    ' . + $entry . + '' . $descr . + "